【问题标题】:EventBus does not update textview or button and does not show any errors?EventBus 不更新 textview 或 button 并且不显示任何错误?
【发布时间】:2017-08-02 20:36:29
【问题描述】:

当从 FragmentA 触发事件时,我正在传达 MyActivity 的两个片段(在按钮单击时)我想在 FragmentB 中将按钮状态更改为启用 true 和 textview setText("new text"),它们在我运行时位于 FragmentB我的应用输出没有显示任何错误,但没有进行任何更改。

这是触发事件的片段A:

    Fragment A
        ...//some code
         @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
            View rootView = inflater.inflate(R.layout.fragment_a, container, false);
        ...//more code inside onCreateView
          btnChange.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
        //HERE I POST THE EVENT
                    EventBus.getDefault().post(new ButtonEvent(true));
//   HERE I PUT SOUT TO SHOW IF EVENT IS FIRED
                    System.out.println("YOU FIRED THE EVENT");// THIS MSG IS SHOWN CORRECTLY
        }
      });
}

    @Subscribe
    public void onEvent(ButtonEvent event){

    }

@Override
  public void onStart() {
    super.onStart();
    if (!EventBus.getDefault().isRegistered(getActivity())) {
      EventBus.getDefault().register(this);
    }
  }

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

这是片段B

 FragmentB extends Fragment{
...//some code

 @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.fragment_b, container, false);
 btnNuevoMed= (Button) rootView.findViewById(R.id.btnNuevoMed);
    btnNuevoMed.setEnabled(false);
    txtMed= (TextView)rootView.findViewById(R.id.txtMed);
//...some other code
}
//HERE IS MI SUBSCRIBER
@Subscribe
public void onEvent(ButtonEvent event){
// HERE I PUT A SOUT TO SHOW IF REACH THE METHOD
 System.out.println("YOU ARE HEREEEEE");  //BUT NEVER REACH THIS METHOD . WHY?
    btnNuevoMed.setEnabled(event.status);
    btnNuevoMed.setText("hELLOOO");
    txtMed.setText("Modification Success");
}
 @Override
  public void onStart() {
    super.onStart();
    if (!EventBus.getDefault().isRegistered(getActivity())) {
      EventBus.getDefault().register(this);
    }
  }

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

这是我的按钮 xml

 <TextView
        android:id="@+id/txtMed"
        android:text="MEDICACION"
        style="@style/textoTitulos"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center_horizontal"/>

 <Button
        android:text="Nuevo Boton"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/btnNuevoMed"

        />

我正在使用 eventbus 3.0.0。我的代码有什么问题?我该如何解决这个问题?为什么我无法到达 listener 方法?

【问题讨论】:

    标签: android android-fragments event-bus greenrobot-eventbus-3.0


    【解决方案1】:

    试试这个:

    在片段中这样的帖子事件

    EventBus.getDefault().postSticky(new ButtonEvent(true));
    

    在 Fragment B 中这样注册订阅:

    @Subscribe(threadMode = ThreadMode.MAIN, sticky = true)
    public void onEvent(ButtonEvent event){
        //
    

    【讨论】:

    • 谢谢,我尝试了您的代码,但它粉碎了输出显示此错误:org.greenrobot.eventbus.EventBusException: Subscriber class ar.com.titaves.consultoriosapp.views.fragmentsPaciente.FragmentB 已注册到事件类 ar.com.titaves.consultoriosapp.servicios.ButtonEvent 。在我的 FragmentB 的 onStrart 方法中,你能帮帮我吗?谢谢
    • 做一件事。在片段 B 的原始代码中,使用 !EventBus.getDefault().isRegistered(this) 而不是 getActivity()。去除粘性的东西。
    • I/System.out:你在这里 I/System.out:你触发了事件。这是我的新输出,所以现在它首先进入 FragmentB 订阅者并显示其 msg,其次是 FragmentA 的 sout,这意味着它们以相反的顺序执行,但是 ir 进入 FragmentB 订阅者方法它不会更改任何按钮和txtview
    猜你喜欢
    • 1970-01-01
    • 2017-10-28
    • 1970-01-01
    • 2013-07-16
    • 1970-01-01
    • 2019-02-16
    • 2013-06-26
    • 2021-03-09
    • 1970-01-01
    相关资源
    最近更新 更多