【问题标题】:Update values in fragment without recreating it更新片段中的值而不重新创建它
【发布时间】:2018-10-22 08:56:03
【问题描述】:

我有两个片段,例如。 FragAFragB。 FragA 有一个 RecyclerView,其项目单击会将用户重定向到 FragB。在 FragB 中,用户更新了一个值,该值需要设置为 FragA 中的 TextView。但是我不想失去FragA的状态

我执行以下操作来切换片段。

Fragment fragment = new FragB();
fragment.setArguments(bundle);
FragmentTransaction fragmentTransaction = getActivity().getSupportFragmentManager().beginTransaction();
fragmentTransaction.add(R.id.home_frame, fragment, m_userName).addToBackStack(null);
fragmentTransaction.commit();

在 FragB 中,我创建了一个包含更新信息的包:-

FragA mFragA = new FragA ();
Bundle args = new Bundle();
args.putParcelable("UpdatedText", "SomeText");
mFragA .setArguments(args);
getFragmentManager().beginTransaction().remove(this);
getFragmentManager().beginTransaction().add(R.id.container, mFragA).commit();

在上述情况下,FragA 的状态保持不变,但没有调用任何方法,因为 Fragment 没有重新创建。因此 textview 值不会更新。

如何使用来自 FragB 的信息更新 FragA 中 TextView 的值,同时保持 FragA 的状态?

感谢任何帮助。

【问题讨论】:

  • 这些片段是否同时可见?
  • @Lucem 不,他们不是。所以基本上,我在 FragA 中有一个回收器视图,其项目单击会打开 FragB。因此,如果用户将回收站视图滚动到第 10 项以打开 FragB,点击 FragB 上的后退按钮应该让他回到回收站视图的第 10 位

标签: android android-fragments bundle state fragmenttransaction


【解决方案1】:

您必须创建一个包含字符串的类,然后在主活动中创建此类的实例,然后在片段 B 中调用它以使用 UpdatedText 对其进行初始化,例如 class.setTextUpdate ("new text") 并在 fragmentA 中执行 class.getTextUpdate

【讨论】:

  • 嗨。你能给我看一个同样的例子吗?如果我添加片段而不是替换它,我应该在哪里调用 FragA 中的实例,因为没有任何方法被调用?
【解决方案2】:

正确方法: 基本上你必须正确地更新你的 POJO。使用接口将此更改传达回活动,然后使用 notifyitemchanged 从活动更新您对 Frag A 中的回收站视图的更改。

另一种方式: 使用事件总线。这方面有很多库,您也有本地事件总线。

Otto 就是其中之一。易于集成。

【讨论】:

  • 嗨。我应该从 FragA 的哪个方法调用通知项已更改?没有调用任何方法,因为我不是替换片段而是添加和删除它们
  • 不是来自 Frag A。在 Frag A 中创建一个方法,该方法又调用适配器中的 notifyitemchanged。从 Activity 使用 Frag A 的实例调用该方法。
  • 回击FragB时会调用Activity的哪个方法?抱歉,我真的对碎片感到困惑
  • 我按照你的建议做了,但是当我尝试将更新的值从我的活动类传递给 FragA 时,视图返回为 null
  • 查看Frag A的实例?
猜你喜欢
  • 2011-09-05
  • 1970-01-01
  • 2012-02-22
  • 1970-01-01
  • 1970-01-01
  • 2019-12-07
  • 2022-11-30
  • 1970-01-01
相关资源
最近更新 更多