2014-02-12 1 views
1

Моего приложение работает отлично на моем HTD Desire:App останавливается при нажатии клавиши кнопки меню на Galaxy Samsung S3

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> 

Но если Я запускаю его на Samsung Galaxy S3, когда приложение падает и перестает работать, когда я нажимаю Menubutton. Нужна ли Samsung Galaxy S3 специальная обработка?

Or что-то не так в моем меню?

Спасибо заранее, Том

P.S. StackTrace:

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.

I Don `T использовать метод 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

Что такое stacktrace? –

+0

добавил Stacktrace =) – tsrac

+0

Я не знаю, почему я получаю inflateException - как я уже сказал, по желанию он работает гладко, на галактике s3 app stops :( – tsrac

ответ

1

Как и в случае с stacktrace, это, по-видимому, вызывает проблему:

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

При определении метода onClick для элемента меню в xml вы должны предоставить метод с правильным именем, взяв в качестве аргумента один объект MenuItem. Цитирование the docs:

Android 3.0 добавляет возможность для Вас, чтобы определить на щелчок поведения для пункта меню в XML, используя андроид: атрибут OnClick. Значение для атрибута должно быть именем метода, определенного в действии с помощью меню. Метод должен быть публичным и принимать один MenuItem параметра, когда система вызывает этот метод, он передает пункт меню выбранного

Вы должны включить следующий метод в коде активности, как это будет называться по система при объявлении OnClick в XML даже если вы также onOptionsItemSelected в коде:

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

вы лучше всего, вероятно, будет использовать толькоonOptionsItemSelected(), так как этот метод Шоул d работать со всеми версиями Android, тогда как объявление onClick в xml будет игнорироваться для устройств, на которых запущен 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; 
    } 
} 

... и удалить объявления OnClick из вашего меню XML.

+0

Да, но приложение работает на устройстве HTC. Поэтому я думаю, что этот метод уже включен в его java-файл. –

+0

cann 't ответить на мои запросы, потому что не хватает репутации, так отредактированной снова ... так как onItemSelected возвращает логическое значение, я не знаю, как/где реализовать решение вашей ссылки ZouZou – tsrac

+0

meh, и мой друг с Samsung должен был уйти, не знаю когда я увижу его в течение следующих дней, поэтому, если есть решение, и ответ на него может занять несколько дней :( – tsrac

0

Просто удалил оставшийся onClick из xml-файла ... иногда я чувствую себя таким слепым!

Но это было глупо, чтобы обнаружить, когда не работает на моем телефоне и не компиляции ошибок :(

спасибо за помощь! :)

Поскольку я немогу пометить комментарий как решение, я просто ответил, большое спасибо ZouZou и 2Dee :)