2014-02-12 118 views
1

我的應用程序運行完全在我的HTD慾望:應用程序停止

Java代碼片段:

@Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.plans_screen, menu); 
    return true; 
    } 

和我的XML文件:

<?xml version="1.0" encoding="utf-8"?> 
    <menu xmlns:android="http://schemas.android.com/apk/res/android" > 
    <item android:id="@+id/newPlan" 
     android:visible="true" 
     android:title="Neuer Plan" 
     android:onClick="addPlan"></item> 
    <item 
    android:id="@+id/menu_main_spinner" 
     android:visible="true" 
    android:title="Lade Plan" 
    android:showAsAction="always"></item> 
    </menu> 

但如果我在三星Galaxy S3上運行它,當我擊中Menubutton時,該應用程序崩潰並停止工作。 三星Galaxy S3是否需要特殊處理?

或者我的菜單有什麼問題嗎?

由於提前, 湯姆

附:堆棧跟蹤:

02-12 20:56:24.090: E/AndroidRuntime(25656): FATAL EXCEPTION: main 
02-12 20:56:24.090: E/AndroidRuntime(25656): android.view.InflateException: Couldn't resolve menu item onClick handler addPlan in class com.example.myfitnessapp.PlansScreen 
02-12 20:56:24.090: E/AndroidRuntime(25656): at android.view.MenuInflater$InflatedOnMenuItemClickListener.<init>(MenuInflater.java:218) 
02-12 20:56:24.090: E/AndroidRuntime(25656): at android.view.MenuInflater$MenuState.setItem(MenuInflater.java:422) 
02-12 20:56:24.090: E/AndroidRuntime(25656): at android.view.MenuInflater$MenuState.addItem(MenuInflater.java:456) 
02-12 20:56:24.090: E/AndroidRuntime(25656): at android.view.MenuInflater.parseMenu(MenuInflater.java:189) 
02-12 20:56:24.090: E/AndroidRuntime(25656): at android.view.MenuInflater.inflate(MenuInflater.java:111) 
02-12 20:56:24.090: E/AndroidRuntime(25656): at com.example.myfitnessapp.PlansScreen.onCreateOptionsMenu(PlansScreen.java:146) 
02-12 20:56:24.090: E/AndroidRuntime(25656): at android.app.Activity.onCreatePanelMenu(Activity.java:2578) 
02-12 20:56:24.090: E/AndroidRuntime(25656): at 

[...]

P.P.S.

我`噸使用的onclick方法...

我的代碼如下:

@Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
    case R.id.newPlan: 
    addPlan(); 
    break; 
    case R.id.menu_main_spinner: 
     loadPlan(); 
     break; 
    } 
    return super.onOptionsItemSelected(item); 
    } 

我有funtcioning方法addPlan():

public void addPlan() { 
final EditText input = new EditText(PlansScreen.this); 
new AlertDialog.Builder(PlansScreen.this) 
.setTitle("Erstell einen neuen Plan") 
.setMessage("Wie soll der soll der Plan heissen?") 
.setView(input) 
.setPositiveButton("Ok", new DialogInterface.OnClickListener() { 
    public void onClick(DialogInterface dialog, int whichButton) { 
     String value = input.getText().toString(); 
     Data.plannames.add(value); 
     Data.trainingsplaene.add(new trainingsplan(value)); 
     spinadapter.notifyDataSetChanged(); 
     Data.currentPlan = Data.trainingsplaene.size()-1; 
     listadapter=new myListViewAdapter(PlansScreen.this,Data.trainingsplaene.get(Data.currentPlan)); 
     myList2.setAdapter(listadapter); 
     listadapter.notifyDataSetChanged(); 

    } 
}).setNegativeButton("Cancel", new DialogInterface.OnClickListener() { 
    public void onClick(DialogInterface dialog, int whichButton) { 
     // Do nothing. 
    } 
}).show(); 

}

+3

什麼是堆棧跟蹤? –

+0

added stacktrace =) – tsrac

+0

我不知道爲什麼我會得到inflateException - 就像我說的,它希望它運行平穩,在Galaxy S3應用程序中停止:( – tsrac

回答

1

按照堆棧跟蹤,這似乎是導致問題的原因:

java.lang.NoSuchMethodException: addPlan [interface android.view.MenuItem] 

當爲xml中的菜單項定義onClick方法時,應該提供一個具有正確名稱的方法,將單個MenuItem對象作爲參數。引用the docs

Android 3.0的加的能力,爲您定義的點擊行爲 對XML的菜單項,使用了android:onclick屬性。該屬性的值 必須是使用菜單由活動 定義的方法的名稱。該方法必須是公開的,接受一個菜單項 參數,當系統調用此方法,它通過選擇菜單項

你應該在你的活動代碼下面的方法,因爲這將被稱爲當你在XML 申報的onClick即使你也有你的代碼 onOptionsItemSelected系統:

public boolean addPlan (MenuItem menuItem){ 
    // Your code here 
} 

您最好的選擇很可能是使用onOptionsItemSelected(),因爲該方法建議立即進行刪除d適用於所有版本的Android,而在xml中聲明onClick時,運行Gingerbread或更低版本的設備將被忽略。所以作爲替代,你可以這樣做:

@Override 
public boolean onOptionsItemSelected(MenuItem item){ 
    switch (item.getItemId()) { 
     case R.id.profile_edit: 
      addPlan(); 
      return true; 
     case R.id. menu_main_spinner: 
      loadPlan(); 
      return true; 
    } 
} 

... ,並從你的菜單XML刪除的onClick聲明。

+0

是的,但該應用程序在HTC設備上工作,所以我認爲該方法已經包含在它的java文件中。 –

+0

couldn回答我的問題,因爲沒有足夠的聲譽,所以再次編輯...因爲onItemSelected返回布爾值,我不知道如何/如何實施您的鏈接的解決方案鄒鄒 – tsrac

+0

我和我的朋友與三星不得不離開,不知道當我在接下來的幾天內看到他,所以如果有解決方案嘗試和回答可能需要幾天:( – tsrac

0

剛剛從xml文件中刪除了剩餘的onClick ...有時我覺得這麼盲目!

但是這是愚蠢的檢測,我的手機上沒有任何編譯錯誤:(

感謝您的幫助!:)

因爲我不能老是標記爲解決方案的註釋和運行的時候,我只是回答,非常感謝ZouZou和2Dee :)