15

まず第一に、私は Android を初めて使用します。この質問はばかげているように思えるかもしれません :)

ViewPager を含むメイン アクティビティを作成しました。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()」メソッドは常に最初にスーパー クラスのメソッドを呼び出す必要があることも読んだので、それに応じてメソッドを実装しました。

私の問題を解決する方法を知っている人はいますか? メインのアクティビティが再作成されたときにViewPagerに正しいタブ/フラグメントを表示させる方法は?

4

3 に答える 3

13

She Smileに感謝します。あなたの提案は、問題の原因を見つけるのに役立ったので、問題を解決するのに役立ちました。

アクティビティが完全に破棄されて再作成された場合にonCreate()のみ、パラメータを持つことができたようです。私の場合、Activity はまだ存在していたので、パラメーターsavedInstanceStateはありません。savedInstanceState私の「修正」は、選択したタブのインデックスを含む静的 int を作成することでした。この変数はアクティビティのすべてのインスタンスで共有されるため、これは最善の解決策ではないかもしれませんが、私の状況ではアクティビティのインスタンスが 1 つしかないため、問題ないはずです。

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);
    }
}
于 2013-01-30T12:51:47.003 に答える
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);
}
于 2013-01-30T02:39:53.300 に答える
1

onRestoreInstanceState() メソッドは、復元元の Bundle オブジェクトがある場合、つまり NOT NULL の場合にのみ呼び出されます。それ以外の場合、restore メソッドは呼び出されません。

于 2016-06-25T17:59:57.547 に答える