Android 如何将从另一个片段启动的片段中的数据传输到活动

Android 如何将从另一个片段启动的片段中的数据传输到活动,android,android-fragments,android-activity,Android,Android Fragments,Android Activity,我有一个活动调用另一个fragmentA。现在这个fragmentA调用另一个fragmentB。现在我想将数据从fragmentB传输到我的活动中 定义接口(在片段中) 为了允许片段与其活动通信,您可以在片段类中定义一个接口,并在活动中实现它。片段在其onAttach()生命周期方法期间捕获接口实现,然后可以调用接口方法以便与活动通信 以下是片段到活动通信的示例: public class HeadlinesFragment extends ListFragment { OnHeadl

我有一个活动调用另一个fragmentA。现在这个fragmentA调用另一个fragmentB。现在我想将数据从fragmentB传输到我的活动中

定义接口(在片段中) 为了允许片段与其活动通信,您可以在片段类中定义一个接口,并在活动中实现它。片段在其onAttach()生命周期方法期间捕获接口实现,然后可以调用接口方法以便与活动通信

以下是片段到活动通信的示例:

public class HeadlinesFragment extends ListFragment {
    OnHeadlineSelectedListener mCallback;

    // Container Activity must implement this interface
    public interface OnHeadlineSelectedListener {
        public void onArticleSelected(int position);
    }

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);

        // This makes sure that the container activity has implemented
        // the callback interface. If not, it throws an exception
        try {
            mCallback = (OnHeadlineSelectedListener) activity;
        } catch (ClassCastException e) {
            throw new ClassCastException(activity.toString()
                    + " must implement OnHeadlineSelectedListener");
        }
    }

    ...
}
现在,片段可以通过使用OnHeadlineSelectedListener接口的mCallback实例调用onArticleSelected()方法(或接口中的其他方法)向活动传递消息

例如,当用户单击列表项时,将调用片段中的以下方法。片段使用回调接口将事件传递给父活动

@Override
public void onListItemClick(ListView l, View v, int position, long id)   {
    // Send the event to the host activity
    mCallback.onArticleSelected(position);
}
实现接口(在活动中) 为了从片段接收事件回调,承载它的活动必须实现在片段类中定义的接口

例如,以下活动实现上述示例中的接口

public static class MainActivity extends Activity
        implements HeadlinesFragment.OnHeadlineSelectedListener{
    ...

    public void onArticleSelected(int position) {
        // The user selected the headline of an article from the HeadlinesFragment
        // Do something here to display that article
    }
}

PS1:EventBus适用于您,但如果需要,请小心使用,它可能会使您的代码更难阅读


PS2:不要在Fragment.newInstance()中传递活动实例并使用它进行通信。活动实例可能在后台被销毁。在Fragment.onAttach()中获取活动实例与示例类似,框架将为您处理销毁、重新创建和重新绑定。

您可以通过在fragmentB中调用
getActivity()
来获取活动实例,并使用接口传递数据

您可以通过重写onAttach()方法来获取活动实例

方法:1

@Override
public void onAttach(Activity activity) {
    // TODO Auto-generated method stub
    super.onAttach(activity);
    this.activity=(ActivityName) activity;
}

方法:2

((ActivityName)getActivity()).setdata(yourdata);
通过这些方法,您需要在活动中创建setter方法


这是将任何片段回调到其父活动的最简单方法。Dev Doc

对此做了很好的解释。如果您认为,您将需要在应用程序的不同部分使用类似的功能,并且您不想为这只海豚编写许多接口。 你可以用

例如:

添加编译“de.greenrobot:eventbus:2.4.0”, 登记参加活动 一旦创建-

EventBus.getDefault().register(this);
和OnDestroy-

EventBus.getDefault().unregister(this);
然后添加具有接收对象参数和onEventMainThread名称的方法:

public void onEventMainThread(YourObject name) {...}
现在从任何一个你可以打电话的地方

EventBus.getDefault().post(yourObjectInstance);
活动将检测到它

或者您可以使用RxJava获得类似的效果-

实现一个接口,在活动中重写它的方法,并从将数据传递给方法的片段调用它。片段A和B是同一活动的一部分吗?是的,两个片段属于同一活动activity@milezlink可以解决这个问题。跟着它!
EventBus.getDefault().post(yourObjectInstance);