在android片段之间共享数据

时间:2014-07-31 15:23:07

标签: android android-fragments sharedpreferences android-checkbox

我有两个片段。 checkNodesFragment 动态创建checkBoxes的ArrayList,然后 ReserveNodesFragment 应该访问checkNodesFragment中检查了哪些。 什么样的存储方法更好用,所以ReserveNodesFragment可以查看checkBox在哪里检查?

搜索后,我发现 SharedPreferences 是一种永久存储数据的方法。 SharedPreferences是否适合通过片段显示数据? 我是android的新手,很抱歉,问题很明显。

3 个答案:

答案 0 :(得分:2)

片段之间的通信应通过Activity完成。

ActivityFragment 之间共享数据

创建一个包并使用fragment.setArguments(bundle)将数据传递给Fragment

FragmentActivity 之间共享数据

interfacefragmentActivity实施interface

更多信息:

Communicating with Other Fragments(下载示例)。

答案 1 :(得分:0)

如果您希望在运行时跨片段传输数据,只需使用Activity。

每个片段都有方法getActivity()。它是您片段的一种父级,因此您可以将其用作“桥梁”。不错的解决方案是在片段中定义回调。然后你的Activity可以作为这些回调的注册观察者工作并相应地作出反应,例如听取第一个片段的变化,然后在第二个片段上设置一些东西。

更多细节。

  1. 在您的片段中定义interface,提供有关更改的信息。选中复选框时,将创建将在片段中调用的方法。
  2. onAttach()方法中检查getActivity()interface的实例
  3. 让您实施interface
  4. 的活动
  5. 在Activity中实现方法。在该方法内部调用第二个片段并传递更新的信息。
  6. 使用Android Studio中的片段从模板创建活动时,可以找到很好的示例。

答案 2 :(得分:0)

正如我所提到的,我有两个片段。 checkNodesFragment 动态创建checkBoxes的ArrayList,然后 ReserveNodesFragment 应该访问 checkNodesFragment 中检查了哪些内容。 但我有6个CheckBox的Arraylists,ReserveNodesFragment应该知道:

//The ArrayLists with the checkBoxes
    public ArrayList<CheckBox> orbitCheckBoxes = new ArrayList<CheckBox>();
    public ArrayList<CheckBox> gridCheckBoxes = new ArrayList<CheckBox>();
    public ArrayList<CheckBox> usrpCheckBoxes = new ArrayList<CheckBox>();
    public ArrayList<CheckBox> disklessCheckBoxes = new ArrayList<CheckBox>();
    public ArrayList<CheckBox> icarusCheckBoxes = new ArrayList<CheckBox>();
    public ArrayList<CheckBox> baseStationsCheckBoxes = new ArrayList<CheckBox>();

因此,根据您的建议,我应该将六个参数传递给接口的方法,以便ReserveNodesFragment可以访问六个ArrayLists:

// Container Activity must implement this interface
    public interface OnHeadlineSelectedListener {
        public void onReserveSelected(ArrayList<CheckBox> orbitCheckBoxes, ArrayList<CheckBox> gridCheckBoxes, ArrayList<CheckBox> usrpCheckBoxes, ArrayList<CheckBox> disklessCheckBoxes,
                                      ArrayList<CheckBox> icarusCheckBoxes,  ArrayList<CheckBox> baseStationsCheckBoxes);
    }

所以将这么多参数传递给回调方法是否优雅?

此外, checkNodesFragment 是AvailableNodesFragment的嵌套片段。所以它的父母不是一个活动,而是一个片段。

所以app层次结构是这样的:

NitosSchedulerActivity - &gt; AvailableNodesFragment - &GT; CheckAvailableNodesFragment

NitosSchedulerActivity - &gt; ReserveNodesFragment

CheckAvailableNodesFragment是一个嵌套到AvailableNodesFragment的片段。

ReserveNodesFragment由AvailableNodesFragment的Button触发。 因此,没有办法从CheckAvailableNodesFragment触发回调方法 用于传递ArrayLists的ReserveNodesFragment。

因此,到目前为止,我发现使 ReserveNodesFragment 可见的CheckBox的ArrayLists的唯一方法是使ArrayLists全局声明。

但是,使ArrayLists全局化是一个优雅的解决方案吗?