繁体   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