我的应用程序在我的HTD Desire上完美运行:
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需要一些特殊处理吗?
或者我的菜单中有什么问题吗?
提前致谢, 汤姆
P.S。堆栈跟踪:
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();
}
答案 0 :(得分:1)
根据堆栈跟踪,这似乎是导致问题的原因:
java.lang.NoSuchMethodException: addPlan [interface android.view.MenuItem]
在xml中为菜单项定义onClick方法时,应该提供一个具有正确名称的方法,将一个MenuItem对象作为参数。引用the docs:
Android 3.0增加了定义点击行为的功能 对于XML中的菜单项,使用android:onClick属性。价值 属性必须是活动定义的方法的名称 使用菜单。该方法必须是公共的并接受单个MenuItem 参数 - 当系统调用此方法时,它会传递菜单项 选择
您应该在Activity代码中包含以下方法,因为当您在xml 中声明onClick时,系统会调用此方法,即使您的代码中也有onOptionsItemSelected :
public boolean addPlan (MenuItem menuItem){
// Your code here
}
您最好的选择可能是使用 onOptionsItemSelected()
,因为该方法适用于所有版本的Android,而对于运行Gingerbread或更低版本的设备,将忽略在xml中声明onClick。所以作为替代方案,你可以这样做:
@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声明。
答案 1 :(得分:0)
刚刚从xml文件中删除了剩余的onClick ...有时我觉得自己很盲目!
但是在我的手机上运行并且没有编译错误时检测到它是愚蠢的:(
感谢您的帮助! :)
由于我不能将评论标记为解决方案,我只是回答,非常感谢ZouZou和2Dee:)