Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/201.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 替换Viewpager中的片段/选项卡_Android_Android Fragments_Fragment_Android Viewpager - Fatal编程技术网

Android 替换Viewpager中的片段/选项卡

Android 替换Viewpager中的片段/选项卡,android,android-fragments,fragment,android-viewpager,Android,Android Fragments,Fragment,Android Viewpager,我目前正在尝试为我未来的应用程序制作框架。我真的很喜欢ActionBar和ViewPager,但是错过了一个功能。我需要在运行时替换片段/选项卡 使用Official,我希望看到类似replaceTab()的内容,但无论我做什么,片段本身都不会更新。是否尝试: fragmentTransaction.remove(yourframent); 然后: fragmentTransaction.add(yournewfragment); 如果您的片段是从布局文件创建的,则无法在运行时替换它。只能成

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

使用Official,我希望看到类似replaceTab()的内容,但无论我做什么,片段本身都不会更新。

是否尝试:

fragmentTransaction.remove(yourframent);
然后:

fragmentTransaction.add(yournewfragment);

如果您的
片段
是从布局文件创建的,则无法在运行时替换它。只能成功替换以编程方式添加的片段。请参见

非常接近您想要的内容,我需要将片段(在末尾)添加到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();
FragmentTransaction ft=fragmentManager.beginTransaction();
new_fragment=fragment.instantiate(活动、类名称、参数);
//下面的代码删除旧片段,并在末尾添加新片段。

ft.attach(新的_碎片);// 您必须使用FragmentPagerAdapter来处理片段更改。有三件重要的事情:

  • 如果前面的片段存在,请将其删除

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

  • 如果请求旧片段,则返回getItemPosition中的位置\u 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);
    }

}