savedInstanceState始终为null,但始终调用onSaveInstanceState()

Wol*_*urs 15 android android-activity

首先,我是Android新手 - 这个问题看起来很愚蠢:)

我创建了一个包含ViewPager的主Activity.ViewPager链接到我的ActionBar选项卡.目前我的主要Activity以这种方式包含3个选项卡.

我的问题如下:当我在第3个选项卡上创建一个新的Activity,然后返回到我的主Activity时,我总是返回到我的第一个选项卡.

我在我的主Activity中尝试了以下方法:

// debugger breakpoints tell me this method is always called when other activity is shown ...
@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);

    int pos = getActionBar().getSelectedNavigationIndex();
    outState.putInt("tab", pos);
}

// however, in onCreate() my savedInstanceState is always 'null' ...
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    this.invalidateOptionsMenu();

    setContentView(R.layout.activity_main);

    final ActionBar actionBar = getActionBar();
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

    mSectionsPagerAdapter = new SectionsPagerAdapter(
            getSupportFragmentManager());

    mViewPager = (ViewPager) findViewById(R.id.pager);
    mViewPager.setAdapter(mSectionsPagerAdapter);

    mViewPager
            .setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
                @Override
                public void onPageSelected(int position) {
                    actionBar.setSelectedNavigationItem(position);
                }
            });

    for (int i = 0; i < mSectionsPagerAdapter.getCount(); i++) {
        actionBar.addTab(actionBar.newTab()
                .setText(mSectionsPagerAdapter.getPageTitle(i))
                .setTabListener(this));
    }

    // trying to restore state here, yet savedInstanceState is _always_ null ...
    if (savedInstanceState != null) {
        actionBar.setSelectedNavigationItem(savedInstanceState.getInt("tab", 0));
    }
}
Run Code Online (Sandbox Code Playgroud)

我已经读过,当没有定义id时,savedInstanceState将始终为null.我的XML布局虽然定义了id,但这应该不是问题.我还读过'onSaveInstanceState()`方法应该总是先调用超类上的方法,所以我已经相应地实现了这个方法.

任何人都知道如何解决我的问题?如何在重新创建主Activity时让ViewPager显示正确的选项卡/片段?

Wol*_*urs 13

谢谢她微笑,你的建议帮助我解决了我的问题,因为它帮助我找到问题的根源.

显然onCreate()只有savedInstanceState在完全销毁和重新创建活动时才有参数.在我的情况下,活动仍然存在,因此我将没有savedInstanceState参数.我的"修复"是创建一个包含所选选项卡索引的静态int.我意识到这可能不是最好的解决方案,因为这个变量将在Activity的所有实例中共享,但因为在我的情况下,我的活动中只有一个实例应该没问题.

public class MainActivity extends Activity implements ActionBar.TabListener {
    private static int tabIdx;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        if (savedInstanceState != null) {
            tabIdx = savedInstanceState.getInt("tab", 0);
        }
        getActionBar().setSelectedNavigationItem(tabIdx);
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);

        tabIdx = getActionBar().getSelectedNavigationIndex();
        outState.putInt("tab", tabIdx);
    }
}
Run Code Online (Sandbox Code Playgroud)