在两个片段之间共享数据

时间:2018-03-08 13:28:21

标签: android android-fragments fragment

我目前正在尝试制作创建帐户片段并选择个人资料照片片段。

片段A /创建帐户:

这包含名称,密码,电子邮件地址的Edittextfields。 还有一个图像视图,表示配置文件pic。 此图像视图侧面有一个按钮,我想用它切换到片段B。

Design of the Fragment

片段B /选择配置文件图片:

片段只是一个图像视图和几个图像按钮。

Design of the Fragment

我的问题

假设用户输入了片段A的所有信息,现在想要选择个人资料图片,如何保存片段A中输入的所有临时数据。 第二个问题是,当用户单击片段B上的“接受”按钮时,如何将选择的Pic发送到片段A.这样我就可以切换到片段A并恢复以前保存的信息并接收可绘制的图像,用户已选择,以在图像视图中显示它。

3 个答案:

答案 0 :(得分:0)

将Activity作为中间人可以启用片段通信。 请参阅Communicating with Other Fragments以了解“片段活动片段”通信。如果你想持久化数据,请参考android的SharedPreference。

答案 1 :(得分:0)

查看新的Android架构组件。特别是ViewModelhttps://developer.android.com/topic/libraries/architecture/viewmodel.html#sharing

有一节关于在片段之间共享数据。

  

活动中需要两个或更多碎片是非常常见的   彼此沟通。想象一下主要细节的常见情况   片段,其中有一个片段,用户在其中选择一个项目   从列表和另一个显示内容的片段   选定的项目。这种情况从来都不是微不足道的,因为两个片段都需要   定义一些接口描述,并且所有者活动必须绑定   两个在一起。此外,两个片段都必须处理该方案   其他片段尚未创建或可见的地方。

     

使用ViewModel对象可以解决这个常见的痛点。   这些片段可以使用其活动范围共享ViewModel   处理此通信,如以下示例所示   代码:

public class SharedViewModel extends ViewModel {
    private final MutableLiveData<Item> selected = new MutableLiveData<Item>();

    public void select(Item item) {
        selected.setValue(item);
    }

    public LiveData<Item> getSelected() {
        return selected;
    }
}

public class MasterFragment extends Fragment {
    private SharedViewModel model;
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        model = ViewModelProviders.of(getActivity()).get(SharedViewModel.class);
        itemSelector.setOnClickListener(item -> {
            model.select(item);
        });
    }
}

public class DetailFragment extends Fragment {
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        SharedViewModel model = ViewModelProviders.of(getActivity()).get(SharedViewModel.class);
        model.getSelected().observe(this, { item ->
           // Update the UI.
        });
    }
}

答案 2 :(得分:-1)

为什么要创建2个片段?

您可以使用不同的视图实现相同的功能。假设您可以使用1st Fragment的所有控件创建一个线性/相对(布局组)布局,并使用2nd Fragment控件创建另一个布局(布局组)。然后使用动画节目和隐藏布局,这样你就可以同时拥有相同片段或活动的内容,用户甚至不会注意到这一点。

这样您就不必临时保存数据,您必须在单个文件中实现所有内容。