2014-01-30 105 views
1

我在Android API 15中遇到了一個簡單視圖的奇怪問題。在此視圖中,我有一個包含2個菜單項的簡單菜單。 此代碼工作正常與其他Android API而不是在這款手機採用Android 4.0.3:android:onClick不適用於Android 4.0.3

<?xml version="1.0" encoding="utf-8"?> 
<menu xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item 
     android:id="@+id/root_menu" 
     android:icon="@android:drawable/ic_menu_help" 
     android:showAsAction="always" 
     android:title="Help"> 
     <menu> 
      <item 
       android:id="@+id/menu_about" 
       android:onClick="aboutDialog" 
       android:showAsAction="never" 
       android:title="About"/> 
     </menu> 
    </item> 
</menu> 

這是活動

public class HomeActivity extends Activity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.home); 
    } 

    /** 
    * Crea l'action bar 
    * 
    * @param menu 
    * @return 
    */ 
    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     MenuInflater inflater = getMenuInflater(); 
     inflater.inflate(R.menu.main_actionbar, menu); 
     return true; 
    } 

    /** 
    * Apertura del dialog box con le informazioni sulla versione del programma 
    * 
    * @param v 
    */ 
    public void aboutDialog(MenuItem v) { 
     AlertDialog.Builder builder = new AlertDialog.Builder(this); 
     builder.setMessage("Test") 
       .setPositiveButton("Ok", new DialogInterface.OnClickListener() { 
        public void onClick(DialogInterface dialog, int id) { 
         // FIRE ZE MISSILES! 
        } 
       }) 
       .setNegativeButton("No", new DialogInterface.OnClickListener() { 
        public void onClick(DialogInterface dialog, int id) { 
         // User cancelled the dialog 
        } 
       }); 
     // Create the AlertDialog object and return it 
     builder.create().show(); 
    } 
} 

所以沒有什麼在此代碼奇怪。但是,當我嘗試在設備上運行我有此異常:

android.view.InflateException: Couldn't resolve menu item onClick handler 
    aboutDialog in class android.view.ContextThemeWrapper 

     at android.view.MenuInflater$InflatedOnMenuItemClickListener.<init> (MenuInflater.java:202) 
     at android.view.MenuInflater$MenuState.setItem(MenuInflater.java:402) 
     at android.view.MenuInflater$MenuState.addItem(MenuInflater.java:436) 
     at android.view.MenuInflater.parseMenu(MenuInflater.java:173) 
     at android.view.MenuInflater.parseMenu(MenuInflater.java:151) 
     at android.view.MenuInflater.inflate(MenuInflater.java:95) 
     at 
     it.mobile.activity.home.HomeActivity.onCreateOptionsMenu(HomeActivity.java:38) 
     at android.app.Activity.onCreatePanelMenu(Activity.java:2444) 
     at com.android.internal.policy.impl.PhoneWindow.preparePanel(PhoneWindow.java:388) 
     at com.android.internal.policy.impl.PhoneWindow.invalidatePanelMenu(PhoneWindow.java:739) 
     at com.android.internal.policy.impl.PhoneWindow$1.run(PhoneWindow.java:2833) 
     at android.os.Handler.handleCallback(Handler.java:605) 
     at android.os.Handler.dispatchMessage(Handler.java:92) 
     at android.os.Looper.loop(Looper.java:137) 
     at android.app.ActivityThread.main(ActivityThread.java:4424) 
     at java.lang.reflect.Method.invokeNative(Native Method) 
     at java.lang.reflect.Method.invoke(Method.java:511) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
     at dalvik.system.NativeStart.main(Native Method) 

Caused by: java.lang.NoSuchMethodException: aboutDialog 
[interface android.view.MenuItem] 
     at java.lang.Class.getConstructorOrMethod(Class.java:460) 
     at java.lang.Class.getMethod(Class.java:915) 
     at android.view.MenuInflater$InflatedOnMenuItemClickListener.<init> 

但我不明白問題出在哪裏。與另一個設備都工作正常!

+0

因爲參數去除android:theme得到周圍它,在你aboutDialog方法你有一個參數菜單項並只能用onclick它不會工作 – Mert

+0

檢查導入 – Blackbelt

回答

3

不知道如何用xml來解決它。 從代碼角度來看,您將必須實現
public boolean onOptionsItemSelected(MenuItem item) 然後根據菜單項調用所需的處理程序。

3

雖然這是過時的,但這是異常的原因。當你看着班上的Android API 15(4.0.3-4.0.4)來源MenuInflator你會看到這樣的方法:

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; 
} 

這是例外情況。正如我們所看到的,該方法試圖在傳遞的上下文項的類上找到回調方法。因此,不要在onCreateOptionsMenu中調用getMenuInflator(),而應該調用new MenuInflator(this),以便this作爲上下文傳遞,然後代碼將工作。

另一個錯誤修復是從清單中刪除主題,我仍然非常迷惑爲什麼這樣工作。但是,這只是一個解決方法。

0

我有類似的問題,我發現這個在這裏 - https://code.google.com/p/android/issues/detail?id=62795

This is affecting Android 5.0 when applying the android:theme attribute. 


     <Button 
      android:theme="@android:style/Theme.Material" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:onClick="onLoginEmail" 

Clicking on the button throws 
    java.lang.IllegalStateException: Could not find a method onLoginEmail(View) in the activity class android.view.ContextThemeWrapper for onClick handler on view class android.widget.Button 
      at android.view.View$1.onClick(View.java:3994) 
      at android.view.View.performClick(View.java:4756) 
      at android.view.View$PerformClick.run(View.java:19749) 
      at android.os.Handler.handleCallback(Handler.java:739) 
      at android.os.Handler.dispatchMessage(Handler.java:95) 
      at android.os.Looper.loop(Looper.java:135) 
      at android.app.ActivityThread.main(ActivityThread.java:5221) 
      at java.lang.reflect.Method.invoke(Native Method) 
      at java.lang.reflect.Method.invoke(Method.java:372) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694) 
    Caused by: java.lang.NoSuchMethodException: onLoginEmail [class android.view.View] 
      at java.lang.Class.getMethod(Class.java:664) 
      at java.lang.Class.getMethod(Class.java:643) 
      at android.view.View$1.onClick(View.java:3987) 
      at android.view.View.performClick(View.java:4756) 
      at android.view.View$PerformClick.run(View.java:19749) 
      at android.os.Handler.handleCallback(Handler.java:739) 
      at android.os.Handler.dispatchMessage(Handler.java:95) 
      at android.os.Looper.loop(Looper.java:135) 
      at android.app.ActivityThread.main(ActivityThread.java:5221) 
      at java.lang.reflect.Method.invoke(Native Method) 
      at java.lang.reflect.Method.invoke(Method.java:372) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694) 
      /> 

我從TextView

相關問題