onCreate方法中的Android backstack为null

时间:2015-05-20 20:16:15

标签: java android android-fragments fragment-backstack

我在主Activity中有两个片段(第一个片段,第二个片段)。我将第一个片段替换为主要活动的onCreate方法中的容器视图。

在第二个片段中有ListView,当点击其上的项目时,新的活动将作为详细信息开始。

但是当我回到主Activity时,第一个片段显示是因为它处于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方法中返回堆栈值?

我的屏幕 Screens

2 个答案:

答案 0 :(得分:1)

在重新启动活动时,为了保留Fragment Stack,您不需要做太多事情。你的片段堆栈将存储在第一个活动的SavedInstanceState Bundle中。您需要做的是,当用户点击后退按钮时,您需要检查活动的savedInstanceStateonCreate是否为空。如果它是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);
    }
}

答案 1 :(得分:1)

我找到了解决这个问题的方法。

当按下操作栏中的后退按钮时,返回的活动的onCreate方法被调用并且bundle为null以处理片段。

为了防止这种情况,我在清单文件中将 android:launchMode =&#34; singleTop&#34; 添加到我的父系列。

示例清单用法

<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>