将数据从嵌套片段发送到父片段

我有一个包含几个Nested FragmentsFragment FR1 ; FRbFRcFRc 。 这些Nested Fragments通过在FR1的布局上按下Buttons来改变。 每个Nested Fragments都有几个input字段; 其中包括诸如EditTextsNumberPickersSpinners 。 当我的用户通过并填充Nested Fragments所有值时, FR1 (父片段)具有提交button。

那么我怎么能从我的Nested Fragments检索我的值并将它们带入FR1

  1. 所有Views都是在每个Nested Fragment中声明和编程处理的。
  2. FragmentFR1处理Nested Fragments的事务。

我希望这个问题很清楚,我不确定代码是否需要发布,但如果有人觉得不行,我可以这样做。

编辑1:

这里是我如何添加我的Nested Fragments

 tempRangeButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { getChildFragmentManager().beginTransaction() .add(R.id.settings_fragment_tertiary_nest, tempFrag) .commit(); } }); scheduleButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { getChildFragmentManager().beginTransaction() .add(R.id.settings_fragment_tertiary_nest, scheduleFrag) .commit(); } }); alertsButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { getChildFragmentManager().beginTransaction() .add(R.id.settings_fragment_tertiary_nest, alertsFrag) .commit(); } }); submitProfile.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { constructNewProfile(); } }); 

我的constructNewProfile()方法需要来自我的Nested Fragments的值。

 public Fragment tempFrag = fragment_profile_settings_temperature .newInstance(); public Fragment scheduleFrag= fragment_profile_settings_schedules .newInstance(); public Fragment alertsFrag = fragment_profile_settings_alerts .newInstance(); 

以上是指父片段的字段, 以及它们如何最初实例化。

Solutions Collecting From Web of "将数据从嵌套片段发送到父片段"

最好的方法是使用一个接口:

  1. 在嵌套片段中声明一个接口

     // Container Activity or Fragment must implement this interface public interface OnPlayerSelectionSetListener { public void onPlayerSelectionSet(List<Player> players_ist); } 
  2. 将界面附加到父代片段

     // In the child fragment. public void onAttachToParentFragment(Fragment fragment) { try { mOnPlayerSelectionSetListener = (OnPlayerSelectionSetListener)fragment; } catch (ClassCastException e) { throw new ClassCastException( fragment.toString() + " must implement OnPlayerSelectionSetListener"); } } @Override public void onCreate(Bundle savedInstanceState) { Log.i(TAG, "onCreate"); super.onCreate(savedInstanceState); onAttachToParentFragment(getParentFragment()); // ... } 
  3. 通过点击button来调用监听器。

     // In the child fragment. @Override public void onClick(View v) { switch (v.getId()) { case R.id.tv_submit: if (mOnPlayerSelectionSetListener != null) { mOnPlayerSelectionSetListener.onPlayerSelectionSet(selectedPlayers); } break; } } 
  4. 让你的父母片段实现接口。

      public class Fragment_Parent extends Fragment implements Nested_Fragment.OnPlayerSelectionSetListener { // ... @Override public void onPlayerSelectionSet(final List<Player> players_list) { FragmentManager fragmentManager = getChildFragmentManager(); SomeOtherNestFrag someOtherNestFrag = (SomeOtherNestFrag)fragmentManager.findFragmentByTag("Some fragment tag"); //Tag of your fragment which you should use when you add if(someOtherNestFrag != null) { // your some other frag need to provide some data back based on views. SomeData somedata = someOtherNestFrag.getSomeData(); // it can be a string, or int, or some custom java object. } } } 

添加标签,当你做片段事务,所以你可以查找它后来调用其方法。 FragmentTransaction

这是处理片段和嵌套片段之间通信的正确方法,它对于活动和片段几乎是一样的。 http://developer.android.com/guide/components/fragments.html#EventCallbacks

实际上还有另一种官方的方式,就是使用活动的结果,但是这个方法已经够用了,也很普遍。

而不是使用接口,你可以通过下面调用子片段:

 ( (YourFragmentName) getparentFragment() ).yourMethodName(); 

您可以使用getChildFragmentManager()并查找嵌套的片段,获取它们并运行一些方法来检索input值

在片段之间传递数据的最好方法是使用Interface。 这是你需要做的:在你嵌套的片段:

 public interface OnDataPass { public void OnDataPass(int i); } OnDataPass dataPasser; @Override public void onAttach(Activity a) { super.onAttach(a); dataPasser = (OnDataPass) a; } public void passData(int i) { dataPasser.OnDataPass(i); } 

在你的父代片段中:

 public class Fragment_Parent extends Fragment implements OnDataPass { ... @Override public void OnDataPass(int i) { this.input = i; } btnOk.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Fragment fragment = getSupportFragmentManager().findFragmentByTag("0"); ((Fragment_Fr1) fragment).passData(); } } } 

检查instanceOf之前得到父母的片段,这是更好的:

 if (getParentFragment() instanceof ParentFragmentName) { getParentFragment().Your_parent_fragment_method(); } 

在我的情况(new Fragment()).hello(); 对我来说很好的调用另一个片段函数