当前位置: 首页 > 知识库问答 >
问题:

替换ViewPager中的片段时出现Android - Backstack

裴永年
2023-03-14

我正在创建一个包含三个视图的可视寻呼机。第一个视图是ListView,onItemClick用WebView替换了这个片段。而且我有两个问题:当添加' transaction . addtobackstack(null)'或者' transaction . setcustomanimations(...)'片段与WebView stopps一起显示。如果没有这几行,它会显示出来,但我不能按后退按钮返回列表。

我正在根据该教程和这个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个答案

须新
2023-03-14

在新的设计支持库中,我使用了这个解决方案
您可以使用堆栈来存储选项卡,方法是在堆栈中推送位置并使用堆栈中的pop返回。

在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) {
        }
    });
}

在onBackPressed in活动中,

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

希望这会有所帮助

尉迟龙光
2023-03-14

查看我对上述问题的新答案:https://stackoverflow.com/a/11974777/685292

您可以在那里看到一个示例,如何自己使用ViewPager实现简单的反向堆叠,因为addToBackStack(null)不适用于ViewPager片段。另请注意,您的问题的主要问题可能是缺少getItemId(int位置)覆盖方法。

 类似资料:
  • 我有一个活动,它包含一个片段容器(FrameLayout),我在Activity.onCreate()期间在其中放置了一个片段。片段包含一个包含一串片段的ViewPager。所有这些工作都很好。页面内容显示,我可以很好地在页面中滑动,甚至可以看到操作栏中的操作,因为贡献的页面变得可见。 现在我用另一个片段替换包含ViewPager的片段: 此外,我已经用FragmentPagerAdapter替换

  • 我有以下布局 一切正常,但我想用一个片段替换浏览器 这不是重新调整ViewPager的间距,我该怎么办???

  • 我在一个详细视图中使用ViewPager和FragmentPagerAdapter。这意味着我有一个项目列表,一个屏幕显示单个项目的细节。但用户可以左右滑动来浏览所有项目。这遵循了谷歌滑动视图的指导方针。 但是我想知道一件事。在ListView中,每一行的视图都会被重用。一旦一行从屏幕上滚动出来,它就会被重用为绑定到ListView的适配器的getView方法的转换器视图参数。但是这种重用行为似乎

  • MainActivity(扩展了fragmentActivity)有listview,它调用listviewadapter,其中有一个带有ViewpagerAdapter的ViewPager。现在,如果我需要在ViewPager中生成5个片段,如何将getFragmentManager()传递给适配器。 MainActivity[fragmentActivity]---->Listview----

  • > 我在下面的代码中尝试替换新的片段,但是它没有被替换。 Android应用程序。片段管理器片段管理器=((活动)上下文)。getFragmentManager();Android应用程序。FragmentTransaction FragmentTransaction=fragmentManager。beginTransaction();零碎的交易。添加(R.id.frame_容器,菜单项详细信息

  • 我一直在尝试在我的应用程序中动态替换一个片段,但这样做时,我一直会遇到RuntimeException,因为它找不到应该添加片段的容器ID。我尝试过在类似线程上找到的每一个解决方案,从干净的构建到使用ChildFragmentManager,但仍然有相同的错误。最奇怪的是,当我在onCreate中没有指定任何容器时,一切都很顺利,但一旦指定了容器,应用程序就会崩溃。以下是代码和堆栈跟踪: 堆栈跟踪