Android - 在 UI Fragment 中保留对象

2023-12-02

在我的项目中,我最初使用的是这个方案:

活动A(UI) > 片段B(非 UI)> 适配器 + AsyncTask

  • B保留与setRetainInstance(true)并更新A UI
  • A实例化B with getFragmentManager()

但我现在需要使用UI Fragments,所以我想到使用这个方案:

活动A> 碎片B(UI) > 片段C(非 UI)> 适配器 + AsyncTask

  • C保留与setRetainInstance(true)并更新B UI
  • B实例化C with getChildFragmentManager()

但这似乎不可能:

Caused by: java.lang.IllegalStateException:
    Can't retain fragements that are nested in other fragments

我尝试实例化C with getFragmentManager()代替getChildFragmentManager()但我遇到了一些问题。


在片段中保留对象和管理异步任务的最佳实践是什么?


我终于开发了一个小助手类:

public class RetainFragment<F extends Fragment> extends Fragment {

    private static <F extends Fragment> String tag(F ui, Object id) {
        return ui.getClass().getName() + id.toString();
    }

    public static <F extends Fragment> Fragment get(F ui, Object id) {
        return ui.getFragmentManager().findFragmentByTag(tag(ui, id));
    }

    public F ui;
    public Object id;

    @Override
    public void onCreate(Bundle state) {
        super.onCreate(state);
        setRetainInstance(true);
    }

    public void link(F ui, Object id) {
        this.id = id;
        this.ui = ui;
        if (get(ui, id) == null) {
            ui.getFragmentManager()
              .beginTransaction()
              .add(this, tag(ui, id))
              .commit();
        }
    }

    public void unlink() {
        if (get(ui, id) != null) {
            ui.getFragmentManager()
              .beginTransaction()
              .remove(this)
              .commit();
        }
        ui = null;
        id = null;
    }

}

现在,在 UI Fragments 中,我只写:

public class UiFragment extends Fragment {

    private static class Retain extends RetainFragment<UiFragment> {
        private MyAsyncTask task;   // Objects to retain over
        private MyAdapter adapter;  // configuration changes
    }

    private Retain retain;

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        retain = (Retain) Retain.get(this, 0);
        if (retain == null) {
            retain = new Retain();
            // Retained objects initialization
            retain.adapter = new MyAdapter();
        }
        retain.link(this, 0);
    }

    @Override
    public void onDetach() {
        if (isRemoving()) {
            // Retained objects terminate
            if (retain.task != null) {
                retain.task.cancel(true);
            }
            retain.unlink();
        }
        super.onDetach();
    }

    private void update() {
        if (!isDetached()) {
            // Update UI fragment
        }
    }

}

And in retain.task.onPostExecute():

retain.ui.update(); // Reference to the last ui fragment instance linked

并在 UI 片段启动时启动任务:

private static class Retain extends RetainFragment<UiFragment> {
    private MyAsyncTask task;   // Objects to retain over
    private MyAdapter adapter;  // configuration changes

    @Override
    public void onCreate(Bundle state) {
        super.onCreate(state);
        ui.onRetainCreated();
    }
}

private void onRetainCreated() {
    retain.task = new MyAsyncTask() {
        @Override
        protected void onPostExecute(Void result) {
            retain.ui.update();
        }
    };
    retain.task.execute();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android - 在 UI Fragment 中保留对象 的相关文章

  • 检查 WebView 元素时的 UiAutomator 错误

    I have recently started automation testing in android and was using UiAutomator tool for inspecting UI elements Surprisi
  • Android Studio:XML 布局中的“包装在容器中”

    编辑 XML 布局文件时 Eclipse 有一项称为 包裹在容器中 的功能 重新格式化 gt Android gt 可让您选择一个或多个视图并在其周围包裹您选择的布局 Android Studio中有类似的东西吗 目前正在实施中 问题 69
  • 如何在 Linux 内核中定义并触发我自己的新软中断?

    我想在 Linux 内核中创建自己的软中断 这是正确的方法吗 In the init我想触发该模块的softirq我将添加一个调用 394 void open softirq int nr void action struct softir
  • 如何使用 Google Maps for Android V2 处理地图移动结束?

    我想在地图中心更改后立即对地址进行地理编码 如何使用新的 Android 版 Google 地图 V2 处理地图移动 我说的是用户用手指拖动地图的情况 查看新的地图 API Override public void onMapReady G
  • Android应用程序组件销毁和重新创建的详细信息

    有人可以向我提供一些具体的 值得信赖的 最好是简洁的 信息 内容如下 系统销毁和 如果适用 重新创建组件的顺序 片段 活动 活动的线程 异步任务 计时器 静态数据 类何时卸载 其他类中的线程 异步任务 定时器 主机 TabActivity
  • 如何更改终端的默认目录?

    我想更改 Android Studio v2 2 2 终端的默认目录 当我打开终端时 它基于项目的目录 C 项目路径 我经常需要使用adb shell 所以我必须导航到 SDK 路径 平台工具 才能使用 adb 命令 是否可以更改终端的默认
  • Android Eclipse 上的 Web 服务

    我是 android eclipse java 的新手 事实上这个论坛也是如此 有人遇到过这种情况吗 从用户那里获取输入并通过使用 android eclipse 中的 Web 服务来显示适当的结果 有可用的示例吗 非常感谢 我正在发布教程
  • Android:后台Activity可以执行代码吗?

    后台的活动是否被视为 正在运行 并且可以执行代码 还是处于挂起状态 他们暂停了 活动生命周期 http developer android com reference android app Activity html ActivityLi
  • 为什么是 javascript:history.go(-1);无法在移动设备上工作?

    首先 一些背景 我有一个向用户呈现搜索页面 html 表单 的应用程序 填写标准并单击 搜索 按钮后 结果将显示在标准部分下方 在结果列表中 您可以通过单击将您带到新页面的链接来查看单个结果的详细信息 在详细信息页面中 我添加了一个 返回结
  • Android Studio 与本地网络共享上的项目文件

    这是我的设置 Android Studio 项目文件位于 Ubuntu 14 10 盒子上的共享文件夹中 尝试在 Windows 8 机器上运行 Android Studio 1 0 2 并将 U 驱动器映射到包含项目文件的 Ubuntu
  • 图像作为电子邮件附件

    我想构建一个应用程序 我可以在电子邮件中附加图像 打开图像并将其设置为我的壁纸 我想让它跨平台 所以你能告诉我是否可以使用phonegap 或者我是否必须为iphone和android构建一个本机应用程序 您好 如果您只想通过电子邮件附加图
  • Android 构建发布失败,原因为:java.lang.ArrayIndexOutOfBoundsException:213(pr​​oguard 问题)

    我的项目使用调试构建变体构建得很好 但使用发布变体 Android Studio 会抛出 引起原因 java lang ArrayIndexOutOfBoundsException 213 可能是什么问题 如果我设置minifyEnable
  • okhttp 获取失败响应

    我已经在我的 android 客户端中实现了 okhttp 来进行网络调用 当我收到失败响应时 我会收到失败代码以及与该代码相关的文本作为消息 但我没有收到服务器发送给我的自定义失败响应 在我实施的代码中的失败响应中 我收到的消息只是 错误
  • logcat 中 mSecurityInputMethodService 为 null

    我写了一点android应显示智能手机当前位置 最后已知位置 的应用程序 尽管我复制了示例代码 并尝试了其他几种解决方案 但似乎每次都有相同的错误 我的应用程序由一个按钮组成 按下按钮应该log经度和纬度 但仅对数 mSecurityInp
  • Android 中如何通过彩信发送图片?

    我正在开发多媒体应用程序 我正在通过相机捕获一张图像 并希望将该图像和文本发送到其他号码 但我不知道如何通过彩信发送图像 MMS 只是一个 http post 请求 您应该使用执行请求额外的网络功能 final ConnectivityMa
  • 您使用什么物理 Android 设备进行测试?

    有什么好的推荐用于测试目的的物理 Android 设备吗 我正在苹果阵营寻找像 iPod touch 这样的设备 可以帮助 iOS 开发人员测试他们的东西 我知道有 Nexus One 但那东西相当昂贵 而且我并不真正关心手机的东西 而是可
  • Android 如何将总天数准确更改为年、月、日?

    我正在做一个应用程序 该应用程序与根据给定的生日日期输入获取一个人的年龄有关 为此 我从下面的代码中获取从该日期到当前日期的总天数 String strThatDay 1991 05 10 SimpleDateFormat formatte
  • Android - 以编程方式选择菜单选项

    有没有办法以编程方式选择菜单选项 基本上 我希望视图中的按钮能够执行与按特定菜单选项相同的操作 我正在考虑尝试调用 onOptionsItemSelected MenuItem item 但我不知道要为菜单项添加什么 是的 有一种方法可以选
  • 通过电子邮件发送文本文件附件

    我正在尝试附加一个文本文件以便通过电子邮件发送 但每当我打开电子邮件应用程序时 它都会说该文件不存在 请帮助 Intent i new Intent Intent ACTION SEND i setType text plain i put
  • Android 屏幕方向错误

    我使用的是 Android HTC HERO 2 1 版本 我写的活动

随机推荐

  • 从多个表中选择语句,具有可变输入

    我有两张桌子 AreaCode and EquipmentNumber AreaCd AreaID INT NOT NULL AUTO INCREMENT Code INT Name CHAR 30 Comments TEXT PKEY A
  • 密钥在 pm3d gnuplot 中变得不可见

    我正在使用以下代码使用 pm3d 地图在 gnuplot 中绘制图形 set pm3d map set pm3d corners2color c1 spl patternD0pt02 dat title a 但是当生成图时 本来应该出现在右
  • 使用注释的 Spring Integration Executor Channel 代码示例

    附上我的系统图 系统图 流程如何运作 spring 集成流程从 C 上的 json 文件读取输入并执行 2 个操作 存入数据库 通知 打印给用户 重要标准 我希望存储到数据库流中独立于业务逻辑 打印到 通知用户 即数据库exception
  • 应用程序被终止后 Android 服务停止

    我想创建一个service即使应用程序从任务管理器关闭 它也会运行 我创建了一个服务 然后记录一条消息以检查它是否正在运行 我注意到它仅在应用程序正在运行或在前台运行时才有效 服务等级 public class CallService ex
  • 具有多选下拉菜单的数据表特定列过滤器

    我在 Datatable API 中看到了这种可能性 可以使用 Drop down 进行特定列过滤 Ref https datatables net examples api multi filter select html 但对我来说 它
  • Android 上的浮动应用程序(窗口应用程序)

    有谁知道如何创建浮动窗口 下图显示了我的意思 源代码 我在各种网站上读到 为了做到这一点 应用程序必须作为服务运行 而该服务又应该使用 TYPE SYSTEM ALERT 作为活动运行 如果上述是或不是真的 我仍然不知道如何实现代码 有人可
  • 使用 python 缓慢上传到 azure blob 存储

    Api 接收文件 然后尝试创建唯一的 blob 名称 然后我将 4MB 的块上传到 blob 每个块大约需要 8 秒 这正常吗 我的上传速度是110Mbps 我尝试上传一个 50MB 的文件 花了将近 2 分钟 我不知道azure blob
  • 如何使用ajax保存到数据库

    我有一个工作正常的代码 但数据无法保存到数据库 我想通过 Ajax 将 cost currency rate profit rate 和 pprice 插入数据库 这是javascript和update php的代码 我尝试修改代码以保存在
  • 如何使用批处理文件分割字符串?

    如何使用批处理脚本分割字符串 设置java path C Program Files Java jdk1 6 0 31 上面是我的字符串 我只想要 java path 中的 C Program Files 如何得到它 您可以按字符位置拆分字
  • 使用 Log4j 的每个用户都有不同的日志

    我有一个 Web 应用程序 我想为每个用户使用不同的日志 这样我就可以获得用户在系统上执行的操作的 历史记录 这是我到目前为止所拥有的 import java io File import java io IOException impor
  • 将单词列表转换为数组[关闭]

    Closed 这个问题需要细节或清晰度 目前不接受答案 我试图查看是否有任何脚本可以将单词列表转换为数组 但我似乎找不到 有人知道我在哪里可以找到一个吗 Input Dog Cat Hamster 转换为 Dog Cat Hamster 不
  • cURL 错误 58:SSL:无法加载证书“...”及其私钥:Mac 上的 OSStatus -25299

    该代码在 Ubuntu vagrant box 上运行良好 但在本地 MacO 上它不会加载证书 说 cURL error 58 SSL Can t load the certificate and its private key OSSt
  • 如何像矩阵乘法一样将行向量添加到列向量

    我有一个 nx1 向量和一个 1xn 向量 我想以一种特殊的方式添加它们 例如以有效的方式 矢量化 矩阵乘法 Example A 1 2 3 B 4 5 6 A odd add B 1 4 1 5 1 6 2 4 2 5 2 6 3 4 3
  • 命名空间::变量的多重定义,甚至使用 ifndef

    我知道我在这里一定做错了什么 rank h ifndef RANK H define RANK H namespace mmi int chunk void rank int my rank endif rank cpp include r
  • 如何检测 Python 是否作为 64 位应用程序运行? [复制]

    这个问题在这里已经有答案了 我正在对 Windows 注册表进行一些工作 根据 Python 运行为 32 位还是 64 位 某些键值会有所不同 如何检测 Python 是作为 64 位应用程序运行还是作为 32 位应用程序运行 我对检测
  • 在悬停时添加边框时如何防止移动? (透明边框不是解决方案)[重复]

    这个问题在这里已经有答案了 我想在悬停时为 div 添加边框 但是添加边框时 div 稍微有点拉屎 这是一个众所周知的问题 常见的解决方案是添加透明边框 例如 但是 我的 div 中有一张包含一些文本的图像 我希望该图像占据 div 的全宽
  • 正则表达式西班牙语和阿拉伯语单词

    如何编写匹配所有有效的西班牙语和阿拉伯语单词的正则表达式 用我知道的英语来说 它是a zA z 在希伯来语中是 俄语 我使用 JavaScript 范围a zA Z因为英语单词的简单和天真令人难以接受 它省略了所有带有重音符号的字母以及在借
  • 过渡到 vim。存在缩进问题

    我正在从手术中恢复 因此 我正在过渡到 VIM 作为起点 我选择使用 vim sensible 插件作为我的配置的基础 此外 我还安装了 vim rails 和 vim ruby 插件 这些都是通过 Pathogen 加载的 无论出于何种原
  • 序列化 JFrame 并通过网络发送

    我想做的是通过套接字发送 JFrame 问题是在我发送表格并按下按钮查看它之后 我得到以下异常 package ds3 import java io IOException import java io ObjectInputStream
  • Android - 在 UI Fragment 中保留对象

    在我的项目中 我最初使用的是这个方案 活动A UI gt 片段B 非 UI gt 适配器 AsyncTask B保留与setRetainInstance true 并更新A UI A实例化B with getFragmentManager