【问题标题】:Replacing a Fragment/Tab in a Viewpager替换 Viewpager 中的片段/选项卡
【发布时间】:2012-04-16 09:32:53
【问题描述】:

我目前正在尝试为我未来的应用程序制作框架。我真的很喜欢 ActionBar 和 ViewPager,但错过了一个功能。我需要在运行时替换 Fragment/Tab。

使用官方的 example,我希望看到类似 replaceTab() 的东西,但无论我做什么,Fragment 本身都不会更新。

【问题讨论】:

    标签: android android-fragments fragment android-viewpager


    【解决方案1】:

    您必须使用 FragmentPagerAdapter 来处理您的片段更改。有 3 件重要的事情:

    • 如果前一个片段存在,则删除它。

    • 调用 notifyDataSetChanged() 刷新页面列表。

    • 如果请求旧片段,则在 getItemPosition 中返回 POSITION_NONE。

    这是我用于左右页面的代码。我会根据用户的操作动态更改片段。

    public class MyPager extends ViewPager {
    
        private MyPagerAdapter mMyPagerAdapter;
    
        public MyPager(Context context, FragmentActivity activity) {
            super(context);
    
            mMyPagerAdapter = new MyPagerAdapter(activity.getSupportFragmentManager());
            setAdapter(mMyPagerAdapter);
    
        }
        public void replaceLeftFragment(Fragment fragment) {
            mMyPagerAdapter.replaceLeftFragment(fragment);
        }
        public void replaceRightFragment(Fragment fragment) {
            mMyPagerAdapter.replaceRightFragment(fragment);
        }
    }
    
    public class MyPagerAdapter extends FragmentPagerAdapter {
    
        private FragmentManager mFragmentManager;
        private Fragment mLeftFragment;
        private Fragment mRightFragment;
    
        public MyPagerAdapter(FragmentManager fm) {
            super(fm);
            mFragmentManager = fm;
        }
    
        @Override
        public Fragment getItem(int position) {
            if (position == 0) {
                return mLeftFragment;
            } else {
                return mRightFragment;
            }
        }
    
        @Override
        public int getCount() {
            final int nbLeft = (mLeftFragment == null) ? 0 : 1;
            final int nbRight = (mRightFragment == null) ? 0 : 1;
            return (nbLeft + nbRight);
        }
    
        public void replaceLeftFragment(Fragment fragment) {
            if (mLeftFragment != null) {
                mFragmentManager.beginTransaction().remove(mLeftFragment).commit();
            }
            mLeftFragment = fragment;
            notifyDataSetChanged();
        }
        public void replaceRightFragment(Fragment fragment) {
            if (mRightFragment != null) {
                mFragmentManager.beginTransaction().remove(mRightFragment).commit();
            }
            mRightFragment = fragment;
            notifyDataSetChanged();
        }
    
        @Override
        public int getItemPosition(Object object) {
            if ((object!=mLeftFragment) && (object!=mRightFragment)) {
                return POSITION_NONE;
            }
            return super.getItemPosition(object);
        }
    
    }
    

    【讨论】:

      【解决方案2】:

      你试试:

      fragmentTransaction.remove(yourframent);
      

      然后:

      fragmentTransaction.add(yournewfragment);
      

      【讨论】:

        【解决方案3】:

        如果您的 Fragment 是从布局文件创建的,则无法在运行时替换它。您只能成功替换您以编程方式添加的片段。见Android: can't replace one fragment with another

        【讨论】:

          【解决方案4】:

          非常接近您想要的,我需要将片段(最后)添加到 ViewPager,然后这样做:

              FragmentTransaction ft = fragmentManager.beginTransaction();
              new_fragment = Fragment.instantiate(activity, class_name, args);
          
              // The below code removes old fragment and adds the new one at the end.
              ft.attach(new_fragment);              // <- this adds the fragment at the end
              ft.detach(old_fragment);              // <- this removes old fragment
          
              // This should be what you're looking for when adding to an Activity instead of a ViewPager
              ft.replace(view_id, new_fragment);    // <- this is supposed to replace the fragment attached to view_id
          
              // Or if the replace does not work, this might work:
              ft.detach(old_fragment);
              ft.add(view_id, new_fragment);
          
              // Not to be forgotten: ;)
              ft.commit();
          

          上面的代码可能需要一些调整,也许只需要replace调用才能有效工作?

          如果替换调用失败,您仍然可以分离所有片段并按所需顺序重新附加它们。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-12-24
            • 1970-01-01
            相关资源
            最近更新 更多