替换ViewPager中的Fragment/标签页

6

我目前正在为我的未来应用程序制作框架。我非常喜欢ActionBar和ViewPager,但是缺少一个功能。我需要在运行时替换Fragment/Tab。

使用官方的示例,我希望看到像replaceTab()这样的东西,但是无论我做什么,片段本身都没有更新。

4个回答

2
您需要使用FragmentPagerAdapter来处理片段更改。有三个重要的事情:
  • 如果存在先前的片段,请将其删除。

  • 调用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);
    }

}

1

你试过吗:

fragmentTransaction.remove(yourframent);

然后:

fragmentTransaction.add(yournewfragment);

0

0
非常接近您想要的,我需要将片段(在末尾)添加到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();

上述代码可能需要进行一些调整,也许只需要替换调用才能有效地工作?

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


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