Android - 在ViewPager中替换Fragment时的返回栈

6
我正在创建一个ViewPager,其中包含三个视图。第一个视图是一个ListView,当onItemClick时,它会用一个包含WebView的新片段替换该片段。我有两个问题:当添加'transaction.addToBackStack(null)'或'transaction.setCustomAnimations(...)'时,带有WebView的片段停止显示。没有这些行,它可以显示,但是我无法使用BACK按钮返回列表。

我基于这个教程这个SO问题创建代码。在那个问题中,使用了PagerAdapter,而我正在使用FragmentPagerAdapter。此外,我不需要更多要被替换的片段。它只能发生一次(从列表到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 );
                }
            }
        }
    } );
2个回答

2

请查看我对提到的问题的新回答:https://dev59.com/H2sz5IYBdhLWcg3wsaAN#11974777

在那里,您可以看到如何通过自己实现简单的后退堆栈与 ViewPager,因为addToBackStack(null)不适用于ViewPager片段。同时请注意,您的问题的主要问题可能是缺少重写的getItemId(int position)方法。


1
在新的设计支持库中,我使用了这种解决方案。 您可以使用栈来存储选项卡位置,通过将位置推入栈中并使用栈中的pop获取其返回值。
在主活动中,其中有3个片段在viewpager中,我创建了一个栈,并推送和弹出数据。
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方法中,
@Override
public void onBackPressed() {
    if (stackkk.size() > 1) {
        stackkk.pop();
        mPager.setCurrentItem(stackkk.lastElement());
    } else {
//do wat you want
    }
}

希望这可以帮助到您。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接