如何将第二个片段的结果传递给第一个片段

在我的应用程序,我有两个片段说fragmentAFragmentB 。 当我点击fragmetA中的一个button时,在fragmentB中打开一个列表。 现在,当我从fragmentB中的列表中select一个项目时,我想将结果传递给fragmentA 。 我只使用一个TabActivity为所有片段。 当在fragmentB中select列表项目时,我会从stack中popupfragmentB ,以便我可以直接返回到fragmentA

有谁知道如何将结果传递给以前的片段。

谢谢。

Solutions Collecting From Web of "如何将第二个片段的结果传递给第一个片段"

更新

Activity是父控制器 ,应该负责处理fragment / views引发的事件,这些事件涉及片段/视图本身范围以外的内容。

片段是充当它所托pipe的视图的子控制器 。 所有的事件和自己的观点之间的沟通,片段应该处理好自己。 当一个事件在一个片段的范围和职责之外(比如将数据发送到另一个片段)时,该事件应该升级到其父控制器Activity。

从这个教程: http : //developer.android.com/guide/components/fragments.html#CommunicatingWithActivity

最好让活动将更改应用于其片段,而不是直接在片段之间传递值。 让Activity使用onQuery(Bundle data)onResult(Bundle data)方法实现一个FragmentListener接口。

在每个FragmentListener中创build一个FragmentListenervariables,然后覆盖每个片段的onAttach()

  public void onAttach(Activity activity) { super.onAttach(activity); //---register parent activity for events--- try{ fragmentListener = (FragmentListener) activity; }catch (ClassCastException e) { throw new ClassCastException("Parent activity must implement interface FragmentListener."); } } 

这将强制您的子片段被自动注册到父Activity。

另外,请记住在onDetach()释放fragmentListener引用。

现在你可以从碎片中调用你的Activity。

另一方面,您的Activity可以使用getFragmentManager().findFragmentByTag("fragmentA")findFragmentById("FragmentA") 。 如果它能find你的片段,那么它可以将它投射到你的FragmentA类并调用它的方法。 与FragmentB或其他任何片段一样可以完成。

其中一个可能的解决scheme:

 public class DetachableResultReceiver extends ResultReceiver { private Receiver mReceiver; public DetachableResultReceiver(Handler handler) { super(handler); } public void clearReceiver() { mReceiver = null; } public void setReceiver(Receiver receiver) { mReceiver = receiver; } public interface Receiver { public void onReceiveResult(int resultCode, Bundle resultData); } @Override protected void onReceiveResult(int resultCode, Bundle resultData) { if (mReceiver != null) { mReceiver.onReceiveResult(resultCode, resultData); } } } 

第一个片段实现DetachableResultReceiver.Receiver并创buildDetachableResultReceiver对象:

 mReceiver = new DetachableResultReceiver(new Handler()); mReceiver.setReceiver(this); 

然后你可以把它传递给第二个片段参数:

 Bundle bundle = new Bundle(); bundle.putParcelable(Consts.EXTRA_RECEIVER, receiver); fragment.setArguments(bundle); 

并在第二个片段中使用它:

 receiver = getArguments().getParcelable(Consts.EXTRA_RECEIVER); receiver.send(Consts.SOME_MESSAGE, someData); 

在fragmentB.java中设置一个OnClickListener来在主类中执行一个方法。 将fragmentB.java中的一个parameter passing给作为variables的主类,并在主类中处理其余部分。 虽然碎片不应该完全依赖于活动。 片段被制作成可以随地插入和播放。

本例显示EditTextListener:

myAwesomeActivity.java

fragmentA.java

fragmentB.java

fragmentB.java:

 @Override public void onActivityCreated(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onActivityCreated(savedInstanceState); int x = 3; EditText ed1 = (EditText) getView().findViewById(R.id.editText1); ed1.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { if (MotionEvent.ACTION_UP == event.getAction()) { ((myAwesomeActivity) getActivity()).myMethod(x); } return false; } }); } 

myAwesomeActivity.java:

 publiv void myMethod (int x){ //Do whatever you want with variable } 

你所要做的就是实现正确的监听器types,但是要显示的重点。 在一个片段活动中,调用一个方法并将一个variables传递给主活动。 从主要活动,你可以发送到你的其他片段活动,如果你愿意。

您也可以使用SharedPreferences来保存一些string,并在返回到第一个片段后加载并清除。