InflateException: Не удалось разрешить обработчик пункта меню onClick

Я задал этот вопрос 6 лет назад. Тем временем лучшие практики разработки для Android изменились, и я стал лучшим разработчиком.

С тех пор я понял, что использование XML-атрибута onClickявляется плохой практикой, и удалил его из любой базы кода, над которой я работаю.

Все мои обработчики кликов теперь определены в коде приложения, а не в макетах XML!

Мои причины никогда не использовать onClickзаключаются в следующем:

  1. легко сделать ошибку в значении XML-атрибута onClick, что затем приведет к ошибке во время выполнения. ошибка
  2. разработчик может реорганизовать имя метода обработчика кликов, не осознавая, что он вызывается из макета (см. причину 1)
  3. выяснить, какой метод на самом деле вызывается, не всегда очевидно. Особенно, если макет используется фрагментом
  4. , разделение проблем макета и поведения — это хорошо. Использование onClickсмешивает их, что плохо!

Надеюсь, я убедил вас никогда не использовать onClickв макете :) !

Ниже приведен мой первоначальный вопрос, который является довольно хорошей иллюстрацией того, почему использование onClick— плохая идея.

===

Я определяю пункты меню в XML и пытаюсь использовать атрибут onClick, добавленный в API 11. Когда действие запускается в эмуляторе под управлением 4.0.3 возникают следующие исключения:

FATAL EXCEPTION: main
android.view.InflateException: Couldn't resolve menu item onClick handler 
    onFeedbackMenu in class android.view.ContextThemeWrapper

...
Caused by: java.lang.NoSuchMethodException: onFeedbackMenu 
    [interface com.actionbarsherlock.view.MenuItem]
at java.lang.Class.getConstructorOrMethod(Class.java:460)

Я не понимаю, что вызывает исключение, поскольку в моем действии определен следующий метод

import com.actionbarsherlock.view.MenuItem;
...
public void onFeedbackMenu( MenuItem menuItem ) { 
    Toast.makeText( this, "onFeedBack", Toast.LENGTH_LONG ).show();
}

Мой файл определения меню XML содержит:

<menu xmlns:android="http://schemas.android.com/apk/res/android" >
...
    <item
        android:id="@+id/menu_feedback"
        android:icon="@drawable/ic_action_share"
        android:showAsAction="ifRoom"
        android:title="@string/menu_feedback"
        android:onClick="onFeedbackMenu" />
</menu>

Для обратной совместимости я использую ActionBarSherlock , а также получаю очень похожее исключение при запуске приложения на 2.3.x.

Это более полная версия трассировки стека

FATAL EXCEPTION: main
android.view.InflateException: Couldn't resolve menu item onClick handler 
    onFeedbackMenu in class android.view.ContextThemeWrapper
    at com.actionbarsherlock.view.MenuInflater$InflatedOnMenuItemClickListener.<init>(MenuInflater.java:204)
    at com.actionbarsherlock.view.MenuInflater$MenuState.setItem(MenuInflater.java:410)
    at com.actionbarsherlock.view.MenuInflater$MenuState.addItem(MenuInflater.java:445)
    at com.actionbarsherlock.view.MenuInflater.parseMenu(MenuInflater.java:175)
    at com.actionbarsherlock.view.MenuInflater.inflate(MenuInflater.java:97)
    ...
Caused by: java.lang.NoSuchMethodException: onFeedbackMenu 
    [interface com.actionbarsherlock.view.MenuItem]
    at java.lang.Class.getConstructorOrMethod(Class.java:460)
    at java.lang.Class.getMethod(Class.java:915)
    at com.actionbarsherlock.view.MenuInflater$InflatedOnMenuItemClickListener.<init>(MenuInflater.java:202)
    ... 23 more
35
задан Frank Harper 10 October 2018 в 14:06
поделиться