我对Android开发很新,所以我很好奇如何正常使用Fragments。
我的应用程序包含一个BottomNavigationActivity
,它使用以下代码在3个片段之间切换:
FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.beginTransaction().replace(R.id.content_montage_order_detail, fragment).commit();
我将片段存储在List<Fragment>
中以避免丢失当前状态。但每当我用另一个替换片段时,调用方法onDestroy()
。
我知道,我知道我可以在fragmentmanager中添加和删除片段而不是替换它。我用Google搜索了大部分教程告诉我替换片段。
保持片段状态的常用方法是什么,而不是在每次调用时都重新创建片段?
答案 0 :(得分:2)
找到解决方案
它不会随时重新创建片段
FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.beginTransaction().add(R.id.content_montage_order_detail, fragment).commit();
答案 1 :(得分:2)
在创建片段时使用片段TAG,然后当您想再次使用它时使用findFragmentByTag。如果片段已经创建,则片段管理器将找到旧片段。
片段previousFragment = fragmentManager.findFragmentByTag(“TAG”);
答案 2 :(得分:2)
我建议您使用show
,而不是replace
protected void addFragmentStack(Fragment fragment) {
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
if (this.mContent != fragment) {
if (fragment.isAdded()) {
ft.hide(this.mContent).show(fragment);
} else {
ft.hide(this.mContent).add(getFragmentViewId(), fragment);
}
this.mContent = fragment;
}
ft.commit();
}
答案 3 :(得分:1)
Ya,您还可以通过管理 backstack 来管理州。
答案 4 :(得分:1)
尝试使用switchFragment
切换片段,如果已添加片段,则会显示片段。
使用fragmentTransaction.show
方法重新使用现有片段,即保存的实例。
public void switchFragment (Fragment oldFragment, Fragment newFragment, int frameId) {
boolean addFragment = true;
FragmentManager fragmentManager = getFragmentManager ();
String tag = newFragment.getArguments ().getString (BaseFragment.TAG);
Fragment fragment = fragmentManager.findFragmentByTag (tag);
// Check if fragment is already added
if (fragment != null && fragment.isAdded ()) {
addFragment = false;
}
// Hide previous fragment
String oldFragmentTag = oldFragment.getArguments ().getString (BaseFragment.TAG);
if (!tag.equals (oldFragmentTag)) {
FragmentTransaction hideTransaction = fragmentManager.beginTransaction ();
Fragment fragment1 = fragmentManager.findFragmentByTag (oldFragmentTag);
hideTransaction.hide (fragment1);
hideTransaction.commit ();
}
// Add new fragment and show it
FragmentTransaction addTransaction = fragmentManager.beginTransaction ();
if (addFragment) {
addTransaction.add (frameId, newFragment, tag);
addTransaction.addToBackStack (tag);
}
else {
newFragment = fragmentManager.findFragmentByTag (tag);
}
addTransaction.show (newFragment);
addTransaction.commit ();
}