使用EventBus从活动中将数据发送到片段

时间:2018-01-16 13:32:07

标签: java android

我查看了有关此问题的所有问题和答案。但是我无法找到问题的答案。

我有FragmentMyFragment。其中buttontextView。我希望当我点击该按钮时,它会打开MyActivity并带有两个按钮:cancelButtonsaveButton。当我点击cancelButtonsaveButton完成后,此ActivitytextView中的MyFragment将更改为我在MyActivity中发送的内容,例如“取消点击”或“保存点击”。

我做了什么:

MyFragment

@Override
public void onResume() {
    super.onResume();
    EventBus.getDefault().register(this);
}

@Override
public void onPause() {
    super.onPause();
    EventBus.getDefault().unregister(this);
}

@Subscribe
public void onSaveEvent(Message message) {
    textView.setText(message.getMessage());
};

@Subscribe
public void onCancelEvent(Message message) {
    textView.setText(message.getMessage());
};

MyActivity

@OnClick(R.id.saveBtn)
public void saveClick(){
    finish();
    EventBus.getDefault().postSticky(new Message("Save clicked!"));
}

@OnClick(R.id.cancelBtn)
public void cancelClick(){
    finish();
    EventBus.getDefault().postSticky(new Message("Cancel Clicked"));
}

但它不起作用我认为是因为当我开始MyActivity时,Event Bus onPause()中的注册表无法接收事件

我尝试使用接口,但它有效。但我希望用EventBus

来实现它

我如何才能Event Bus

2 个答案:

答案 0 :(得分:1)

您可以使用StickyEvents解决此问题。

Fragment

@Subscribe(sticky = true, threadMode = ThreadMode.MAIN)
public void onEvent(Message message) {
    Message stickyEvent = EventBus.getDefault().getStickyEvent(Message.class);
    if(stickyEvent != null) {
        tv.setText(message.getMessage());
        EventBus.getDefault().removeStickyEvent(stickyEvent);
    }
};

答案 1 :(得分:0)

  1. 根据this,您应该在onStart和onStop上注册和取消注册。

  2. 我认为您应该在活动中调用finish()之前发布事件。