[英]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.