2011-05-27 9 views
16

Tengo una aplicación Android con el elemento de menú siguiente en una de las actividades (que se refiere a la manipulación de una lista de nombres y números mac):Configurar un elemento de menú como se comprobó a partir del código

<item android:id="@+id/menu_sort_tagg" 
     android:icon="@android:drawable/ic_menu_sort_by_size" 
     android:title="@string/menu_sort_list" > 
     <menu> 
     <group android:checkableBehavior="single"> 
      <item android:id="@+id/sort_by_name" 
        android:title="@string/sort_by_name" /> 
      <item android:id="@+id/sort_by_mac" 
          android:title="@string/sort_by_mac" /> 

    </menu> 
</item> 

y como la aplicación cambios de estado, que quieren ser capaces de comprobar la validez de comprobar qué elemento de la lista de opciones de ordenación que se utilizó por última vez con el siguiente código:

((MenuItem)findViewById(R.id.sort_by_name)).setChecked(true); 

el problema es que esta línea específica me da una excepción de tiempo de ejecución. ¿Alguien tiene una pista de por qué?

Un vistazo al registro revela que las excepciones de tiempo de ejecución se desencadenan mediante una excepción de puntero nulo. Al cambiar el código de esta manera:

MenuItem mi = (MenuItem)findViewById(R.id.sort_by_name); 
mi.setChecked(true); 

se hace evidente que la excepción se produce en la cuenta de segundos, es decir, el Menultem MI es nula. Entonces, ¿por qué falla la primera instrucción para traer un puntero al MenuItem correcto?

+0

Hola, nos puede mostrar un registro con la excepción? – Cata

+0

Claro, aquí está la salida del registro de errores: 11: 38: 34.562: ERROR/AndroidRuntime (14371): EXCEPCIÓN FATAL: principal 05-27 11: 38: 34.562: ERROR/AndroidRuntime (14371): java.lang.RuntimeException: No se puede iniciar la actividad ComponentInfo {se.classis.safe.android/se.classis.safe.android.TagListActivity}: java.lang.NullPointerException 05-27 11: 38: 34.562: ERROR/AndroidRuntime (14371): en android. app.ActivityThread.performLaunchActivity (ActivityThread.java:1647) 05-27 11: 38: 34.562: ERROR/AndroidRuntime (14371): en android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:1663) 05-27 11: 38: 34.562: ERROR –

+0

Parece provenir de una excepción de puntero nulo. ¿Podría findViewById fallar para proporcionar un puntero al elemento de menú que queremos verificar? –

Respuesta

46

No se puede hacer findViewById() para un menú, porque es un menú, no una vista. Y puede cambiar el estado del menú cuando se está creando o preparando. Por ejemplo, si crea un menú de opciones, puede hacerlo en el método Activity: onPrepareOptionsMenu():

@Override 
public boolean onPrepareOptionsMenu(Menu menu) { 
    super.onPrepareOptionsMenu(menu); 
    menu.findItem(R.id.sort_by_name).setChecked(true); 
    //Also you can do this for sub menu 
    menu.getItem(firstItemIndex).getSubMenu().getItem(subItemIndex).setChecked(true); 
    return true; 
} 
+0

Bien, eso explica el problema. ¡Gracias! –

+0

¡Me alegro de que haya sido útil! – Michael

+0

Gran respuesta, gracias –

Cuestiones relacionadas