当前位置: 首页 > 知识库问答 >
问题:

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

张瀚漠
2023-03-14

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

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

谢谢

共有3个答案

弘承运
2023-03-14

在片段B中。java设置OnClickListener以在主类中执行方法。以零碎的形式通过辩论。java调用作为变量的主类,并在主类中处理它的其余部分。尽管片段不应该真正依赖于活动。碎片可以在任何地方即插即用。

此示例显示EditTextListener:

我的惊人活动。JAVA

java文档

碎片B。JAVA

碎片B。爪哇:

@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
}

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

潘修文
2023-03-14

可能的解决方案之一:

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

第一个片段实现了DetaccableResultReceiver。接收器并创建可分离的ResultReceiver对象:

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);
欧阳衡
2023-03-14

更新

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

片段将充当它所承载的视图的子控制器。所有事件和它自己视图之间的通信,片段都应该自己处理。当有一个事件超出了片段的范围和职责(比如向另一个片段发送数据)时,该事件应该升级到它的父控制器活动。

古老的

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

与其在片段之间直接传递值,不如让活动对其片段应用更改。让您的活动使用onQuery(Bundle data)onResult(Bundle data)方法实现一个FragmentListener接口

在每个片段中创建FragmentListenervaraible,然后将每个片段的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.");
    }
  }

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

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

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

另一方面,您的活动总是可以使用getFragmentManager(). findFragmentByTag("片段A")findFragmentById("片段A")搜索片段。如果它能找到您的片段,那么它可以将其强制转换到您的FragmentA类中并调用其方法。FragmentB或任何其他片段也可以这样做...

 类似资料: