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