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

时间:2012-08-24 06:06:42

标签: android android-fragments

在我的应用中,我有两个片段说 fragmentA FragmentB 。当我点击 fragmetA 中的按钮时,会在 fragmentB 中打开一个列表。现在,当我从 fragmentB 的列表中选择一个项目时,我希望将结果传递给 fragmentA 。我只对所有片段使用一个TabActivity。当在 fragmentB 中选择列表项时,我会从堆栈中弹出 fragmentB ,以便我可以直接返回 fragmentA

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

感谢。

4 个答案:

答案 0 :(得分:18)

<强>更新

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

片段将作为其托管的sub-controller视图。所有事件和它自己的观点之间的沟通,片段应该处理自己。如果在片段的范围和职责之外存在事件(例如将数据发送到另一个片段),则应将该事件升级到其父控制器Activity。

<强>旧

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

最好让活动对其片段应用更改,而不是直接在片段之间传递值。让您的Activity使用FragmentListeneronQuery(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.");
    }
  }

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

另外,请记得在fragmentListener中发布onDetach()引用。

现在您可以从片段中调用您的活动。

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

答案 1 :(得分: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);
    }
}
}

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

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);

答案 2 :(得分:0)

在fragmentB.java中设置OnClickListener以在主类中执行方法。将fragmentB.java中的争论传递给作为变量的主类,并在主类中处理其余部分。虽然片段根本不应该依赖于活动。片段可以在任何地方进行即插即用。

此示例显示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
}

您所要做的就是实现正确类型的侦听器,但显示的是主要内容。在一个片段活动中,调用方法并将变量传递给主活动。如果您愿意,可以从主活动中将其发送到您的其他片段活动。

答案 3 :(得分:0)

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