我有一个调用另一个fragmentA的活动。现在这个fragmentA调用另一个fragmentB。现在我想将数据从fragmentB传输到我的活动
答案 0 :(得分:2)
检查一下:Communicating with Other Fragments
要允许Fragment与其Activity进行通信,您可以在Fragment类中定义接口并在Activity中实现它。 Fragment在其onAttach()生命周期方法中捕获接口实现,然后可以调用Interface方法以与Activity通信。
以下是片段到活动通信的示例:
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()中的活动实例一样,框架将处理destroy&重建&为你重新绑定。
答案 1 :(得分:1)
您可以通过覆盖onAttach()方法获取Activity实例
方法:1
private Mail m;
m = new Mail("tester@hotmail.com", "passtester");
String[] toArr = {"test@hotmail.com"};
m.setTo(toArr);
m.setFrom("test@hotmail.com");
m.setSubject("Subject");
m.setBody(""+ticket_id \n ""+Here put image[bytes?] );
和
@Override
public void onAttach(Activity activity) {
// TODO Auto-generated method stub
super.onAttach(activity);
this.activity=(ActivityName) activity;
}
或
方法:2
activity.setdata(yourdata);
在这些方面,您需要在活动中创建一个setter方法
这是从任何片段到其父活动进行回调的最简单方法。很好地解释了Dev Doc here
答案 2 :(得分:0)
您可以通过调用fragmentB中的getActivity()
来获取活动的实例,并使用接口传递数据。
答案 3 :(得分:0)
您可以使用 EventBus ,如果您认为,您需要在应用的不同部分使用类似功能,并且您不想为此海豚编写许多界面。 您可以使用https://github.com/greenrobot/EventBus
示例:
添加编译' de.greenrobot:eventbus:2.4.0', 注册活动 OnCreate -
EventBus.getDefault().register(this);
和OnDestroy-
EventBus.getDefault().unregister(this);
添加一个带有接收对象参数和onEventMainThread名称的方法:
public void onEventMainThread(YourObject name) {...}
现在你可以致电
EventBus.getDefault().post(yourObjectInstance);
活动会检测到它。
或者您可以使用 RxJava 来获得类似的效果 - http://nerds.weddingpartyapp.com/tech/2014/12/24/implementing-an-event-bus-with-rxjava-rxbus/