[英]Pass data from Activity to Fragment that is already displayed
如何将数据从活动传递到已经活动的片段? 我可以使用捆绑包进行传输,但是我只能通过该片段上的createView
来获取它,但是我的问题是它已经创建了。 无论如何,我可以将数据从活动传递到片段,然后在不使用onCreateView
情况下调用该数据
我尝试了此链接以获取所需信息,但由于静态原因无法访问数据
如果已经创建视图,则不会调用onCreateview,因此您可以通过BroadcastReceiver传递数据
BroadcastReceiver receiverUpdateDownload = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
//Getdata from intent
}
};
在onCreateView中缓存您的BroadcastReceiver
IntentFilter filter = new IntentFilter("STRING_ID_FOR_BRODCAST");
getActivity().registerReceiver(receiverUpdateDownload, filter);
在onStop取消注册接收器
@Override
public void onStop() {
super.onStop();
if (receiverUpdateDownload != null) {
try {
getActivity().unregisterReceiver(receiverUpdateDownload);
} catch (Exception e) {
e.printStackTrace();
}
}
}
通过活动致电您的广播
Intent intent = new Intent("STRING_ID_FOR_BRODCAST");
intent.putExtra("key","value");
sendBroadcast(intent);
可以有多种方式
findFragmentById
获取片段实例,如@Belbahar Raouf所示。 BroadcastReceiver
在Activity
, Fragment
或Service
之间发送数据。 它无处不在。 但这可能有点冗长。 您可以使用EventBus ,这是GreenBot的一项伟大发明。 仅一行即可传递数据。
EventBus.getDefault().post(new MessageEvent());
有关实现,请参见事件总线文档 。
MessageEvent.java
的模型类。 public static class MessageEvent { /* Additional fields if needed */ }
Fragment
订阅您的侦听器。 @Subscribe(threadMode = ThreadMode.MAIN)
public void onMessageEvent(MessageEvent event) {/* Do something */};
Fragment Lifecycle
注册和注销事件总线。 @Override
public void onStart() {
super.onStart();
EventBus.getDefault().register(this);
}
@Override
public void onStop() {
super.onStop();
EventBus.getDefault().unregister(this);
}
Activity
,只是火灾事件,这将由Fragment
接收。 EventBus.getDefault().post(new MessageEvent());
在此之前,将依赖项添加到gradle。
implementation 'org.greenrobot:eventbus:3.1.1'
它适用于
Activity
,Fragment
和Services
。 您无需制作具有多种意图类型的多个广播接收器。 只需在一行代码中发布事件即可。
根据文件:
主机活动可以通过使用findFragmentById()捕获Fragment实例将消息传递到片段,然后直接调用该片段的公共方法。
示例(在您的活动中声明):
ArticleFragment articleFrag = (ArticleFragment)
getSupportFragmentManager().findFragmentById(R.id.article_fragment);
if (articleFrag != null) {
// If article frag is available
// Call a method in the ArticleFragment to update its content
articleFrag.updateArticleView(position);
}
并在您的片段中实现将完成此操作的方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.