我正在尝试使用新的Tablayout
替换Fragment
中的片段,但无论我看到的是什么用途:
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_container
这样的内容。下面是我的活动,片段也附加了。
@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);
}
}
答案 0 :(得分:1)
您的情况是替换viewpager中的片段,有很多很好的解决方案,请检查:
1)Replace Fragment inside a ViewPager
或Replace one Fragment with another in ViewPager
或Replace current Fragment in ViewPager on Android
2)这是一个很好的教程: http://www.pineappslab.com/post/fragments-viewpager/
答案 1 :(得分:0)
您可以在要包含多个片段的片段中创建容器。为此,您可以在 xml 中使用片段代码或框架布局。
有些像这样。
<FrameLayout
android:id="@+id/frame_container"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
在您的片段中,您可以使用片段事务对它们进行充气。请注意,在您的片段中,您必须使用 childFragmentManager 。
例如
FragmentManager childFragMan = getChildFragmentManager();
FragmentTransaction childFragTrans = childFragMan.beginTransaction();
ChildFragment fragB = new ChildFragment ();
childFragTrans.add(R.id.FRAGMENT_PLACEHOLDER, fragB);
childFragTrans.addToBackStack("B");
childFragTrans.commit();
答案 2 :(得分:0)
默认情况下,当没有片段与给定位置关联时,FragmentPagerAdapter会调用getItem()方法。因此,当您在该位置更改片段时,它不会被更新。因此,一种可行的解决方案是从片段管理器中明确删除该位置上存在的旧片段,以便下次为该位置添加新片段。
可以这样做:
重写ViewPagerAdapter类中的InstantiateItem()方法。
@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;
}