24

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

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

谢谢。

4

4 回答 4

17

更新

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

片段将充当其托管的视图的子控制器。所有的事件和它自己的视图之间的通信,片段应该自己处理。当有一个片段的范围和职责之外的事件(比如向另一个片段发送数据)时,该事件应该升级到它的父控制器,即 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.");
    }
  }

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

另外,请记住fragmentListeneronDetach().

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

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

于 2012-08-24T08:20:54.733 回答
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);
于 2012-08-24T07:47:18.950 回答
0

在 fragmentB.java 中设置一个 OnClickListener 来执行主类中的方法。将 fragmentB.java 中的参数传递给作为变量的主类,并在主类中处理其余部分。尽管片段根本不应该真正依赖于活动。片段可以在任何地方即插即用。

此示例显示 EditTextListener:

myAwesomeActivity.java

片段A.java

片段B.java

片段B.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
}

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

于 2012-08-24T06:12:29.213 回答
0

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

于 2017-02-02T15:24:53.390 回答