Android 替换表格布局中的片段

Android 替换表格布局中的片段,android,android-fragments,Android,Android Fragments,我试图用一个新的片段替换我的表格布局中的片段,但是我所看到的所有地方都使用: Fragment newFragment = new UserProfileFragment(); FragmentTransaction transaction = getFragmentManager().beginTransaction(); transaction.replace(R.id.fragment_con

我试图用一个新的
片段
替换我的
表格布局中的片段,但是我所看到的所有地方都使用:

                Fragment newFragment = new UserProfileFragment();
                FragmentTransaction transaction = getFragmentManager().beginTransaction();

                transaction.replace(R.id.fragment_container, newFragment);
                transaction.addToBackStack(null);

                transaction.commit();
但是,由于我使用的是
tablayout
viewpager
,因此我没有类似于
R.id.fragment\u容器的内容。下面是我的活动,片段也附在上面

    @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_user_home);


        userHomeToolbar = (Toolbar) findViewById(R.id.userHomeTabView);
        setSupportActionBar(userHomeToolbar);

        viewPager = (ViewPager) findViewById(R.id.viewpager);
        setupViewPager(viewPager);

        tabLayout = (TabLayout) findViewById(R.id.tabs);
        tabLayout.setupWithViewPager(viewPager);

    }

    private void setupViewPager(ViewPager viewPager) {
        ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());
        adapter.addFragment(new UserProfileFragment(), "Home");
        adapter.addFragment(new FootballGroundFragment(), "Grounds");
        adapter.addFragment(new UserSettingsFragment(), "Friends");

        viewPager.setAdapter(adapter);
    }

    public void onFragmentInteraction(Uri uri){
        //you can leave it empty
    }

    class ViewPagerAdapter extends FragmentPagerAdapter {
        private final List<Fragment> mFragmentList = new ArrayList<>();
        private final List<String> mFragmentTitleList = new ArrayList<>();

        public ViewPagerAdapter(FragmentManager manager) {
            super(manager);
        }

        @Override
        public Fragment getItem(int position) {
            return mFragmentList.get(position);
        }

        @Override
        public int getCount() {
            return mFragmentList.size();
        }

        public void addFragment(Fragment fragment, String title) {
            mFragmentList.add(fragment);
            mFragmentTitleList.add(title);
        }

        @Override
        public CharSequence getPageTitle(int position) {
            return mFragmentTitleList.get(position);
        }
    }
@覆盖
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u user\u home);
userHomeToolbar=(Toolbar)findViewById(R.id.userHomeTabView);
设置支持操作栏(用户主页工具栏);
viewPager=(viewPager)findViewById(R.id.viewPager);
设置viewPager(viewPager);
tabLayout=(tabLayout)findViewById(R.id.tabs);
tabLayout.setupWithViewPager(viewPager);
}
专用无效设置ViewPager(ViewPager ViewPager){
ViewPagerAdapter适配器=新的ViewPagerAdapter(getSupportFragmentManager());
addFragment(新的UserProfileFragment(),“Home”);
adapter.addFragment(新的FootballGroundFragment(),“Grounds”);
addFragment(新的UserSettingsFragment(),“Friends”);
viewPager.setAdapter(适配器);
}
公共void onFragmentInteraction(Uri){
//你可以让它空着
}
类ViewPagerAdapter扩展了FragmentPagerAdapter{
私有最终列表MFFragmentList=new ArrayList();
私有最终列表MFFragmentTitleList=new ArrayList();
公共视图页面编辑器(碎片管理器){
高级经理;
}
@凌驾
公共片段getItem(int位置){
返回MFFragmentList.get(位置);
}
@凌驾
public int getCount(){
返回MFFragmentList.size();
}
public void addFragment(片段片段,字符串标题){
添加(片段);
MFFragmentTitleList.add(标题);
}
@凌驾
公共字符序列getPageTitle(int位置){
返回MFFragmentTitleList.get(位置);
}
}

您可以在片段中创建一个容器,以便包含多个片段。为此,您可以在xml中使用片段标记框架布局

有些人喜欢这样

<FrameLayout
android:id="@+id/frame_container"
android:layout_width="match_parent"
android:layout_height="match_parent"/>

您的情况是替换viewpager中的片段,有很多很好的解决方案,请检查:

(一)

2) 以下是一个很好的教程:

默认情况下,当没有与给定位置关联的片段时,FragmentPagerAdapter调用getItem()方法。因此,当您在该位置更改片段时,它不会更新。因此,一种可能的解决方案是明确地从片段管理器中删除该位置的旧片段,以便下次为该位置添加新片段

可以这样做:

重写ViewPagerAdapter类中的InstanceItem()方法

    @Override
    public Object instantiateItem(@NonNull ViewGroup container, int position) {
        Fragment currentFragment = (Fragment) super.instantiateItem(container, position);
        Fragment actualFragment = getItem(position);

        if (actualFragment != currentFragment) {
            // Remove the old fragment
            FragmentTransaction transaction = fragmentManager.beginTransaction();
            transaction.remove(currentFragment);
            transaction.commitNow();

            // The super class method takes care of adding the new fragment
            currentFragment = (Fragment) super.instantiateItem(container, position);
        }

        return currentFragment;
    }

然后在你想要更改的片段中,在布局中创建一个容器,并在其中膨胀两个片段。我该怎么做?你可以将导航抽屉作为容器的参考。对不起,我不明白你的意思。我添加了一个示例作为答案。试一下,可能会有所帮助
    @Override
    public Object instantiateItem(@NonNull ViewGroup container, int position) {
        Fragment currentFragment = (Fragment) super.instantiateItem(container, position);
        Fragment actualFragment = getItem(position);

        if (actualFragment != currentFragment) {
            // Remove the old fragment
            FragmentTransaction transaction = fragmentManager.beginTransaction();
            transaction.remove(currentFragment);
            transaction.commitNow();

            // The super class method takes care of adding the new fragment
            currentFragment = (Fragment) super.instantiateItem(container, position);
        }

        return currentFragment;
    }