2014-03-09 6 views
3

Я пытаюсь Отто на Android, и я пытаюсь отправить сообщение из моего фрагмента в Activity. Вот основы моего кода:Абонент не запускается при использовании Otto

Мой поставщик Автобус:

public final class BusProvider { 

private static final Bus mInstance = new Bus(); 

private BusProvider() {} 

public static Bus getBusProviderInstance() { 
    return mInstance; 
} 
} 

Моя активность имеет следующий код:

public class MyActivity 
     extends BaseActivity { 

    // .... 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 

     super.onCreate(savedInstanceState); 
     BusProvider.getBusProviderInstance().register(this); 
     // .... 
    } 

    @OnClick(R.id.profile_image) 
    public void onImageClicked() { 

     // ... 

     MyFragment fragment = MyFragment.newInstance(choices); 
     fragment.show(getFragmentManager(), "myChoices"); 
    } 

    @Subscribe 
    public void onButtonChoicePicked(MyFragment.ChoicePickedEvent event) { 
     Toast.makeText(this, "reaching here", Toast.LENGTH_SHORT).show(); 
    } 

    @Override 
    protected void onStop() { 
     super.onStop(); 
     BusProvider.getBusProviderInstance().unregister(this); 
    } 

    // ... 
} 

и эти важные фрагменты кода из моего фрагмента:

public class MyFragment 
     extends BaseDialogFragment { 

     // ... 

     @Override 
     public View onCreateView(LayoutInflater inflater, 
           ViewGroup container, 
           Bundle savedInstanceState) { 

      LinearLayout layout = (LinearLayout) inflater.inflate(R.layout.dialog_choices, 
                    container, 
                    false); 
      setupDialogButtons(inflater, layout); 
      return layout; 
     } 



    private void setupDialogButtons(LayoutInflater inflater, LinearLayout parentView) { 
     ChoiceButtonViewHolder holder; 

     holder = new ChoiceButtonViewHolder(inflater, parentView); 
     holder.populateContent("First Choice", 1); 

     parentView.addView(holder.mChoiceTextView); 
    } 


    class ChoiceButtonViewHolder { 

     @InjectView(R.id.item_dialog_choice_desc) TextView mChoiceTextView; 
     private int mPosition; 

     ChoiceButtonViewHolder(LayoutInflater inflater, ViewGroup container) { 
      TextView mChoiceTextView = (TextView) inflater.inflate(R.layout.item_dialog_choice, container, false); 
      ButterKnife.inject(this, mChoiceTextView); 
     } 

     public void populateContent(String choiceDesc, int position) { 
      mChoiceTextView.setText(choiceDesc); 
      mPosition = position; 
     } 

     @OnClick(R.id.item_dialog_choice_desc) 
     public void onChoiceClicked() { 
      MyFragment.this.mDialog.dismiss(); 
      BusProvider.getBusProviderInstance().post(new ChoicePickedEvent(1)); 
     } 
    } 



    public static class ChoicePickedEvent { 
     public int mPositionClicked; 
     ChoicePickedEvent(int position) { 
      mPositionClicked = position; 
     } 
    } 
} 

У меня нет ошибок. Но когда я нажимаю на кнопку из фрагмента, событие onButtonChoicePicked не вызывается.

Я что-то не так? Я не понимаю, как работает Отто? Это странное сочетание ButterKnife и Otto, что делает его неработоспособным?

+0

Вы использовали точку останова или войти 'onChoiceClicked()' от вашего фрагмента убедитесь, что он выполняется? –

+0

Эй, Брайан, когда я отлаживаю. Я получаю onChoiceClicked, вызывается getBusProviderInstance(). Post. Но после этого ничего не происходит. Диалог отклоняется, но метод Activity не вызывается. –

+0

Используется ли 'MyActivity' напрямую, или это родительский класс, от которого распространяются другие действия? –

ответ

7

Пример кода работает без каких-либо проблем независимо. Причина, по которой я столкнулся с этой проблемой вначале (как было справедливо указано @ powerj1984): в моем проекте была неправильная конфигурация, где автобус, который вводился (через кинжал), отличался от экземпляра шины, на который подписались Обновления: P.

Извлеченный урок: убедитесь, что используемая вами шина - это тот же экземпляр в обоих случаях.

+2

Такая же проблема. Гуавский автобус событий @ Подписывалась аннотация, а не Отто – prometheuspk

8

Убедитесь, что вы импортируете «com.squareup.otto.Subscribe» не «com.google.common.eventbus.Subscribe»