首先,我是Android新手 - 这个问题看起来很愚蠢:)
我创建了一个包含ViewPager的主Activity。 ViewPager链接到我的ActionBar选项卡。目前我的主要活动以这种方式包含3个标签。
我的问题如下:当我在第3个标签页面上创建一个新的活动,然后返回到我的主要活动时,我总是返回到我的第一个标签。
我在我的主要活动中尝试了以下方法:
// 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()`方法应该首先在超类上调用方法,所以我已经相应地实现了这个方法。
任何人都知道如何解决我的问题?如何在重新创建主Activity时让ViewPager显示正确的制表符/片段?
答案 0 :(得分:13)
谢谢她微笑,您的建议帮助我解决了我的问题,因为它帮助我找到问题的根源。
当Activity被完全销毁并重新创建时,显然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);
}
}
答案 1 :(得分: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);
}
答案 2 :(得分:0)
只有在要从中恢复的Bundle对象时才会调用onRestoreInstanceState()方法,即它是非NULL。否则,将不会调用restore方法。