将数据从活动传递到已显示的片段

时间:2018-08-08 10:49:59

标签: android android-fragments android-activity

如何将数据从活动传递到已经活动的片段?我可以使用捆绑包进行传输,但是我唯一可以获取的方法是对该片段使用createView,但是我的问题是它已经创建了。无论如何,我可以将数据从活动传递到片段,然后在不使用onCreateView

的情况下调用该数据

我尝试过此link来获取所需的信息,但是由于静态原因,无法访问数据

3 个答案:

答案 0 :(得分:2)

如果已创建视图,则不会调用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);

答案 1 :(得分:2)

可以有多种方式

  • 按照 @Belbahar Raouf 所示使用 findFragmentById 获取片段实例。
  • 使用 BroadcastReceiver ActivityFragmentService之间发送数据。它无处不在。但这可能有点冗长。
  • 您可以使用 EventBus ,这是GreenBot的一项伟大发明。 只需一行即可传递数据。

    EventBus.getDefault().post(new MessageEvent());

有关实现,请参见Event bus documentation

制作将要传递的模型类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。

答案 2 :(得分:0)

根据文档:

  

主机活动可以通过捕获   使用findFragmentById()的片段实例,然后直接调用   片段的公共方法。

示例(在您的活动中声明):

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

然后在您的片段中实现将完成此操作的方法。