2014-02-12 120 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 :)