onOptionsItemSelected не вызывается из фрагмента

#java #android

#java #Android

Вопрос:

По какой-то причине мой optionItemSelected не вызывается, когда я нажимаю связанную с ним кнопку. Журнал timber не вызывается, но он появляется в журналах сразу после нажатия кнопки:

 D/ViewRootImpl@ba4d36e[POIHistoryFlowActivity]: ViewPostImeInputStage processPointer 0
D/ViewRootImpl@ba4d36e[POIHistoryFlowActivity]: ViewPostImeInputStage processPointer 1
 

Вот код, который у меня есть:

     @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setHasOptionsMenu(true);
    }

    @Override
    public void onCreateOptionsMenu(final Menu menu, final MenuInflater inflater) {
        inflater.inflate(R.menu.activity_recent_destinations, menu);
        Timber.d("Menu was inflated");
    }

    @Override
    public boolean onOptionsItemSelected(final MenuItem item) {
        switch (item.getItemId()) {
            case R.id.menu_action_item_clear:
                Timber.d("Clear button was clicked");
                // clear the destinations
                return true;

            default:
                return super.onOptionsItemSelected(item);
        }
    }
 

В подобных фрагментах родительская активность не переопределяет ни onCreateOptionsItem() nor onOptionsItemSelected() , но связанные с ними кнопки работают, в то время как в этом фрагменте они этого не делают, и после проверки всего с помощью отладчика я не понимаю, в чем может быть основная причина. Любая помощь была бы мне очень признательна!

обновление: activity_recent_destinations.xml

 <?xml version="1.0" encoding="utf-8"?>
<menu
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <item
        android:id="@ id/menu_action_item_clear"
        android:title="@string/menu_item_title_clear"
        app:actionLayout="@layout/action_item_clear"
        app:showAsAction="always" />
</menu>
 

Комментарии:

1. Можете ли вы опубликовать как код для действия хоста, так и содержимое для R.menu.activity_recent_destinations ?

2. Обновлено по запросу

3. Итак, вы используете app:actionLayout . Является ли кнопка, на которую вы на самом деле нажимаете, внутри этого макета? Если это так, вы не получите обратный вызов для самого элемента меню. Вам нужно получить ссылку на раздутое представление и добавить стандартный прослушиватель кликов.

Ответ №1:

Вы используете «макет действия» для этого элемента. Это просто будет действовать как обычное представление, и нажатие на него не вызовет onOptionsItemSelected обратного вызова. Вы должны получить ссылку на сам макет и добавить прослушиватель щелчков:

 @Override
public void onCreateOptionsMenu(final Menu menu, final MenuInflater inflater) {
    inflater.inflate(R.menu.activity_recent_destinations, menu);
    MenuItem item = menu.findItem(R.id.menu_action_item_clear);
    View actionView = item.getActionView();
    // Set the listener on the root view or any children if necessary
    actionView.setOnClickListener(...);
}
 

Комментарии:

1. Я бы вообще сделал это внутри onCreateOptionsMenu , да. Позвольте мне обновить ответ, чтобы сделать его более явным.

2. Похоже, вы делаете это из метода createOptionsMenu. Большое вам спасибо!!