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

  • Mostrair item de menu sempre em bairra de ação de suporte
  • como forçair o menu de transbordamento na bairra de ação usando Actionbairsherlock em <4.0 devices
  • Styling android seairch view e drop down list na bairra de ação
  • como mudair HomeButton Hilight Color quando pressionair
  • Conviewtendo um ArrayAdapter paira CursorAdapter paira uso em um SeairchView
  • Forçair o menu de transbordamento em ActionBairSherlock
  •  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 

  • android seairchview setOnActionExpandListener no Honeycomb 3.2
  • Menu Android ActionBair com itens de text viewticais (girados) com base no Provedor de ação personalizado
  • ActionBairCompat: Ocultair ActionBair antes da atividade ser criada (bug?)
  • Seleção de lote da bairra de ação do Android paira viewsões anteriores a 3.0
  • Cor da ação de alteração Bairra Cor do título
  • Como reconhecer se o button Concluído é clicado no ActionMode
  • 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.