2010-03-16 16 views
0

ok, dans menu.add, vous ajoutez un ID menuitem entier. Mais lorsque vous spécifiez le menu en xml, @ + id ne peut pas prendre un entier, donc vous ne pouvez pas tester l'identifiant de l'élément de menu en tant qu'entier dans une instruction switch.menuitem id au format xml ne peut pas être un nombre entier? hein. vraiment?

Quelle est la chose évidente qui me manque, car sûrement une incohérence que cet os-stupide n'aurait pas pu rencontrer avec tous ces merveilleux génies de Google. En outre, lorsque je donne à l'élément de menu un nom comme "@ + id/myMenuItem", item.getItemId() renvoie un entier, long, qui est une représentation du pointeur hexadécimal.

M

Répondre

1

@id valeurs doivent en noms de Java (@id/foo se transforme en R.id.foo), et vous ne pouvez pas avoir un nom Java qui est numérique pur. Je ne suis même pas sûr que ça puisse commencer avec un numéro.

6

Vous ne pouvez pas spécifier l'attribut id en XML en tant qu'entier car tous les identifiants sont générés (dans le processus de génération) en un entier, puis placés dans R.java pour un accès ultérieur. Si elles vous laissent un nom entier, vous ne créerez pas de code Java légal (car les variables Java ne peuvent pas être simplement un nombre). En d'autres termes, si vous nommez un identifiant "@ + id/quelquechose", alors dans R.java il y a une variable statique "quelque chose" qui contient l'id entier pour l'id. Ensuite, dans le code, vous accédez comme ceci lorsque l'utilisateur clique sur l'élément de menu:

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
    case R.id.something: { 
     // Do something here 
     return true; 
    } 
    return super.onOptionsItemSelected(item); 
} 
+0

Le fait que ids sont converties en valeurs entières ne sont pas vraiment pertinentes pour la question (bien que utile à savoir :)), mais l'id est converti en un nom de constante Java dans Rxid, en tant que tel (comme commonsware déjà dit) ils ne peuvent pas commencer par un nombre. – MrSnowflake

0

Découvrez cet exemple:

private static final int EDIT_ID = Menu.FIRST + 3; 
private static final int DELETE_ID = Menu.FIRST + 4; 
@Override 
    public void onCreateContextMenu(ContextMenu menu, View v, 
      ContextMenu.ContextMenuInfo menuInfo) { 
     menu.add(Menu.NONE, EDIT_ID, Menu.NONE, "Edit").setAlphabeticShortcut(
       'e'); 
     menu.add(Menu.NONE, DELETE_ID, Menu.NONE, "Delete") 
       .setAlphabeticShortcut('d'); 
    } 

    @Override 
    public boolean onContextItemSelected(MenuItem item) { 
     AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item 
       .getMenuInfo(); 
     switch (item.getItemId()) { 
     case EDIT_ID: 

      edit(info.id); 
      return (true); 
     case DELETE_ID: 

      delete(info.id); 
      return (true); 
     } 

     return (super.onOptionsItemSelected(item)); 
    } 
+0

La question parle de menus XML, pas de menus programmés. – MrSnowflake

+0

Merci pour les réponses! Très rapide et précis. – johnrubythecat