Java 在android选项卡中添加片段的最佳方式是什么
我的应用程序有一个底部导航栏,有5个选项卡。 根据这些标签,我有5个片段 当我点击选项卡时,片段根据该选项卡进行了更改。 我可以使用beginTransaction()方法切换片段。替换。。。 我不想每次切换标签时都破坏和重新创建片段,所以我的解决方案是这样的Java 在android选项卡中添加片段的最佳方式是什么,java,android,android-fragments,Java,Android,Android Fragments,我的应用程序有一个底部导航栏,有5个选项卡。 根据这些标签,我有5个片段 当我点击选项卡时,片段根据该选项卡进行了更改。 我可以使用beginTransaction()方法切换片段。替换。。。 我不想每次切换标签时都破坏和重新创建片段,所以我的解决方案是这样的 //I init 5 fragments Fragment1 frag1 = new Fragment1(); Fragment2 frag2 = new Fragment2(); Fragment3 frag3 = new Fragme
//I init 5 fragments
Fragment1 frag1 = new Fragment1();
Fragment2 frag2 = new Fragment2();
Fragment3 frag3 = new Fragment3();
Fragment4 frag4 = new Fragment4();
Fragment5 frag5 = new Fragment5();
//When I click on tab, for example tab1, I hide all fragments except tab1
//hide all fragments
getSupportFragmentManager()
.beginTransaction()
.hide(fragment1) //Fragment2, 3, 4, 5 as well
.commit();
//show fragment 1
getSupportFragmentManager()
.beginTransaction()
.show(fragment1)
.commit();
它工作得很好,但问题是有时两个片段同时显示(我不知道为什么,因为我隐藏了所有片段)
还有别的办法吗?在不破坏片段并再次创建的情况下切换片段。您不必隐藏片段,只需按照以下方法替换片段即可:
public void setFragment(Fragment fragmentWhichYouWantToShow) {
fm = getSupportFragmentManager();
ft = fm.beginTransaction();
ft.replace(R.id.container, fragmentWhichYouWantToShow);
ft.commit();
}您不必隐藏片段,只需按照以下方法替换片段即可:
public void setFragment(Fragment fragmentWhichYouWantToShow) {
fm = getSupportFragmentManager();
ft = fm.beginTransaction();
ft.replace(R.id.container, fragmentWhichYouWantToShow);
ft.commit();
}在这种情况下,使用
ViewPager
和FragmentPagerAdapter
非常适合您
然后使用ViewPager\setOffsetPageLimit(5)
。这将帮助您显示/隐藏片段,而无需重新创建
照此
让我们试试看,然后告诉我你的问题是否解决了 使用
ViewPager
和FragmentPagerAdapter
非常适合这种情况
然后使用ViewPager\setOffsetPageLimit(5)
。这将帮助您显示/隐藏片段,而无需重新创建
照此
让我们试试看,然后告诉我你的问题是否解决了 为了添加片段,我为我的项目编写了这段代码,希望能有所帮助
public static void replaceFragment(Fragment fragment, FragmentManager fragmentManager) {
String backStateName = fragment.getClass().getName();
String fragmentTag = backStateName;
Fragment currentFrag = fragmentManager.findFragmentById(R.id.frame_container);
Log.e("Current Fragment", "" + currentFrag);
// boolean fragmentPopped = fragmentManager.popBackStackImmediate(backStateName, 0);
int countFrag = fragmentManager.getBackStackEntryCount();
Log.e("Count", "" + countFrag);
if (currentFrag != null && currentFrag.getClass().getName().equalsIgnoreCase(fragment.getClass().getName())) {
return;
}
FragmentTransaction ft = fragmentManager.beginTransaction();
// if (!fragmentPopped) {
ft.replace(R.id.frame_container, fragment);
ft.addToBackStack(backStateName);
ft.commit();
// }
currentFrag = fragmentManager.findFragmentById(R.id.frame_container);
Log.e("Current Fragment", "" + currentFrag);
}
希望这将对您有所帮助,并在整个项目中使用此方法来替换片段。对于添加片段,我为我的项目编写了此代码,希望它将对您有所帮助
public static void replaceFragment(Fragment fragment, FragmentManager fragmentManager) {
String backStateName = fragment.getClass().getName();
String fragmentTag = backStateName;
Fragment currentFrag = fragmentManager.findFragmentById(R.id.frame_container);
Log.e("Current Fragment", "" + currentFrag);
// boolean fragmentPopped = fragmentManager.popBackStackImmediate(backStateName, 0);
int countFrag = fragmentManager.getBackStackEntryCount();
Log.e("Count", "" + countFrag);
if (currentFrag != null && currentFrag.getClass().getName().equalsIgnoreCase(fragment.getClass().getName())) {
return;
}
FragmentTransaction ft = fragmentManager.beginTransaction();
// if (!fragmentPopped) {
ft.replace(R.id.frame_container, fragment);
ft.addToBackStack(backStateName);
ft.commit();
// }
currentFrag = fragmentManager.findFragmentById(R.id.frame_container);
Log.e("Current Fragment", "" + currentFrag);
}
希望这将对您有所帮助,并在整个项目中使用此方法替换片段。尝试在单个事务中使用此方法
protected void showAsRootFragment(Fragment fragment, @NonNull String tag) {
FragmentManager supportFragmentManager = getSupportFragmentManager();
FragmentTransaction transaction = supportFragmentManager.beginTransaction();
if (supportFragmentManager.getFragments() != null) {
for (Fragment attachedFragment : supportFragmentManager.getFragments()) {
if (attachedFragment != null && !tag.equals(attachedFragment.getTag())) {
transaction.hide(attachedFragment);
attachedFragment.setUserVisibleHint(false);
}
}
}
if (!fragment.isAdded()) {
transaction.add(R.id.frame_container, fragment, tag);
fragment.setUserVisibleHint(true);
} else {
transaction.show(fragment);
fragment.setUserVisibleHint(true);
}
transaction.commit();
}
试着在单笔交易中成功
protected void showAsRootFragment(Fragment fragment, @NonNull String tag) {
FragmentManager supportFragmentManager = getSupportFragmentManager();
FragmentTransaction transaction = supportFragmentManager.beginTransaction();
if (supportFragmentManager.getFragments() != null) {
for (Fragment attachedFragment : supportFragmentManager.getFragments()) {
if (attachedFragment != null && !tag.equals(attachedFragment.getTag())) {
transaction.hide(attachedFragment);
attachedFragment.setUserVisibleHint(false);
}
}
}
if (!fragment.isAdded()) {
transaction.add(R.id.frame_container, fragment, tag);
fragment.setUserVisibleHint(true);
} else {
transaction.show(fragment);
fragment.setUserVisibleHint(true);
}
transaction.commit();
}
我知道投反对票的理由吗?我不知道你问题的答案,投反对票的。区别在于生命周期。用B替换片段A时,A的视图将被破坏。但是当你隐藏片段A并显示B时,A的视图并没有被破坏。是的,视图并没有被破坏,因为我们只是“隐藏”了它。因为活动没有发生什么事我知道投票被否决的原因吗?我不知道你问题的答案,被否决的。区别在于生命周期。用B替换片段A时,A的视图将被破坏。但是当你隐藏片段A并显示B时,A的视图并没有被破坏。是的,视图并没有被破坏,因为我们只是“隐藏”了它。因为活动没有发生任何事情,所以调用它:
setOffscreenPageLimit()
当我切换选项卡时,它延迟太多。而片段再次被重新创建(即使在我使用SmartFragmentStatePagerAdapter时也是如此)SmartFragmentStatePagerAdapter&FragmentStatePagerAdapter在有很多片段(如bookreader应用程序)时非常有用。使用碎纸机就足够了。请上传你的代码,这样我可以看一看它的工作,我忘了添加setOffscreenPageLimit。非常感谢你。我是安卓的初学者,你怎么能学安卓呢。您推荐的任何课程、页面或书籍,如meUdacity、codepath、stackoveflow文档,都是很好的资源。它被称为:setOffscreenPageLimit()
当我切换选项卡时,延迟太多。而片段再次被重新创建(即使在我使用SmartFragmentStatePagerAdapter时也是如此)SmartFragmentStatePagerAdapter&FragmentStatePagerAdapter在有很多片段(如bookreader应用程序)时非常有用。使用碎纸机就足够了。请上传你的代码,这样我可以看一看它的工作,我忘了添加setOffscreenPageLimit。非常感谢你。我是安卓的初学者,你怎么能学安卓呢。您推荐的任何课程、页面或书籍meUdacity、codepath、stackoveflow文档都是很好的资源。