gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 18:46:06 26 4
gpt4 key购买 nike

首先,我是 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));
}
}

我读到过,当没有定义 id 时,savedInstanceState 将始终为 null。虽然我的 XML 布局定义了一个 id,所以这应该不是问题。我还了解到“onSaveInstanceState()”方法应该始终首先调用父类(super class)上的方法,因此我相应地实现了该方法。

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

最佳答案

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

显然 onCreate() 在 Activity 被完全销毁并重新创建时只能有一个 savedInstanceState 参数。在我的例子中,Activity 仍然存在,因此我不会有 savedInstanceState 参数。我的“修复”是创建一个包含所选选项卡索引的静态整数。我意识到这可能不是最好的解决方案,因为这个变量将在 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);
}
}

关于android - savedInstanceState 始终为 null,但始终调用 onSaveInstanceState(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14594833/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com