如何将结果从第二个片段传递到第一个片段

abh*_*hek 24 android android-fragments

在我的应用程序中,我有两个片段,分别是fragmentAFragmentB.当我点击fragmetA中的按钮时,会在fragmentB中打开一个列表.现在,当我从fragmentB中的列表中选择一个项目时,我希望将结果传递给fragmentA.我只对所有片段使用一个TabActivity.当在fragmentB中选择列表项时,我从堆栈中弹出fragmentB,这样我就可以直接返回fragmentA了.

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

谢谢.

S.D*_*.D. 17

更新

Activity是父控制器,应该负责处理由其片段/视图引发的事件,这些事件涉及片段/视图本身范围之外的事物.

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

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

最好让活动对其片段应用更改,而不是直接在片段之间传递值.让您的Activity实现与方法的FragmentListener接口.onQuery(Bundle data)onResult(Bundle data)

FragmentListener在每个片段中创建一个变量,然后覆盖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.");
    }
  }
Run Code Online (Sandbox Code Playgroud)

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

另外,请记得发布fragmentListener参考资料onDetach().

现在,您可以从片段中调用Activity.

另一方面,您的活动始终可以使用getFragmentManager().findFragmentByTag("fragmentA")或搜索片段findFragmentById("FragmentA").如果它可以找到你的片段,那么它可以将它转换为你的FragmentA类并调用它的方法.可以使用FragmentB或任何其他片段完成相同的操作.


小智 7

一种可能的解决方案:

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);
    }
}
}
Run Code Online (Sandbox Code Playgroud)

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

mReceiver = new DetachableResultReceiver(new Handler());
mReceiver.setReceiver(this);
Run Code Online (Sandbox Code Playgroud)

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

Bundle bundle = new Bundle();
bundle.putParcelable(Consts.EXTRA_RECEIVER, receiver);
fragment.setArguments(bundle);
Run Code Online (Sandbox Code Playgroud)

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

receiver = getArguments().getParcelable(Consts.EXTRA_RECEIVER);
receiver.send(Consts.SOME_MESSAGE, someData);
Run Code Online (Sandbox Code Playgroud)