2

ViewPager には、Tab0、Tab1、Tab2 のインスタンスの 3 つのページがあります。メインのアクティビティでは、各タブのインスタンスを SectionsPagerAdapter の getItem() 関数から別の変数に格納しています。

ViewPager は常に現在のタブ、その左側のタブ、およびその右側のタブを初期化すると仮定します。

これらは私のインスタンスです:Tab0 t0; Tab1 t1; Tab2 t2;

アプリは最初は正常に動作します。しかし、ホームボタンを押して(トリガーするonPause()ために)、タスクキラーからアプリを強制終了し(またはAndroid自体がそれを強制終了したと仮定して)、アプリを再度開くと、nullPointerExceptionsが発生するonPageSelectedためt0, t1 and t2、nullになります。

これは私の onCreate メソッドです:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

            mSectionsPagerAdapter = new SectionsPagerAdapter(
                    getSupportFragmentManager());

            // Set up the ViewPager with the sections adapter.
            mViewPager = (ViewPager) findViewById(R.id.pager);
            mViewPager.setAdapter(mSectionsPagerAdapter);
            mViewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {

                @Override
                public void onPageSelected(int pos) {

                    switch(pos){
                    case 1:
                       t1.lookup()
                        break;
                    case 0:

                    t0.doSomething();

                        break;
                    case 2:
                            t2.someThingElse();
                        break;

                    }

                }

                @Override
                public void onPageScrolled(int arg0, float arg1, int arg2) {

                }

                @Override
                public void onPageScrollStateChanged(int arg0) {


                }
            });


    mViewPager.setCurrentItem(1,true);
}

これは私の FragmentPagerAdapter です (これはアクティビティ内のネストされたクラスです):

public class SectionsPagerAdapter extends FragmentPagerAdapter {

    public SectionsPagerAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int position) {
        // getItem is called to instantiate the fragment for the given page.
        // Return a DummySectionFragment (defined as a static inner class
        // below) with the page number as its lone argument.
        Fragment fragment;

        switch(position){
        case 0:
            fragment = t0 = new Tab0();
            break;
        case 1:
            fragment = t1 = new Tab1();         
            break;
        case 2:
            fragment = t2 = new Tab2();
            break;

            default:
                fragment=null;
        }


        Bundle args = new Bundle();
        args.putInt(ARG_SECTION_NUMBER, position + 1);
        if(fragment!=null)
            fragment.setArguments(args);
        return fragment;
    }

    @Override
    public int getCount() {
        // Show 3 total pages.
        return 3;
    }

    @Override
    public CharSequence getPageTitle(int position) {
        Locale l = Locale.getDefault();
        switch (position) {
        case 1:
            return getString(R.string.T1).toUpperCase(l);
        case 0:
            return getString(R.string.T0).toUpperCase(l);
        case 2:
            return getString(R.string.T2).toUpperCase(l);
        }
        return null;
    }
}
4

1 に答える 1

1

ドキュメントから: ユーザーがアクセスする各ページのフラグメントはメモリに保持されますが、そのビュー階層は非表示のときに破棄される可能性があります。つまり、戻ってきたときにフラグメントが再作成されますが、元のフラグメントではありません (したがって、t* 変数が失われます)。saveState メソッドと restoreState メソッドをオーバーライドして、t* 変数を設定するためのロジックを追加できるかどうかを確認します。おそらくフラグメント内の他の on* メソッドのいずれかにない場合。

于 2013-03-11T17:20:16.943 に答える