【问题标题】:Android backstack is null in onCreate methodAndroid backstack 在 onCreate 方法中为空
【发布时间】:2015-05-20 20:16:15
【问题描述】:

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

在第二个片段中有一个ListView,当点击它上面的一个项目时,一个新的活动作为一个细节开始。

但是当我回到主 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方法来自另一个活动时,如何取回堆栈值?

我的屏幕

【问题讨论】:

    标签: java android android-fragments fragment-backstack


    【解决方案1】:

    当你重新开始你的活动时,你不需要做那么多事情来保持你的片段堆栈。您的 Fragment 的 Stack 将存储在第一个 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);
        }
    }
    

    【讨论】:

    • 您好 osayilgan,谢谢您的回答。我实现了您的代码,但当我回到活动时,savedInstanceState 始终为空。
    • 当你开始第二个活动时你完成了吗?
    • 我刚刚意识到了什么。当我从 SettingsActivity 回来时,不会调用 onCreate 方法。只需调用 onResume,MainActivty 就会从其最后一个状态继续。
    • 好吧。因此,您可以使用几种不同的场景和方法来处理它。你activity的onCreate没有被调用的原因可以在here找到。
    • 因此,当您想确保应用程序的行为不会因任何原因而改变时,您还需要处理 onResume、onSaveInstanceState 和 onRetainInstanceState。
    【解决方案2】:

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

    在操作栏中按下返回按钮时,返回活动的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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-06
      • 2013-11-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多