savedInstanceState始终为空,但onSaveInstanceState()总是被调用。

15

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

我创建了一个包含 ViewPager 的主 Activity。ViewPager 与我的 ActionBar 标签相关联。目前,我的主 Activity 以这种方式包含了 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));
    }
}

我读到过,如果没有定义id,savedInstanceState将始终为null。我的XML布局有一个定义好的id,所以这不应该是个问题。我也读到过,“onSaveInstanceState()”方法应该始终先调用超类上的方法,因此我已经按照这种方式实现了这个方法。

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

3个回答

13

感谢 She Smile,你的建议帮助我解决了我的问题,因为它帮助我找到了问题的根源。

显然,在我的情况下,当 Activity 未被完全销毁并重新创建时,onCreate() 只能具有一个savedInstanceState 参数。在这种情况下,我将没有savedInstanceState参数。我的“解决”方法是创建一个包含所选标签索引的静态 int。我意识到这可能不是最好的解决方案,因为此变量将在 Activity 的所有实例之间共享,但由于在我的情况下仅会有一个 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);
    }
}

3

所以如果 onSaveInstance 被调用了

你可以为你的全局变量声明一个变量

 int pos=0; 

在 onSaveInstance() 被调用后,下面的方法会被调用:
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
pos=savedInstanceState.getInt("tab", 0);    

所以在你的onCreate()函数中,将条件替换为以下内容:

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

转换为:

if(pos>0){
actionBar.setSelectedNavigationItem(pos);
}

我尝试了你的建议,但是没有任何效果。不知何故,onRestoreInstanceState() 方法从未被调用过。这有意义吗?在我看来,onSaveInstanceState()/onRestoreInstanceState() 方法是某种‘配对’的关系。 - Wolfgang Schreurs

1

只有在存在要恢复的Bundle对象时(即它不为NULL),才会调用onRestoreInstanceState()方法。否则,将不会调用恢复方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接