簡體   English   中英

將數據從活動傳遞到已顯示的片段

[英]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所示。
  • 使用BroadcastReceiverActivityFragmentService之間發送數據。 它無處不在。 但這可能有點冗長。
  • 您可以使用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'

EventBus最好的東西-

它適用於ActivityFragmentServices 您無需制作具有多種意圖類型的多個廣播接收器。 只需在一行代碼中發布事件即可。

我也使用EventBus以便於使用。

根據文件:

主機活動可以通過使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM