[英]How to keep fragment state after replace transaction?
我在 Android 应用程序中有两个片段(假设FragmentA和FragmentB ),我在使用BottomBar之间切换。
我有一个被提取使用改造,我使用FragmentA一个RecyclerView显示数据的列表,我有一个FragmentB MapView类。
我的问题是每当我从FragmentB切换回FragmentA 时, API 调用都会再次获取数据列表。 当我从FragmentA切换到FragmentB 时,MapView 从头开始再次呈现。
有没有办法可以保持 FragmentA 的状态,即数据列表,直到我销毁活动? 并将 MapView 保留在 FragmentB 中?
我使用以下内容替换了一个片段。
public void replaceFragment(Fragment fragment // This can be FragmentA or FragmentB) {
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.framelayout, fragment);
transaction.commit();
}
我只想碎片以保持它们的状态,并且在活动被销毁之前不要重新初始化所有东西。 我猜片段的生命周期方法在这里起着重要的作用。
任何帮助表示赞赏。 谢谢!
在 MyActivity 中,在 onCreate 上方声明两个片段对象:
private Fragment1 fragment1 = new Fragment1();
private Fragment2 fragment1 = new Fragment2();
单击BottomBar,您可以设置单击显示和隐藏两个片段。
设置片段 1 被选中
private void fragment1Selected() {
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
if (fragment1 == null || !fragment1.isAdded()) {
fragment1 = new Fragment1();
transaction.add(R.id.framelayout, fragment1);
} else {
transaction.show(fragment1);
}
if (fragment2 != null)
transaction.hide(fragment2);
transaction.commit();
}
设置片段 2 被选中
private void fragment2Selected() {
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
if (fragment2 == null || !fragment2.isAdded()) {
fragment2 = new Fragment2();
transaction.add(R.id.framelayout, fragment2);
} else {
transaction.show(fragment2);
}
if (fragment1 != null)
transaction.hide(fragment1);
transaction.commit();
}
以 Rumit Patel 的回答为基础
我创建了一个函数来显示第一个片段
private fun initialFragment(fragment: Fragment) {
val fragmentTransaction = supportFragmentManager.beginTransaction()
fragmentTransaction.replace(R.id.frameLayoutMA,fragment)
fragmentTransaction.commit()
}
然后对于每个后续片段,我将前一个片段(我想隐藏的片段)与新片段(我想显示的片段)一起传递给这个函数
private fun fragmentSelected(oldFragment: Fragment, newFragment: Fragment) {
val fragmentTransaction = supportFragmentManager.beginTransaction()
fragmentTransaction.hide(oldFragment)
if (!newFragment.isAdded) {
fragmentTransaction.add(R.id.frameLayoutMA, newFragment)
}
else {
fragmentTransaction.show(newFragment)
}
fragmentTransaction.commit()
}
如果要隐藏多个片段,则可以创建一个 arrayList 并添加除要显示的片段之外的所有片段
fun fragmentArrayList(exception: Int): ArrayList<Fragment> {
val fragmentList: ArrayList<Fragment> = ArrayList()
if (exception != fragment1) {
fragmentList.add(fragment1)
}
if (exception != fragment2 {
fragmentList.add(fragment2)
}
if (exception != fragment3 {
fragmentList.add(fragment3)
}
if (exception != fragment4 {
fragmentList.add(fragment4)
}
return fragmentList
}
并使用第二个函数的此变体隐藏除新片段之外的所有片段
private fun fragmentSelected(oldFragments: ArrayList<Fragment>, newFragment: Fragment) {
val fragmentTransaction = supportFragmentManager.beginTransaction()
for (oldFragment in oldFragments) {
fragmentTransaction.hide(oldFragment)
}
if (!newFragment.isAdded) {
fragmentTransaction.add(R.id.frameLayoutMA, newFragment)
}
else {
fragmentTransaction.show(newFragment)
}
fragmentTransaction.commit()
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.