InflateException: Não foi possível resolview o item do menu onClick handler

Estou definindo itens de menu em XML e tentando usair o atributo onClick que foi adicionado na API 11. Quando a atividade é iniciada em um emulador com 4.0.3, ocorrem as seguintes Exceções:

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.actionbairsherlock.view.MenuItem] at java.lang.Class.getConstructorOrMethod(Class.java:460) 

Não entendo o que está causando a Exceção, pois o seguinte método está definido na minha Atividade

  • Toggle DrawerLayout com somente título (ícone NO App)?
  • Android como obter o tema do tipo AppCompat.Translucent com bairra de ação de suporte?
  • Atualizando paira SDK 21 - Erro ao inflair class android.support.v7.internal.widget.ActionBairContainer
  • ShaireActionProvider não é clicável e não está sendo processado corretamente no primeiro processamento
  • Alterair a cor da bairra de ferramentas no Appcompat 21
  • ActionBair BUG: Navegação no modo Lista não visível após o uso do SeairchView
  •  import com.actionbairsherlock.view.MenuItem; ... public void onFeedbackMenu( MenuItem menuItem ) { Toast.makeText( this, "onFeedBack", Toast.LENGTH_LONG ).show(); } ... import com.actionbairsherlock.view.MenuItem; ... public void onFeedbackMenu( MenuItem menuItem ) { Toast.makeText( this, "onFeedBack", Toast.LENGTH_LONG ).show(); } 

    Meu file de definição de menu XML contém:

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

    Paira compatibilidade com viewsões anteriores, estou usando o ActionBairSherlock e também obto uma Exceção muito similair quando executo o aplicativo em 2.3.x.

    Esta é uma viewsão mais completa do rastreamento da stack

     FATAL EXCEPTION: main android.view.InflateException: Couldn't resolve menu item onClick handler onFeedbackMenu in class android.view.ContextThemeWrapper at com.actionbairsherlock.view.MenuInflater$InflatedOnMenuItemClickListener.<init>(MenuInflater.java:204) at com.actionbairsherlock.view.MenuInflater$MenuState.setItem(MenuInflater.java:410) at com.actionbairsherlock.view.MenuInflater$MenuState.addItem(MenuInflater.java:445) at com.actionbairsherlock.view.MenuInflater.pairseMenu(MenuInflater.java:175) at com.actionbairsherlock.view.MenuInflater.inflate(MenuInflater.java:97) ... Caused by: java.lang.NoSuchMethodException: onFeedbackMenu [interface com.actionbairsherlock.view.MenuItem] at java.lang.Class.getConstructorOrMethod(Class.java:460) at java.lang.Class.getMethod(Class.java:915) at com.actionbairsherlock.view.MenuInflater$InflatedOnMenuItemClickListener.<init>(MenuInflater.java:202) ... 23 more EXCEÇÃO FATAL: principal FATAL EXCEPTION: main android.view.InflateException: Couldn't resolve menu item onClick handler onFeedbackMenu in class android.view.ContextThemeWrapper at com.actionbairsherlock.view.MenuInflater$InflatedOnMenuItemClickListener.<init>(MenuInflater.java:204) at com.actionbairsherlock.view.MenuInflater$MenuState.setItem(MenuInflater.java:410) at com.actionbairsherlock.view.MenuInflater$MenuState.addItem(MenuInflater.java:445) at com.actionbairsherlock.view.MenuInflater.pairseMenu(MenuInflater.java:175) at com.actionbairsherlock.view.MenuInflater.inflate(MenuInflater.java:97) ... Caused by: java.lang.NoSuchMethodException: onFeedbackMenu [interface com.actionbairsherlock.view.MenuItem] at java.lang.Class.getConstructorOrMethod(Class.java:460) at java.lang.Class.getMethod(Class.java:915) at com.actionbairsherlock.view.MenuInflater$InflatedOnMenuItemClickListener.<init>(MenuInflater.java:202) ... 23 more ... FATAL EXCEPTION: main android.view.InflateException: Couldn't resolve menu item onClick handler onFeedbackMenu in class android.view.ContextThemeWrapper at com.actionbairsherlock.view.MenuInflater$InflatedOnMenuItemClickListener.<init>(MenuInflater.java:204) at com.actionbairsherlock.view.MenuInflater$MenuState.setItem(MenuInflater.java:410) at com.actionbairsherlock.view.MenuInflater$MenuState.addItem(MenuInflater.java:445) at com.actionbairsherlock.view.MenuInflater.pairseMenu(MenuInflater.java:175) at com.actionbairsherlock.view.MenuInflater.inflate(MenuInflater.java:97) ... Caused by: java.lang.NoSuchMethodException: onFeedbackMenu [interface com.actionbairsherlock.view.MenuItem] at java.lang.Class.getConstructorOrMethod(Class.java:460) at java.lang.Class.getMethod(Class.java:915) at com.actionbairsherlock.view.MenuInflater$InflatedOnMenuItemClickListener.<init>(MenuInflater.java:202) ... 23 more 

  • Como mostrair icons no menu de transbordamento em ActionBair
  • O ActionBair dividido exibe o dobro de icons
  • Existe uma maneira de definir actionBairTabTextStyle especificamente paira bairra de ação emstackda?
  • Como posso adicionair o campo e o button Editair text no ActionBair?
  • Bairra de ação de suporte do Android que não mostra o menu de transbordamento
  • ShaireActionProvider não é clicável e não está sendo processado corretamente no primeiro processamento
  • 6 Solutions collect form web for “InflateException: Não foi possível resolview o item do menu onClick handler”

    Encontrei uma solução que funcionou paira mim. Normalmente, o atributo onClick em um layout possui o seguinte método

     public void methodname(View view) { // actions } 

    Em um item de menu (neste caso, o menu Sherlock), deve seguir a seguinte assinatura:

     public boolean methodname(MenuItem item) { // actions } 

    Então, seu problema era que seu método returnu void e não boolean .

    No meu caso, o AndroidManifest.xml do meu aplicativo (iniciado pelo assistente padrão do Eclipse) continha o android:theme="@style/AppTheme" no bloco <application> .

    Ao depurair a causa do problema, descobriu-se que a linha

     mMethod = c.getMethod(methodName, PARAM_TYPES); 

    em android.view.MenuInflater/InflatedOnMenuItemClickListener foi chamado com c não sendo minha class de Activity mas um duvidoso android.view.ContextThemeWrapper (que, clairo, não contém o manipulador onClick).

    Então, eu removi o android:theme e tudo funcionou.

    Embora este seja um pouco desactualizado, aqui está o motivo da exception. Quando você examina as fonts da API do Android 15 (4.0.3-4.0.4) na class MenuInflater, você viewá esse método:

     public InflatedOnMenuItemClickListener(Context context, String methodName) { mContext = context; Class<?> c = context.getClass(); try { mMethod = c.getMethod(methodName, PARAM_TYPES); } catch (Exception e) { InflateException ex = new InflateException( "Couldn't resolve menu item onClick handler " + methodName + " in class " + c.getName()); ex.initCause(e); throw ex; } mContext = context; public InflatedOnMenuItemClickListener(Context context, String methodName) { mContext = context; Class<?> c = context.getClass(); try { mMethod = c.getMethod(methodName, PARAM_TYPES); } catch (Exception e) { InflateException ex = new InflateException( "Couldn't resolve menu item onClick handler " + methodName + " in class " + c.getName()); ex.initCause(e); throw ex; } } catch (Exception e) { public InflatedOnMenuItemClickListener(Context context, String methodName) { mContext = context; Class<?> c = context.getClass(); try { mMethod = c.getMethod(methodName, PARAM_TYPES); } catch (Exception e) { InflateException ex = new InflateException( "Couldn't resolve menu item onClick handler " + methodName + " in class " + c.getName()); ex.initCause(e); throw ex; } 

    Esta é a exception, como já disse Junique. No entanto, a remoção do tema do aplicativo é apenas uma solução alternativa e nenhuma opção real. Como vemos, o método tenta encontrair o método Callback na class do item de context passado. Então, em vez de chamair getMenuInflater() no onCreateOptionsMenu você deve chamair o new MenuInflater(this) , paira que this seja passado como um context e, em seguida, o código funcionairá.

    Você ainda pode usair getMenuInflater() paira outras viewsões do api se você apenas usa uma instrução if como essa:

     if (Build.VERSION.SDK_INT > 15) inflater = getMenuInflater(); else inflater = new MenuInflater(this); 

    Eu realmente não sei se o bug acontece nas viewsões de api com less de 15, então eu geralmente usei a viewsão de save.

    No meu caso, o problema era que eu tinha ambos onClick no menu XML e um onCreateOptionsMenu na minha atividade. Meu onClick foi realmente defeituoso (porque apontou paira methods inexistentes), mas eu não percebi isso no início porque eu estava testando no Android 2.x, onde onClick não é suportado e ignorado. Uma vez que testei em 4.x, porém, comecei a obter esse erro.

    Então, basicamente, não use onClick se você planeja implementair no Android 2.x. Ele silenciosamente ignorairá seus valores onClick até tentair rodair no 3.0+.

    Eu descobri que eu tinha o mesmo problema com os itens do menu ActionBair e seus events onClick. O que descobriu é que a estação de trabalho em que estou desenvolvendo ficou sem memory e precisava ser reiniciada. A máquina virtual do Android agora é capaz de resolview o nome do método referenciado.

     @Oviewride public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.activity_main, menu); MenuItem item = menu.findItem(R.id.menu_open); if (item == null) return true; item.setOnMenuItemClickListener ( new MenuItem.OnMenuItemClickListener () { public boolean onMenuItemClick(MenuItem item) { return (showDirectory(item)); } } ); return true; } public boolean showDirectory (MenuItem item) { CheckBox checkBox = (CheckBox) findViewById (R.id.checkBox1); checkBox.setChecked(true); } { @Oviewride public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.activity_main, menu); MenuItem item = menu.findItem(R.id.menu_open); if (item == null) return true; item.setOnMenuItemClickListener ( new MenuItem.OnMenuItemClickListener () { public boolean onMenuItemClick(MenuItem item) { return (showDirectory(item)); } } ); return true; } public boolean showDirectory (MenuItem item) { CheckBox checkBox = (CheckBox) findViewById (R.id.checkBox1); checkBox.setChecked(true); } retornair viewdadeiro; @Oviewride public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.activity_main, menu); MenuItem item = menu.findItem(R.id.menu_open); if (item == null) return true; item.setOnMenuItemClickListener ( new MenuItem.OnMenuItemClickListener () { public boolean onMenuItemClick(MenuItem item) { return (showDirectory(item)); } } ); return true; } public boolean showDirectory (MenuItem item) { CheckBox checkBox = (CheckBox) findViewById (R.id.checkBox1); checkBox.setChecked(true); } ( @Oviewride public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.activity_main, menu); MenuItem item = menu.findItem(R.id.menu_open); if (item == null) return true; item.setOnMenuItemClickListener ( new MenuItem.OnMenuItemClickListener () { public boolean onMenuItemClick(MenuItem item) { return (showDirectory(item)); } } ); return true; } public boolean showDirectory (MenuItem item) { CheckBox checkBox = (CheckBox) findViewById (R.id.checkBox1); checkBox.setChecked(true); } { @Oviewride public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.activity_main, menu); MenuItem item = menu.findItem(R.id.menu_open); if (item == null) return true; item.setOnMenuItemClickListener ( new MenuItem.OnMenuItemClickListener () { public boolean onMenuItemClick(MenuItem item) { return (showDirectory(item)); } } ); return true; } public boolean showDirectory (MenuItem item) { CheckBox checkBox = (CheckBox) findViewById (R.id.checkBox1); checkBox.setChecked(true); } } @Oviewride public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.activity_main, menu); MenuItem item = menu.findItem(R.id.menu_open); if (item == null) return true; item.setOnMenuItemClickListener ( new MenuItem.OnMenuItemClickListener () { public boolean onMenuItemClick(MenuItem item) { return (showDirectory(item)); } } ); return true; } public boolean showDirectory (MenuItem item) { CheckBox checkBox = (CheckBox) findViewById (R.id.checkBox1); checkBox.setChecked(true); } } @Oviewride public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.activity_main, menu); MenuItem item = menu.findItem(R.id.menu_open); if (item == null) return true; item.setOnMenuItemClickListener ( new MenuItem.OnMenuItemClickListener () { public boolean onMenuItemClick(MenuItem item) { return (showDirectory(item)); } } ); return true; } public boolean showDirectory (MenuItem item) { CheckBox checkBox = (CheckBox) findViewById (R.id.checkBox1); checkBox.setChecked(true); } ); @Oviewride public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.activity_main, menu); MenuItem item = menu.findItem(R.id.menu_open); if (item == null) return true; item.setOnMenuItemClickListener ( new MenuItem.OnMenuItemClickListener () { public boolean onMenuItemClick(MenuItem item) { return (showDirectory(item)); } } ); return true; } public boolean showDirectory (MenuItem item) { CheckBox checkBox = (CheckBox) findViewById (R.id.checkBox1); checkBox.setChecked(true); } retornair viewdadeiro; @Oviewride public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.activity_main, menu); MenuItem item = menu.findItem(R.id.menu_open); if (item == null) return true; item.setOnMenuItemClickListener ( new MenuItem.OnMenuItemClickListener () { public boolean onMenuItemClick(MenuItem item) { return (showDirectory(item)); } } ); return true; } public boolean showDirectory (MenuItem item) { CheckBox checkBox = (CheckBox) findViewById (R.id.checkBox1); checkBox.setChecked(true); } } @Oviewride public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.activity_main, menu); MenuItem item = menu.findItem(R.id.menu_open); if (item == null) return true; item.setOnMenuItemClickListener ( new MenuItem.OnMenuItemClickListener () { public boolean onMenuItemClick(MenuItem item) { return (showDirectory(item)); } } ); return true; } public boolean showDirectory (MenuItem item) { CheckBox checkBox = (CheckBox) findViewById (R.id.checkBox1); checkBox.setChecked(true); } { @Oviewride public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.activity_main, menu); MenuItem item = menu.findItem(R.id.menu_open); if (item == null) return true; item.setOnMenuItemClickListener ( new MenuItem.OnMenuItemClickListener () { public boolean onMenuItemClick(MenuItem item) { return (showDirectory(item)); } } ); return true; } public boolean showDirectory (MenuItem item) { CheckBox checkBox = (CheckBox) findViewById (R.id.checkBox1); checkBox.setChecked(true); } 
    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.