Android onCreate 方法中的 backstack 为 null
Android backstack is null in onCreate method
我在主 Activity 中有两个片段(第一个片段,第二个片段)。我在 main activity 的 onCreate
方法中用容器视图替换了第一个片段。
在第二个片段中有一个 ListView
,当点击它上面的一个项目时,一个新的 Activity 作为细节开始。
但是当我回到主界面时 Activity,第一个片段显示是因为 It is in onCreate 事件。
我尝试使用 backstack 就像 backstack 有我的最后一个片段然后显示它一样。但在 onCreate 方法中,返回堆栈始终为空。
这是我的 onCreate
和 replaceFragments 方法代码:
@Override
protected void onCreate(Bundle savedInstanceState) {
Log.d("activity", "on create called");
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
android.support.v4.app.FragmentManager fm = getSupportFragmentManager();
int backStackCount = fm.getBackStackEntryCount();
if (backStackCount > 0){
for (int entry = 0; entry < fm.getBackStackEntryCount(); entry++) {
Log.i("back stack", "Found fragment: " + fm.getBackStackEntryAt(entry).getName());
}
} else {
Log.i("back stack", "backstack count is null");
MainFragment mainFragment = new MainFragment();
replaceFragments(mainFragment);
}
mActionBarMainBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// setButtonsState(mActionMainBtnLineView);
if(mMainFragment == null){
mMainFragment = new MainFragment();
}
replaceFragments(mMainFragment);
}
});
mActionBarTransBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// setButtonsState(mActionTransactionsBtnLineView);
if(mTransactionsFragment == null){
mTransactionsFragment = new TransactionsFragment();
}
replaceFragments(mTransactionsFragment);
}
});
}
public void replaceFragments(Fragment fragment){
android.support.v4.app.FragmentManager fragmentManager = getSupportFragmentManager();
String fragmentName = fragment.getClass().getName();
fragmentManager.beginTransaction()
.replace(R.id.container, fragment, fragmentName)
.addToBackStack(fragmentName)
.commit();
fragmentManager.executePendingTransactions();
if (fragmentName.equals(MainFragment.class.getName())) {
setButtonsState(mActionMainBtnLineView);
} else {
setButtonsState(mActionTransactionsBtnLineView);
}
}
如何在 onCreate
方法中返回来自另一个 activity 的堆栈值?
我的屏幕
当您重新启动 activity 时,您不需要做那么多事情来保持您的 Fragment Stack。您的 Fragment 的 Stack 将存储在 First Activity 的 SavedInstanceState Bundle
中。你需要做的是,当用户点击后退按钮时,你需要检查 Activity 的 onCreate
中的 savedInstanceState
是否为 Null。如果它是 Null 那么你的 Activity 是第一次被创建,如果它不是那么什么都不做。检查下面的代码,看看您应该如何实现它。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout. activity_main);
android.support.v4.app.FragmentManager fm = getSupportFragmentManager();
if (savedInstanceState == null) {
MainFragment mainFragment = new MainFragment();
replaceFragments(mainFragment);
}
}
我找到了这个问题的解决方案。
当按下操作栏中的后退按钮时,返回的activity的onCreate方法被调用并且bundle为null以处理片段。
为了防止这种情况,我将 android:launchMode="singleTop" 添加到清单文件中的父活动中。
清单用法示例
<activity
android:name=".MainActivity"
android:launchMode="singleTop" //Here is what I did.
android:label="@string/app_name"
android:theme="@style/MyWalletTheme"
android:uiOptions="splitActionBarWhenNarrow" >
<meta-data
android:name="android.support.UI_OPTIONS"
android:value="splitActionBarWhenNarrow" />
<intent-filter>
<action android:name="android.intent.action.MAINACTIVITY" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
我在主 Activity 中有两个片段(第一个片段,第二个片段)。我在 main activity 的 onCreate
方法中用容器视图替换了第一个片段。
在第二个片段中有一个 ListView
,当点击它上面的一个项目时,一个新的 Activity 作为细节开始。
但是当我回到主界面时 Activity,第一个片段显示是因为 It is in onCreate 事件。
我尝试使用 backstack 就像 backstack 有我的最后一个片段然后显示它一样。但在 onCreate 方法中,返回堆栈始终为空。
这是我的 onCreate
和 replaceFragments 方法代码:
@Override
protected void onCreate(Bundle savedInstanceState) {
Log.d("activity", "on create called");
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
android.support.v4.app.FragmentManager fm = getSupportFragmentManager();
int backStackCount = fm.getBackStackEntryCount();
if (backStackCount > 0){
for (int entry = 0; entry < fm.getBackStackEntryCount(); entry++) {
Log.i("back stack", "Found fragment: " + fm.getBackStackEntryAt(entry).getName());
}
} else {
Log.i("back stack", "backstack count is null");
MainFragment mainFragment = new MainFragment();
replaceFragments(mainFragment);
}
mActionBarMainBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// setButtonsState(mActionMainBtnLineView);
if(mMainFragment == null){
mMainFragment = new MainFragment();
}
replaceFragments(mMainFragment);
}
});
mActionBarTransBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// setButtonsState(mActionTransactionsBtnLineView);
if(mTransactionsFragment == null){
mTransactionsFragment = new TransactionsFragment();
}
replaceFragments(mTransactionsFragment);
}
});
}
public void replaceFragments(Fragment fragment){
android.support.v4.app.FragmentManager fragmentManager = getSupportFragmentManager();
String fragmentName = fragment.getClass().getName();
fragmentManager.beginTransaction()
.replace(R.id.container, fragment, fragmentName)
.addToBackStack(fragmentName)
.commit();
fragmentManager.executePendingTransactions();
if (fragmentName.equals(MainFragment.class.getName())) {
setButtonsState(mActionMainBtnLineView);
} else {
setButtonsState(mActionTransactionsBtnLineView);
}
}
如何在 onCreate
方法中返回来自另一个 activity 的堆栈值?
我的屏幕
当您重新启动 activity 时,您不需要做那么多事情来保持您的 Fragment Stack。您的 Fragment 的 Stack 将存储在 First Activity 的 SavedInstanceState Bundle
中。你需要做的是,当用户点击后退按钮时,你需要检查 Activity 的 onCreate
中的 savedInstanceState
是否为 Null。如果它是 Null 那么你的 Activity 是第一次被创建,如果它不是那么什么都不做。检查下面的代码,看看您应该如何实现它。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout. activity_main);
android.support.v4.app.FragmentManager fm = getSupportFragmentManager();
if (savedInstanceState == null) {
MainFragment mainFragment = new MainFragment();
replaceFragments(mainFragment);
}
}
我找到了这个问题的解决方案。
当按下操作栏中的后退按钮时,返回的activity的onCreate方法被调用并且bundle为null以处理片段。
为了防止这种情况,我将 android:launchMode="singleTop" 添加到清单文件中的父活动中。
清单用法示例
<activity
android:name=".MainActivity"
android:launchMode="singleTop" //Here is what I did.
android:label="@string/app_name"
android:theme="@style/MyWalletTheme"
android:uiOptions="splitActionBarWhenNarrow" >
<meta-data
android:name="android.support.UI_OPTIONS"
android:value="splitActionBarWhenNarrow" />
<intent-filter>
<action android:name="android.intent.action.MAINACTIVITY" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>