6

3 つのビューを含む ViewPager を作成しています。最初のビューは ListView で、onItemClick はそのフラグメントの新しいフラグメントをその中の WebView に置き換えます。「transaction.addToBackStack(null)」または「transaction.setCustomAnimations(...)」を追加すると、WebView のフラグメントが表示されなくなります。これらの行がないと表示されますが、BACKボタンでリストに戻ることはできません。

そのチュートリアルこの SO questionに基づいてコードを作成していました。その質問では PagerAdapter が使用されており、私は FragmentPagerAdapter を使用しています。また、これ以上フラグメントを置き換える必要はありません。これは 1 回だけです (リストから webView へ、およびその逆)。

これが私のアダプターのコードです:

public Fragment getItem( int position )
{
    Fragment fragment = null;
    switch ( position )
    {
        case 0: // news
            if ( mFragmentAtPos0 == null )
            {
                mFragmentAtPos0 = new NewsListFragment( new FirstPageFragmentListener()
                {
                    @Override
                    public void onSwitchToNewsFragment( String url, ViewGroup container )
                    {
                        FragmentTransaction transaction = fm.beginTransaction();
                        transaction.setCustomAnimations( R.anim.rotate_in, R.anim.rotate_out, R.anim.rotate_in, R.anim.rotate_out );

                        WebViewFragment wv = new WebViewFragment( url, context );
                        transaction.replace( container.getId(), wv );
                        transaction.commit();

                        mFragmentAtPos0 = wv;
                        notifyDataSetChanged();
                    }
                } );
            }
            fragment = mFragmentAtPos0;
            break;
        case 1: 
            fragment = new NewsInfoFragment( context, true );
            break;
        case 2: 
            fragment = new NewsInfoFragment( context, false );
            break;
    }
    return fragment;
}

そのリストのフラグメントの onCreateView() からのスニペット:

listView.setOnItemClickListener( new OnItemClickListener()
    {
        @Override
        public void onItemClick( AdapterView<?> parent, View view, int position, long id )
        {
            if ( position < listNewsAdapter.getCount() - 1 )
            {
                if ( listener != null )
                {
                    listener.onSwitchToNewsFragment( listNewsAdapter.getItem( position ).getNewsUrl(), container );
                }
            }
        }
    } );
4

2 に答える 2

2

上記の質問に対する私の新しい回答を確認してください: https://stackoverflow.com/a/11974777/685292

addToBackStack(null)はViewPagerフラグメントでは機能しないため、独自にViewPagerを使用して単純なバック スタッキングを実装する方法の例を確認できます。また、問題に関する主な問題は、おそらくgetItemId(int position)オーバーライドされたメソッドが欠落していることに注意してください。

于 2012-08-15T18:29:28.323 に答える
1

新しいデザイン サポート ライブラリでは、このソリューション
を使用します。スタックを使用して、スタック内の位置をプッシュし、スタック内のポップを使用して戻すことで、タブ位置を格納できます。

ビューページャーに 3 つのフラグメントがあるメイン アクティビティで、スタックを作成し、データをプッシュおよびポップします。

private Stack<Integer> stackkk;
private ViewPager mPager;
private int tabPosition = 0;



    mTabLayout.setupWithViewPager(mPager);
    mPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(mTabLayout));
    mTabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
        @Override
        public void onTabSelected(TabLayout.Tab tab) {
            tabPosition = tab.getPosition();
            mPager.setCurrentItem(tab.getPosition());

            if (stackkk.empty())
                stackkk.push(0);

            if (stackkk.contains(tabPosition)) {
                stackkk.remove(stackkk.indexOf(tabPosition));
                stackkk.push(tabPosition);
            } else {
                stackkk.push(tabPosition);
            }
        }

        @Override
        public void onTabUnselected(TabLayout.Tab tab) {
            tabPositionUnselected = tab.getPosition();
        }

        @Override
        public void onTabReselected(TabLayout.Tab tab) {
        }
    });
}

onBackPressed in アクティビティでは、

@Override
public void onBackPressed() {
    if (stackkk.size() > 1) {
        stackkk.pop();
        mPager.setCurrentItem(stackkk.lastElement());
    } else {
//do wat you want
    }
}

これが役立つことを願っています

于 2015-10-09T01:37:13.780 に答える