【问题标题】:Android - Backstack while replacing fragment in ViewPagerAndroid - 在 ViewPager 中替换片段时返回堆栈
【发布时间】:2012-05-23 08:44:34
【问题描述】:

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

我正在基于that tutorial 和this SO question 创建代码。在那个问题中使用了 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() 的 sn-p:

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

【问题讨论】:

    标签: android android-fragments android-viewpager


    【解决方案1】:

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

    你可以看到一个例子,因为 addToBackStack(null) 不适用于 ViewPager > 碎片。另请注意,关于您的问题的主要问题可能是缺少 getItemId(int position) 覆盖方法。

    【讨论】:

      【解决方案2】:

      在新的设计支持库中,我使用了这个解决方案
      您可以使用 stack 来存储 tabpositon,方法是压入 stack 中的位置,然后使用 pop in stack 返回。

      在 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活动中,

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

      希望对你有帮助

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-01-31
        • 1970-01-01
        • 1970-01-01
        • 2016-05-19
        • 2019-07-11
        • 1970-01-01
        • 2011-07-16
        相关资源
        最近更新 更多