我正在创建包含三个视图的ViewPager。第一个视图是列表视图,其中 onItemClick 将该片段新片段替换为其中的 WebView。我有两个问题:添加"transaction.addToBackStack(null("或"transaction.setCustomAnimations(...("时具有 Web 视图的片段停止显示。没有这些行,它会显示,但我无法执行"后退"按钮返回列表。
我正在根据该教程和此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 );
}
}
}
} );
查看我对上述问题的新答案:https://stackoverflow.com/a/11974777/685292
您可以看到一个示例,如何自己使用ViewPager实现简单的反向堆栈,因为addToBackStack(null(不适用于ViewPager片段。另请注意,有关您的问题的主要问题可能是缺少getItemId(int位置(覆盖方法。
在新的设计支持库中,我使用此解决方案
您可以使用堆栈来存储选项卡,方法是在堆栈中推送位置,然后在堆栈中使用弹出返回。
在viewpager中有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) {
}
});
}
并在活动中反向按下,
@Override
public void onBackPressed() {
if (stackkk.size() > 1) {
stackkk.pop();
mPager.setCurrentItem(stackkk.lastElement());
} else {
//do wat you want
}
}
希望这可能会有所帮助