从已显示的Activity向Fragment传递数据

4
如何将数据从活动(activity)传递到已经激活的片段(fragment)?我可以使用 bundle 进行传输,但是我唯一能够获取数据的方式是在该片段上使用 createView,但问题是该片段已经被创建。有没有办法从活动(activity)传递数据到片段,并在不使用 onCreateView 的情况下调用该数据?
我尝试了这个链接来获取所需内容,但由于静态原因,无法访问数据。

通过回调接口进行通信,请查看此处:https://dev59.com/O2Yq5IYBdhLWcg3wui_F - Vadim Eksler
你应该看一下我回答中的事件总线。这是我发现的最简单的解决方案。 - Khemraj Sharma
@Khemraj 当然,目前正在阅读它,并且加1。 - myown email
3个回答

3

有多种方法可以实现:

  • 通过使用 findFragmentById 获取片段实例,如@Belbahar Raouf所示。
  • 使用 BroadcastReceiverActivityFragmentService之间发送数据。它可以在任何地方工作。但可能有点冗长。
  • 你可以使用来自GreenBot的伟大发明——EventBus,只需一行代码即可传递数据。

    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 生命周期注册和注销事件总线。

@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的最大优点-

它可以在 Activity, FragmentServices 中使用。您不需要创建多个具有多个意向类型的广播接收器。只需在一行代码中发布事件即可。

我也使用EventBus以方便使用。


2
如果视图已经创建,则不会调用onCreateview,因此您可以通过BroadcastReceiver传递数据。
 BroadcastReceiver receiverUpdateDownload = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            //Getdata from intent
        }
    };

在onCreateView中注册您的广播接收器

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);

我应该在Activity和Fragment中放置什么代码? - myown email
你需要在你的fragment中放置BroadcastReceiver,只需将sendBrodcast(ans中的最后一行代码)放置在activity中,每当你调用Intent intent = new Intent("STRING_ID_FOR_BRODCAST");时,它就会触发你的BroadcastReceiver。 - PriyankVadariya
1
每一口都能感受到你的非凡之处,哈哈哈,太谢谢啦!:D - myown email
如果我想从Activity发送数据到Fragment,我该怎么做? - masoud jafari
@masoudmjm 在 Activity 中可以创建 Fragment 对象,并在已创建的 Fragment 中创建带有参数的公共方法(如果已经创建了 Fragment),否则可以创建 Fragment 实例以传递数据。 - PriyankVadariya
显示剩余3条评论

0
根据文档:

主机活动可以通过使用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);
        }

在你的片段中实现这个方法,它会解决问题。

是的,这就是您想要发送数据的片段。 - Belbahar Raouf
我不知道,但当我写它时,它会变成红色,尽管它已经存在。 - myown email

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接