ViewPager中多个Fragment之间的通信对象

2024-04-21

我有 5 个片段ViewPager用于逐步用多个字段填充业务对象,在每一步中都会设置其中一些字段。我读过很多关于片段之间通信的文章,但我对其他人喜欢的方式感到不舒服,所以在考虑我应该如何在我的情况下做到这一点之后,最后我开始考虑使用所有片段都可以轻松访问的单例模型对象到其字段并按照特定步骤填写它们。

由于我是 Android 新手,我想听听专家关于使用单例而不是在片段之间传递数据(例如实现的接口)的信息(它看起来如此复杂且难以维护)。任何建议都会有所帮助。


虽然单例方法似乎很容易实现和理解,但它并不是实现您所需的最佳方法。原因之一是您的模型对象或您所说的业务对象位于活动上下文之外,这可能会产生难以发现的错误。例如。万一系统创建了多个活动类实例,并且都保留对您的单例的引用。看看你是如何失去对物体的追踪的?

我要做的是

  1. 使我的模型对象得以实现Parcelable https://developer.android.com/reference/android/os/Parcelable.html一开始你会讨厌它,但一旦你习惯了它,它就会成为你模型最好的朋友
  2. 由于你的模型是parcelable现在您可以轻松地在片段、活动之间传递它,甚至将其保存在共享首选项中。当您通过考试时,需要注意一件重要的事情parcelable在片段或活动之间,就像按值传递一样,即每次创建新实例时。
  3. 设置片段的参数,或者如果它已经实例化,则获取参数并添加模型。这是一个例子: 如果片段尚未激活:

    Bundle args = new Bundle(); args.putParcable("businessObject", yourBusinessObjectThatIsParcable); yourFragment.setArguments(args);

    否则:yourFragment.getArguments().putParcelable("businessObject", yourBusinessObjectThatIsParcable);

  4. 在您的片段中,也许在 onCreateView 方法中获取您的模型对象,如下所示MyParcableObject mpo = (MyParcableObject)getArguments().getParcelable("businessObject")并使用它设置你想要的任何数据。

  5. 当您在按钮单击或 onPause 方法中完成编辑对象时,以相同的方式更新片段的参数getArguments().putParcelable("businessObject", mpo);

  6. 在最后一页或最后一个片段中,您可以将对象传递给您的活动,here https://stackoverflow.com/a/819427/855843是如何做到的

尽管它看起来很麻烦,但这是作为 Android 开发人员需要习惯的一种做法。当您的模型实现时,您可以获得更多控制权parcelable.

做你需要的事情的另一种方法是通过委托模式 https://en.wikipedia.org/wiki/Delegation_pattern但它主要用于回调,即使您也可以传递对象。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ViewPager中多个Fragment之间的通信对象 的相关文章

随机推荐

  • 如何在iPhone中的sqlite数据库中插入图像

    如何在数据库中插入图像 我尝试过但没有插入 查询的问题出在哪里 这是我的模型类 m 文件 此文件中的代码之后sqlite3 prepare v2我的痕迹没有插入sqlite3 bind blob之后就直接出去了sqlite3 prepare
  • 使用 Retrofit2 在 Android Studio 上的位置 0 处出现意外的 JSON 标记 # 错误

    我有一个问题 JSON 中位置 0 处出现意外的标记 我想做的是使用 Firebase 上的 Cloud Function 删除 Firebase 用户 没有返回 但错误显示 存在意外的 json 令牌 这是一些代码 CloudFuncti
  • Twitter API 速率限制

    我想从 Twitter 收集几周内的数据 为此 我使用 RStudio Server 和 crontab 自动运行多个脚本 如下所示 require ROAuth require twitteR require plyr load twit
  • 将通用扩展方法限制为基本类型和字符串

    我想要 XElement XAttribute 的扩展方法 它允许我应用 ValueOrDefault 逻辑 也许具有各种略有不同的实现 ValueOrNull ValueOrDefault NumericValueOrDefault 验证
  • HTML 实体解码为特殊字符

    我想在输出中显示特殊符号 例如 我的文本可能包含实体代码 例如 lt gt ETC 我想将其显示为 lt gt 在我的输出中 我需要在 SQL 中执行此操作 我用谷歌搜索了这个并得到了一个函数 select dbms xmlgen conv
  • 使用依赖注入在工作线程中实例化对象

    我的目标是在并行线程中运行一个永无止境的进程 问题是 我不能只在新线程中实例化我的工作服务 因为我在我的应用程序中使用 DI 根据我对 SO 的研究 我注意到很多人建议需要将抽象工厂注入到线程中 以在并行线程中动态实例化线程安全对象 1 h
  • 输出字符串字符总数

    我的问题是 如果我想获取用户输入的字符总数 应该使用什么方法 在不使用数组的情况下 我尝试使用 length 但它没有返回名字和姓氏中的所有字符 它只返回名字 这是我的代码的示例 请不要笑我在编程方面真的很新 System out prin
  • 在 SVG 路径中对 SVG 进行动画处理

    我已经构建了一个路径动画 但 svg 中的锯片有问题 我想要为 Sawblade 制作动画 360 度旋转
  • 尝试伪造和轮换用户代理

    我正在尝试伪造用户代理并在 Python 中轮换它们 我在网上找到了一个关于如何使用 Scrapy 执行此操作的教程scrapy 用户代理 https github com svetlyak40wt scrapy useragents包裹
  • 如何在 Jekyll 中列出同一类别的帖子?

    我想列出与当前帖子具有相同类别的固定数量的最近帖子 这就是我得出的结论 for category name in page categories limit 1 h2 Other articles in category name h2 u
  • 使用 SSH.NET 在命令输出期间发送输入

    With PuTTY I connect to an SSH server and then I execute a command that constantly output logs multiple lines per second
  • Drupal:drupal_set_message 不显示消息

    当用户在我的网站上注册时 我似乎无法从 drupal set message 收到消息 我正在使用 Drupal 6 14 在 user module 中添加打印 function user register submit form for
  • Laravel 5 重写异常处理程序

    我想知道是否可以重写 Laravel 5 中的应用程序异常处理程序类 而不将其扩展到另一个类 也许更好的说法是我想要它 这样就不会App Exceptions Handler将在异常时调用 但是我自己的处理程序之一 提前致谢 正如 Digi
  • 在 oauth2 SignedJwtAssertionCredentials 中获得“invalid_grant”

    我正在尝试在服务器到服务器 JSON API 场景中创建 oauth2 access token 但它因 invalid grant 错误而失败 请帮助 from oauth2client client import SignedJwtAs
  • 如何检测前置摄像头放置在设备上的位置?

    有什么方法可以检测 Android 设备上前置摄像头的放置位置吗 我认为在手机上它总是在它的顶部 靠近耳机 但所有平板电脑都是不同的 我检查了华硕 Transformer 前置摄像头位于侧面 如果我以横向模式握住它 则位于顶部 但三星 Ga
  • 如何使用 EPPlus 移动工作表?

    需要什么命令EPPlus 移动工作簿中的工作表位置 我找不到任何适用于 EPPlus 互操作的移动命令 有四种移动工作表的方法 他们是 excelPackage Workbook Worksheets MoveAfter excelPack
  • 我想让图像全屏显示,直到滚动

    这是我尝试将此全屏图像应用到的页面 http www alexwiley co uk portfolio http www alexwiley co uk portfolio 我希望使图像显示 100 宽度和 100 高度 直到向下滚动 然
  • ASP.NET:Server.Execute() 中的 BOM

    我用它来写入响应流 using var writer new StringWriter context Server Execute virtualpath writer string s writer ToString Replace c
  • C++ 中的表达式必须有常量值错误[重复]

    这个问题在这里已经有答案了 可能的重复 有没有办法用非常量变量初始化数组 C https stackoverflow com questions 972705 is there a way to initialize an array wi
  • ViewPager中多个Fragment之间的通信对象

    我有 5 个片段ViewPager用于逐步用多个字段填充业务对象 在每一步中都会设置其中一些字段 我读过很多关于片段之间通信的文章 但我对其他人喜欢的方式感到不舒服 所以在考虑我应该如何在我的情况下做到这一点之后 最后我开始考虑使用所有片段