从不同片段获取对象的更改

时间:2018-06-26 04:20:07

标签: java android android-fragments android-intent interface

让我们说我们有两个片段A和B,我们使用Bundle将对象O1从片段A发送到B,并将片段B放入当前活动中。对O1进行一些更改,即将数据存储在有效负载对象O1中,现在我们返回到放置了保存按钮的片段A。现在,如果我们保存O1具有的数据,即O1.savetoDatabase(),我们不会得到在片段B中所做的数据更改。是否有可能的方法来获取传递给片段B的对象在片段A中的更改? (类似于引用会导致更改)

编辑:使用setTargetFragment的答案两个似乎有效,但是唯一的问题是当我在片段B上,然后将数据发送到片段A时,我正在片段A的对象O1中接收数据(这很好用)但是当我从片段B到片段A按下返回按钮时,O1中的数据会由于片段重新创建而丢失。要保存发送的数据该怎么做?

3 个答案:

答案 0 :(得分:1)

可以使用setTargetFragment()。为对象创建吸气剂和吸气剂。

public class FragmentA extends Fragment {
    private String mName;

    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        FragmentB fragmentB = new FragmentB();
        fragmentB.setTargetFragment(this, 1111);
    }

    public String getmName() {
        return mName;
    }

    public void setmName(String mName) {
        this.mName = mName;
    }
}

public class FragmentB  extends Fragment {
    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

        ((FragmentA)getTargetFragment()).setmName("xyz");
    }
}

或者您可以使用onActivityResult方法通过如下所示的意图将数据从fragmentB发送到FragmentA。

getTargetFragment().onActivityResult(getTargetRequestCode(), resultCode, intent)

答案 1 :(得分:0)

使用Bundle将修改的O1发送到片段A。或者您可以使用Eventbus观察变化 https://github.com/greenrobot/EventBus

答案 2 :(得分:0)

建议在片段之间进行通信的方法是创建一个共享的ViewModel对象。这两个片段都可以通过其包含的Activity访问ViewModel。片段可以更新ViewModel中的数据,如果使用LiveData公开了数据,则只要从ViewModel观察LiveData,新状态就会被推送到另一个片段。要了解如何实现这种通信,请阅读ViewModel指南中的“在片段之间共享数据”部分。

参考-https://developer.android.com/training/basics/fragments/communicating

ViewModel是一个类,负责为活动或片段准备和管理数据。它还处理活动/片段与应用程序其余部分的通信(例如,调用业务逻辑类)。

ViewModel总是与范围(片段或活动)相关联地创建,并且只要范围是活动的就将保留。例如。如果是活动,直到完成。

换句话说,这意味着如果ViewModel的所有者因配置更改(例如旋转)而被销毁,则不会销毁它。所有者的新实例将重新连接到现有的ViewModel。

ViewModel的目的是获取并保留活动或片段所必需的信息。活动或片段应能够观察ViewModel中的更改。 ViewModel通常通过LiveData或Android数据绑定公开此信息。您还可以使用自己喜欢的框架中的任何可观察性构造

参考-https://developer.android.com/reference/android/arch/lifecycle/ViewModel

也检查

Sharing data between fragments using new architecture component ViewModel

希望这会有所帮助