点击Galaxy Samsung S3上的菜单按钮时应用停止

时间:2014-02-12 19:53:22

标签: java android menu galaxy

我的应用程序在我的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();

}

2 个答案:

答案 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:)