7

FragmentStatePagerAdapter と ViewPager を使用して 4 つのタブを持つアプリを作成しようとしています。

最初にアプリを実行し、タブを順番に (0 から 3 に) 選択するとすべてがうまくいき、その後 (3 から 0) に戻る方法を実行しようとすると、タブ 1 に空白の画面が表示されます。タブ2を選択すると、同様に空白になります。タブ0に移動して、タブ2を元に戻し、タブ1を元に戻すこともありますが、シーケンスがわかりません...

私はそれが混乱していることを知っています...問題は、タブ1が失敗するために使用され、タブ2が時々失敗し、タブ0と3が常に正常に動作することです。フラグメントの位置を交換すると、すべて同じですが、フラグメントコードとは関係ないと思われるものもあります...

logcat にエラーは表示されません。フラグメントをデバッグすると、すべてが正常に行われていることがわかります...

私は何日か運が悪かったので修正しようとしました(明らかに...)、getItemPosition()をオーバーライドしてPOSITION_NONEを返そうとしました、ここのように自分のFragmentStatePagerAdapterを作成しようとしました.net.nz/blog/2014/02/20/a-bug-in-and-a-fix-for-the-way-fragmentstatepageradapter-handles-fragment-restoration/ しかし何も...私にはうまくいきませんでした。

いくつかのコード: メイン クラス

 public class Main extends FragmentActivity implements ActionBar.TabListener {
        private MyPageAdapter mPagerAdapter;
        private ViewPager mPager;

    @Override
    protected void onCreate(Bundle si) {
        super.onCreate(si);
        setContentView(R.layout.activity_main);
        init();
    }

        private void init() {
        final ActionBar actionBar = getActionBar();
        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

        if (mPagerAdapter == null) {

            mPagerAdapter = new PaginaAdapter(getSupportFragmentManager());

            mPager = (ViewPager) findViewById(R.id.pager);
            mPager.setAdapter(mPagerAdapter);
            mPager.requestTransparentRegion(mPager);


            mPager.setOnPageChangeListener(new viewPager.SimpleOnPageChangeListener() {
                @Override
                public void onPageSelected(int position) {
                    actionBar.setSelectedNavigationItem(position);
                }
            });

            // Tab creation
            for (int i = 0; i < mPagerAdapter.getCount(); i++) {
                View tabView = getLayoutInflater().inflate(R.layout.tab, null);
                ((ImageView) tabView.findViewById(R.id.tabIcon))
                .setImageDrawable(getResources().getDrawable(mPagerAdapter.getIcon(i)));

                           actionBar.addTab(actionBar.newTab().setCustomView(tabView).setTabListener(this));
            }

        }

    }

        @Override
    public void onTabReselected(Tab tab, FragmentTransaction ft) {

    }

    @Override
    public void onTabSelected(Tab tab, FragmentTransaction ft) {
        mPager.setCurrentItem(tab.getPosition());
    }

    @Override
    public void onTabUnselected(Tab tab, FragmentTransaction ft) {

    }

アダプタ

public class MyPageAdapter extends FragmentStatePagerAdapter {
     public MyPageAdapter(FragmentManager fm) {
          super(fm);
     }

     @Override
     public Fragment getItem(int position) {

        Fragment fragment = null;

        switch (position) {
        case 0:
            fragment = new InitFragment();
            break;
        case 1:
            fragment = new MusicFragment();
            break;
        case 2:
            fragment = new VideoFragment();
            break;
        case 3:
            fragment = new PicFragment();
            break;
        }

        return fragment;
     }

        @Override
    public int getCount() {
        return 4;
    }

....

}

ありがとう。

更新:私のフラグメントは分離されたクラスにあり、それらは静的ではありません。それは重要ですか? 私が気付いたもう1つのことは、タブに触れた後にフラグメントを破壊しているように見えることです.ゆっくりスワイプするとフラグメントが表示されますが、突然すべてが消えます.

4

2 に答える 2

0

FragmentPagerAdapterの代わりに使用することをお勧めしますFragmentStatePagerAdapterTabs3とfor eachのみが必要なようですがFragment、メモリを大量に消費するようには聞こえません (Bitmapsなどでいっぱいでない限り)。使用するときは、再ロードされたときにFragmentStatePagerAdapterそれぞれの状態を復元する責任があり、システムは階層を保持します。これはあなたが望むものです。FragmentFragmentPagerAdapterView

于 2014-05-27T12:07:12.517 に答える