我正在研究 MVP。
我有导航菜单的 Activity ,我从菜单中更改 fragment ,如下所示:
switch (id) {
case R.id.nav_status:
fragmentManager.beginTransaction().replace(R.id.fr_main, mAppProductFragment).commit();
Log.d(TAG, "Выбрано меню статус");
break;
case R.id.nav_schemas:
AppRedirectFragment schemasFragment = new AppRedirectFragment();
fragmentManager.beginTransaction().replace(R.id.fr_main, schemasFragment).commit();
Log.d(TAG, "Выбрано меню переадресация");
break;
}
问题是,当我更改 fragment 时,我之前的 fragment 会被破坏。 它调用以下回调:
D/AppProductPresenter: onStopDetouchView()
D/AppProductFragment: onDestroyView
D/AppProductFragment: onDestroy()
它会失去对演示者的引用,并处理所有改造请求。
mPresenter.onDestroyView();
,这样我所有的网络操作都被销毁了。但我想在后台运行它们。但它已处置。
public void onDestroy() {
super.onDestroy();
mPresenter.onDestroyView();
}
那么如何在不调用 onDestroy 的情况下更改 fragment 呢?我读到我必须使用 add
而不是 fragmentManager.beginTransaction().replace
那么如何正确地做到这一点呢?
最佳答案
当您使用时
fragmentManager
.beginTransaction()
.replace(R.id.fr_main, schemasFragment)
//addToBackstack(String name) //if you want to keep transaction to backstack
.commit();
replace()将删除先前的 fragment 并添加新的 fragment ,因此您无法避免 onDestroy()。 但是当你打电话时
fragmentManager
.beginTransaction()
.add(R.id.fr_main, schemasFragment)
//addToBackstack(String name) //if you want to keep transaction to backstack
.commit();
你只是add覆盖前一个 fragment 的新 fragment 和前一个 fragment 仍然存在。但是,如果您添加大量 fragment 而不删除以前的 fragment - 您的应用程序可能会变得缓慢。 如果您的改造请求很复杂 - 好的决定是在服务中进行。
关于java - 更改 fragment 而不重新创建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49923560/