java - 更改 fragment 而不重新创建

标签 java android android-fragments

我正在研究 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/

相关文章:

java - 计算随机数的代码仅生成 1

java - 安卓 Java : Get Open WiFi-Networks

android - getActivity().findViewById(R.layout.contacts_list_view) 返回 null

android - 如何从包含的 fragment 控制 Activity 的向上按钮?

java - HashMap中的哈希方法

java - 将 textView 转换为 Boolean 以避免类型 Intent 中的 : The method putExtra(String, boolean) 不适用于参数

android - 如果 Android 中的时区是 Pacific/Tongatapu,Time.toMillis(false) of 1/1/1941 总是返回 -1

android - 无法获得与微调器一起工作的 Intent

java - Android - fragment 重叠

java - Java 中删除字符串中的空格