Menús

De Manuais Informática - IES San Clemente.
Ir a la navegación Ir a la búsqueda

Introducción

  • Nesta unidade imos ver como xestionar menús, submenús e menú contextuais.
  • A seguinte imaxe amosa os menús na Action Bar da aplicación

Actionbar.png

  • 1: Icona da App e nome
  • 2: Dúas iconas de menús da aplicación
  • 3: Menú OverFlow que equivale ao botón Menú da Botonera.
  • Os menús poden poñerse na Action Bar dende a versión 3.0 de Android.


  • Para versións anteriores á 3.0 os menús víanse como na parte inferior da seguinte imaxe:

Options menu.png


  • A seguinte imaxe amosa 3 botóns de menú na Barra de Acción e o menú Overflow

Actionbar-item-withtext.png


  • Nesta imaxe vese como un dos menús da action bar ten submenús:

Actionbar-shareaction2x.png



  • Finalmente as seguintes imaxes amosan Menús Contextuais
    • Flotantes (esquerda)
    • ou na barra de accións (dereita)

Menu-context.png


Menus e submenús básicos

  • Imos realizar unha aplicación con 3 menús (un deles con submenús e outro cunha icona na Barra de Acción).
  • Antes imos ver distintas casuísticas:

Recursos Implicados

  • Os menús defínense nun recurso xml en res/menu/nome_ficheiro.xml

Android 2014 U5 01 Menus 08.jpg

  • Dito recurso terá coma elementos:
    • <menu>: elemento raíz. Contén <item> e <group>
    • <item>: representa un elemento de menú.
      • Tería que ter un elemento <menu> dentro de <item> para crear un submenú.


  • O xml seguinte é o que se crea por defecto cando se crea un novo proxecto:
 1 <menu xmlns:android="http://schemas.android.com/apk/res/android"
 2     xmlns:tools="http://schemas.android.com/tools"
 3     tools:context="com.example.u5_01_menus.U5_01_Menus" >
 4 
 5     <item
 6         android:id="@+id/action_settings"
 7         android:orderInCategory="100"
 8         android:showAsAction="never"
 9         android:title="@string/action_settings"/>
10 
11 </menu>
  • Liña 7: o atributo android:orderInCategory="Nº Enteiro". Se hai varios ítems indica cal aparecerá primeiro, segundo, etc. Se todos teñen o mesmo valor entón aparecen na orde na que son creados.


  • Liña 8: o atributo android:showAsAction pode ter os seguintes valores:
    • never: nunca amosa o item de menú na barra de acción.
    • ifRoom: se hai espazo na barra de acción o amosa.
    • always: amosa sempre na barra de acción.
    • withText: se temos unha icona, por defecto non amosa o texto. Se queremos que amose os dúos poñeremos este valor.
    • collapseActionView: cando a acción dun elemento de menú (declarada coma android:actionLayout ou android:actionViewClass) é plegable. Dispoñible a'partires da versión API 14.
    • Os elementos de menú que aparecen na barra, xa non aparecen no menú o premer o botón Menú ou "OverFlow", aínda que estean nun group, como se pode apreciar nas imaxes de abaixo.
    • Os valores pódense combinar có caracter ‘|’.


  • Liña 9: o atributo android:title indica o nome do menú/submenú. Neste caso o seu valor defínese nun recurso xml de strings:
1 <?xml version="1.0" encoding="utf-8"?>
2 <resources>
3 
4     <string name="app_name">U5_01_Menus</string>
5     <string name="hello_world">Hello world!</string>
6     <string name="action_settings">Settings</string>
7 
8 </resources>


  • O atributo android:onClick funciona igual que nas vistas do recurso xml do Layout.


  • EXEMPLO DE MENÚ NA BARRA DE ACCIÓN CON SUBMENUS
  • A seguinte imaxe, obténse co seguinte recurso xml.

Android 2014 U5 01 Menus 09.jpg

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <menu xmlns:android="http://schemas.android.com/apk/res/android" >
 3 
 4     <item
 5         android:id="@+id/itemAbrir"
 6         android:icon="@drawable/open32"
 7         android:showAsAction="ifRoom"
 8         android:title="Abrir"
 9         android:titleCondensed="Abrir">
10         <menu>
11             <item
12                 android:id="@+id/itemDoc"
13                 android:title="Documento"
14                 android:titleCondensed="Doc."/>
15             <item
16                 android:id="@+id/itemIma"
17                 android:title="Imaxes"
18                 android:titleCondensed="Imax."/>
19             <item
20                 android:id="@+id/itemAudio"
21                 android:title="Audio"
22                 android:titleCondensed="Audio"/>
23         </menu>
24     </item>
25     <item
26         android:id="@+id/itemNovo"
27         android:icon="@drawable/close32"
28         android:showAsAction="ifRoom"
29         android:title="Novo documento"
30         android:titleCondensed="N.Doc.">
31     </item>
32     <item
33         android:id="@+id/itemSair"
34         android:icon="@drawable/exit32"
35         android:showAsAction="ifRoom"
36         android:title="Saír"
37         android:titleCondensed="Saír">
38     </item>
39 
40 </menu>
  • Liñas 6,27,34: Indican o recurso drawable que deben amosar. Estas imaxes deben estar na carpeta /res/drawableXXXXX correspondentes.
  • Liñas 7,28,35: Indican que se hai espazo na barra de acción que amosen eses ítems que teñen ese atributo.
  • Liñas 9,30,37: O atributo android:titleCondensed usarase cando o valor de android:title sexa demasiado longo.
  • Liñas 10-23: Para crear submenús dentro dun menú, volvemos a crear a entrada <menu> dentro de <item>


Agrupamentos

  • Outro elemento que pode ir dentro do elemento <menu>:
    • <group>: un grupo é un conxunto de elementos que teñen certas características.
      • Amosar ou ocultar todos os elementos: setGroupVisible()
      • Habilitar ou deshabilitar todos os elementos: setGroupEnabled()
      • Facer que todos os ítems do group poidan ser presentados en forma de checkbox: setGroupCheckable()
        • Podemos facer que un elemento sexa chequeable usando o atributo android:checkable no elemento <item> ou o
        • group enteiro con 'android:checkableBehavior no elemento <group>.
        • O atributo android:checkableBehavior pode ter as seguintes opcións:
          • single: só un elemento do grupo pode ser checkeado (radiobuttons).
          • all: todos os elementos poden ser checkeados (checkboxs).
          • none: ningún elemento é seleccionable.
        • Se non poñemos nada, os elementos do <group> aparecen como os demais.


  • A seguinte imaxe, ten asociado o seguinte XML.
  • Observar que na barra de acción non collen todos os menús.
  • Observar que hai dous menús (Modo Lectura e Modo Gravación) que poden ser marcados os dous.

Android 2014 U5 01 Menus 10.jpg

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <menu xmlns:android="http://schemas.android.com/apk/res/android" >
 3 
 4     <item
 5         android:id="@+id/itemAbrir"
 6         android:icon="@drawable/open32"
 7         android:showAsAction="always"
 8         android:title="Abrir"
 9         android:titleCondensed="Abrir">
10         <menu>
11             <item
12                 android:id="@+id/itemDoc"
13                 android:title="Documento"
14                 android:titleCondensed="Doc."/>
15             <item
16                 android:id="@+id/itemIma"
17                 android:title="Imaxes"
18                 android:titleCondensed="Imax."/>
19             <item
20                 android:id="@+id/itemAudio"
21                 android:title="Audio"
22                 android:titleCondensed="Audio"/>
23         </menu>
24     </item>
25     <item
26         android:id="@+id/itemNovo"
27         android:icon="@drawable/close32"
28         android:showAsAction="ifRoom"
29         android:title="Novo documento"
30         android:titleCondensed="N.Doc.">
31     </item>
32     <item
33         android:id="@+id/itemSair"
34         android:icon="@drawable/exit32"
35         android:showAsAction="ifRoom"
36         android:title="Saír"
37         android:titleCondensed="Saír">
38     </item>
39 
40     <group
41         android:id="@+id/mgrpModos"
42         android:checkableBehavior="all" >
43         <item
44             android:id="@+id/ModoLect"
45             android:showAsAction="ifRoom"
46             android:title="Modo Lectura"
47             android:titleCondensed="M.Lect.">
48         </item>
49         <item
50             android:id="@+id/ModoRecord"
51             android:showAsAction="ifRoom"
52             android:title="Modo Grabación"
53             android:titleCondensed="M.Grab">
54         </item>
55     </group>
56 
57 </menu>
  • Liñas 35,45,51: Observar como estes ítems non se amosan na barra de acción porque non teñen espazo.
  • Liñas 40-55: Observar como hai un agrupamento de ítems e na liña 42 indícase que todos eles son "chequeables".


Lanzar e procesar o menú

  • Para lanzar o menú debemos cambiar o menú que ten asinada unha determinada Activity e para iso temos que sobrescribir o método onCreateOptionsMenu().
  • Este método xa aparece na Activity cando a creamos con Eclipse.
  • O que facemos en "inflar" o xml asociado ao menú (Liña 4) do mesmo xeito que se fai cando se
1    @Override
2         public boolean onCreateOptionsMenu(Menu menu) {
3                 // Inflate the menu; this adds items to the action bar if it is present.
4                 getMenuInflater().inflate(R.menu.u5_01__menus, menu);
5                 return true;
6         }


  • Cando se preme un ítem dun menú lánzase o evento onOptionsItemSelected e para procesar ese ítem sobrescribir o método onOptionsItemSelected(MenuItem item).
  • Este método tamén se crea por defecto ao crear o proxecto.
 1         @Override
 2         public boolean onOptionsItemSelected(MenuItem item) {
 3                 // Handle action bar item clicks here. The action bar will
 4                 // automatically handle clicks on the Home/Up button, so long
 5                 // as you specify a parent activity in AndroidManifest.xml.
 6  
 7                	int id = item.getItemId();
 8 		if (id == R.id.action_settings) {
 9 			return true;
10 		}
11 		return super.onOptionsItemSelected(item);
12           }
  • Este método devolve un boolean:
    • true: se procesamos un elemento do menú (return true).
    • false: se non o procesamos (chamar ao método pai).

Caso pŕactico

  • Crear o proxecto: U5_01_Menus


As imaxes dos menús

  • Neste caso colocouse en cada recurso res/drawable a imaxe da cara:

Android 2014 U5 01 Menus 11.jpg



Recursos XML

  • O xml do Layout:
  • É o creado por defecto salvo que lle engadimos un id (Liñas 11).
 1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 2     xmlns:tools="http://schemas.android.com/tools"
 3     android:layout_width="match_parent"
 4     android:layout_height="match_parent"
 5     android:paddingBottom="@dimen/activity_vertical_margin"
 6     android:paddingLeft="@dimen/activity_horizontal_margin"
 7     android:paddingRight="@dimen/activity_horizontal_margin"
 8     android:paddingTop="@dimen/activity_vertical_margin">
 9 
10     <TextView
11         android:id="@+id/tv"
12         android:layout_width="wrap_content"
13         android:layout_height="wrap_content"
14         android:text="@string/hello_world" />
15 
16 </RelativeLayout>


  • O xml do menú (modificamos o recurso XML creado por defecto en /res/menu/...)
 1 <menu xmlns:android="http://schemas.android.com/apk/res/android"
 2     xmlns:tools="http://schemas.android.com/tools"
 3     tools:context="com.example.u5_01_menus.U5_01_Menus" >
 4 
 5     <item
 6         android:id="@+id/item1"
 7         android:icon="@drawable/ic_action_emo_basic"
 8         android:orderInCategory="100"
 9         android:showAsAction="always"
10         android:title="@string/item1"/>
11     <item
12         android:id="@+id/item2"
13         android:orderInCategory="100"
14         android:showAsAction="never"
15         android:title="@string/item2"/>
16     <item
17         android:id="@+id/item3"
18         android:orderInCategory="100"
19         android:showAsAction="never"
20         android:title="@string/item3">
21         <menu>
22             <item
23                 android:id="@+id/SubItem3_1"
24                 android:title="@string/item3_1"/>
25             <item
26                 android:id="@+id/SubItem3_2"
27                 android:title="@string/item3_2"/>
28         </menu>
29     </item>
30 </menu>
  • Liñas 8,13,18: Observar como todos os ítems teñen o mesmo valor para a ser ordenados.
    • Que o participante no curso probe a cambiar o terceiro ítem a un valor de 99.
  • Liñas 9,14,19: Observar como o primeiro ítem indica always e os demais never á hora de amosar o menú na barra de acción.


  • Recurso xml de strings
  • Aínda que podíamos poñer os Títulos dos menús directamente no ficheiro anterior, decidimos, nesta ocasión, realizalo da maneira recomendada: definir os seus valores nun recurso xml.
 1 <?xml version="1.0" encoding="utf-8"?>
 2 <resources>
 3 
 4     <string name="app_name">U5_01_Menus</string>
 5     <string name="hello_world">Hello world!</string>
 6     <string name="item1">Opción 1</string>
 7     <string name="item2">Opción 2</string>
 8     <string name="item3">Opción 3- Submenús</string>
 9     <string name="item3_1">Opción 3- Submenú 1 - Calculadora</string>
10     <string name="item3_2">Opción 3- Submenú 2 - Saír</string>
11 
12 </resources>

O código java da aplicación

 1 package com.example.u5_01_menus;
 2 
 3 import android.app.Activity;
 4 import android.content.Intent;
 5 import android.os.Bundle;
 6 import android.view.Menu;
 7 import android.view.MenuItem;
 8 import android.widget.TextView;
 9 import android.widget.Toast;
10 
11 public class U5_01_Menus extends Activity {
12 
13 	@Override
14 	protected void onCreate(Bundle savedInstanceState) {
15 		super.onCreate(savedInstanceState);
16 		setContentView(R.layout.activity_u5_01__menus);
17 	}
18 
19 	@Override
20 	public boolean onCreateOptionsMenu(Menu menu) {
21 		// Inflate the menu; this adds items to the action bar if it is present.
22 		getMenuInflater().inflate(R.menu.u5_01__menus, menu);
23 		return true;
24 	}
25 
26 	@Override
27 	public boolean onOptionsItemSelected(MenuItem item) {
28 		// Handle action bar item clicks here. The action bar will
29 		// automatically handle clicks on the Home/Up button, so long
30 		// as you specify a parent activity in AndroidManifest.xml.
31 	/*
32 		int id = item.getItemId();
33 		if (id == R.id.action_settings) {
34 			return true;
35 		}
36 		return super.onOptionsItemSelected(item);
37  	*/
38 		TextView tv = (TextView) findViewById(R.id.tv);
39 		Toast.makeText(getApplicationContext(), "Pulsado elemento: " + item.getTitle().toString(), Toast.LENGTH_SHORT).show();
40 
41 		switch (item.getItemId()) {
42 		case R.id.item1:
43 			tv.setText("Quedarei con esta cara de sorriso cando remate esta tarefa");
44 			return true;
45 
46 		case R.id.item2:
47 			tv.setText("A opción 2 non ten nada asignado");
48 			return true;
49 
50 		case R.id.SubItem3_1:
51 			Intent intent = new Intent();
52 			intent.setClassName("com.android.calculator2", "com.android.calculator2.Calculator");
53 			startActivity(intent);
54 			return true;
55 
56 		case R.id.SubItem3_2:
57 			finish();
58 			return true;
59 		default:
60 			return super.onOptionsItemSelected(item);
61 
62 		}
63 	}
64 
65 	public void finish() {
66 		super.finish();
67 	}
68 
69 }
  • Liña 39: Recollemos o título do ítem pulsado.
  • Liñas 44,48,54,58: devolver true no caso de procesar cada un dos ítems.
  • Liña 60: Se non se procesou o ítem chamar ao pai, que vai devolver false por defecto.


  • Se na definición de cada ítem se houbera usado o atributo android:onClick entón teríamos que crear en java os métodos correspondentes do mesmo xeito que se fai cando se usa ese atributo nun Layout.


Menús contextuais

  • Pódense crear sobre calquera elemento View, pero normalmente vanse usar con ListView e GridView.*
  • Existen dúas formas de implantar este tipo de menús:
  • Menú contextual flotante:
  • O menú aparece cando o usuario prema durante un tempo longo un elemento e aparece unha lista.

Android 2014 U5 02 MenusContextuais 01.jpg


Para crear este tipo de menú:

  • O View que queira usalo ten que ser asociado ao mesmo chamando o método registerForContextMenu pasando o obxecto View.
  • Se todos os elementos do ListView / GridView teñen o mesmo menú contextual, se pode pasar como parámetro o ListView / GridView.
  • Por exemplo (isto se fai no método onCreate): registerForContextMenu(lista);
    • Sendo lista a referencia a unha ListView.
  • Implantar o método onCreateContextMenu() na Activity / Fragment.
    • Este método será chamado de forma automática cando o usuario preme durante un tempo o elemento (View) asociado o ContextMenu.
    • O que fai este método é amosar o menú contextual creado por nós previamente.
1 @Override
2 public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
3     super.onCreateContextMenu(menu, v, menuInfo);
4     MenuInflater inflater = getMenuInflater();
5     inflater.inflate(R.menu.context_menu, menu);
6 }
  • Lembrar que o MenuInflater serve para pasar dun arquivo XML (o menú contextual definido por nós) a obxectos MenuItems.


  • Implantar o método onContextItemSelected() ao que se chama de forma automática cando se selecciona algo do menú contextual
 1         @Override
 2 	public boolean onContextItemSelected(MenuItem item) {
 3 		AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
 4 		switch (item.getItemId()) {
 5 		case R.id.edit:
 6 			editNote(info.id);
 7 			return true;
 8 		case R.id.delete:
 9 			deleteNote(info.id);
10 			return true;
11 		default:
12 			return super.onContextItemSelected(item);
13 		}
14 	}
  • Liña 3. Do ítem pulsado recibimos información extra, entre outras, o "id" e a "posición" do ítem do adaptador sobre o que se pulsou durante un tempo para crear o menú contextual.
    • Ese "id" e "posición" son recollidos na variable info de tipo AdapterContextMenuInfo.
  • Liña 4: fixarse que é item.getItemId() para obter referencia ao id do menú contextual que foi seleccionado. Non confundir co id do elemento do adaptador sobre o que foi creado ese menú contextual.
  • O resto funciona igual que non menú básico.


  • Menú de modo acción contextual:
  • Neste caso, o menú aparece nunha barra de acción contextual na parte superior da pantalla (só dispoñible a partires da versión 3.0 API11).Android 2014 U5 02 MenusContextuais 02.jpg

Menú contextual: Caso Práctico

  • Neste caso vanse crear dous menús contextuais distintos:
    • un para unha etiqueta (TextView)
    • e outro para unha lista (ListView).
  • Crear o proxecto: U5_02_MenusContextuais


Menú contextual: O XML do Layout

  • Conservamos o TextView que vén por defecto e engadimos un ListView.
  • Ao TextView engadímoslle un id.
 1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 2     xmlns:tools="http://schemas.android.com/tools"
 3     android:layout_width="match_parent"
 4     android:layout_height="match_parent"
 5     android:orientation="vertical"
 6     android:padding="@dimen/activity_vertical_margin" >
 7 
 8     <TextView
 9         android:id="@+id/tv"
10         android:layout_width="wrap_content"
11         android:layout_height="wrap_content"
12         android:text="@string/hello_world" />
13 
14     <ListView
15         android:id="@+id/lvFroitas"
16         android:layout_width="wrap_content"
17         android:layout_height="wrap_content" >
18     </ListView>
19 
20 </LinearLayout>

Menú contextual: O XML dos menús contextuais

  • Imos crear dous recursos xml para cada un dos menús contextuais distintos que temos segundo premamos sobre un TextView ou sobre un ListView.
  • Poderían ser o mesmo menú contextual, pero así aprendemos que estes poden ser distintos en función da View ao que se asocien.

Android 2014 U5 02 MenusContextuais 10.jpg

  • O xml de /res/menu/menu_contextual_etiqueta.xml
 1 <?xml version="1.0" encoding="utf-8"?>
 2 <menu xmlns:android="http://schemas.android.com/apk/res/android" >
 3 
 4     <item
 5         android:id="@+id/tvItem1"
 6         android:showAsAction="withText"
 7         android:title="TextView opción 1">
 8     </item>
 9     <item
10         android:id="@+id/tvItem2"
11         android:showAsAction="withText"
12         android:title="TextView opción 2">
13     </item>
14 
15 </menu>


  • O xml de /res/menu/menu_contextual_lista.xml
 1 <?xml version="1.0" encoding="utf-8"?>
 2 <menu xmlns:android="http://schemas.android.com/apk/res/android" >
 3 
 4     <item
 5         android:id="@+id/lvItemBorrar"
 6         android:showAsAction="withText"
 7         android:title="Borrar">
 8     </item>
 9     <item
10         android:id="@+id/lvItemDuplicar"
11         android:showAsAction="withText"
12         android:title="Duplicar">
13     </item>
14 </menu>


  • Observar que nos dous ficheiros xml cada item ten asociado un "id", para logo ser identificado o ítem cando sexa procesado no código.



Menú contextual: o código Java da aplicación

  1 package com.example.u5_02_menuscontextuais;
  2 
  3 import java.util.ArrayList;
  4 import java.util.Arrays;
  5 import android.app.Activity;
  6 import android.os.Bundle;
  7 import android.view.ContextMenu;
  8 import android.view.ContextMenu.ContextMenuInfo;
  9 import android.view.Menu;
 10 import android.view.MenuInflater;
 11 import android.view.MenuItem;
 12 import android.view.View;
 13 import android.widget.AdapterView.AdapterContextMenuInfo;
 14 import android.widget.ArrayAdapter;
 15 import android.widget.ListView;
 16 import android.widget.TextView;
 17 import android.widget.Toast;
 18 
 19 public class U5_02_MenusContextuais extends Activity {
 20 	ListView lv;
 21 	TextView tv;
 22 
 23 	@Override
 24 	protected void onCreate(Bundle savedInstanceState) {
 25 		super.onCreate(savedInstanceState);
 26 		setContentView(R.layout.activity_u5_02__menus_contextuais);
 27 
 28 		lv = (ListView) findViewById(R.id.lvFroitas);
 29 		tv = (TextView) findViewById(R.id.tv);
 30 		registerForContextMenu(tv);
 31 
 32 		engadirDatosListView();
 33 
 34 	}
 35 
 36 	@Override
 37 	public boolean onCreateOptionsMenu(Menu menu) {
 38 		// Inflate the menu; this adds items to the action bar if it is present.
 39 		getMenuInflater().inflate(R.menu.u5_02__menus_contextuais, menu);
 40 		return true;
 41 	}
 42 
 43 	@Override
 44 	public boolean onOptionsItemSelected(MenuItem item) {
 45 		// Handle action bar item clicks here. The action bar will
 46 		// automatically handle clicks on the Home/Up button, so long
 47 		// as you specify a parent activity in AndroidManifest.xml.
 48 		int id = item.getItemId();
 49 		if (id == R.id.action_settings) {
 50 			return true;
 51 		}
 52 		return super.onOptionsItemSelected(item);
 53 	}
 54 
 55 	private void engadirDatosListView() {
 56 		String[] froitas = new String[] { "Laranxa", "Mango", "Ameixa" };
 57 
 58 		ArrayList<String> alFroitas = new ArrayList<String>();
 59 
 60 		alFroitas.addAll(Arrays.asList(froitas));
 61 
 62 		ArrayAdapter<String> adaptador = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, alFroitas);
 63 
 64 		adaptador.setDropDownViewResource(android.R.layout.simple_list_item_1);
 65 
 66 		lv.setAdapter(adaptador);
 67 
 68 		registerForContextMenu(lv);
 69 	}
 70 
 71 	@Override
 72 	public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
 73 		super.onCreateContextMenu(menu, v, menuInfo);
 74 		MenuInflater inflater = getMenuInflater();
 75 
 76 		// Comprobamos se o menú contextual se lanzou sobre a etiqueta ou sobre
 77 		// a lista
 78 		if (v.getId() == R.id.tv)
 79 			inflater.inflate(R.menu.menu_contextual_etiqueta, menu);
 80 
 81 		else if (v.getId() == R.id.lvFroitas)
 82 			inflater.inflate(R.menu.menu_contextual_lista, menu);
 83 	}
 84 
 85 	@Override
 86 	public boolean onContextItemSelected(MenuItem item) {
 87 		AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
 88 		ArrayAdapter<String> adaptador = (ArrayAdapter<String>) lv.getAdapter();
 89 
 90 		switch (item.getItemId()) {
 91 
 92 		// Ítems premidos sobre o TextView
 93 		// Lanza un Toast coa opción do menú contextual que se seleccinou
 94 		case R.id.tvItem1:
 95 			Toast.makeText(this, "Menú contextual TextView:\n"+item.getTitle(), Toast.LENGTH_SHORT).show();
 96 			return true;
 97 
 98 		case R.id.tvItem2:
 99 			Toast.makeText(this, "Menú contextual TextView:\n"+item.getTitle(), Toast.LENGTH_SHORT).show();
100 			return true;
101 
102 		// Ítems premidos sobre o ListView
103 		case R.id.lvItemBorrar:
104 			adaptador.remove(adaptador.getItem(info.position));
105 			adaptador.setNotifyOnChange(true);
106 			return true;
107 
108 		case R.id.lvItemDuplicar:
109 			adaptador.add(adaptador.getItem(info.position));
110 			adaptador.setNotifyOnChange(true);
111 
112 			return true;
113 		default:
114 			return super.onContextItemSelected(item);
115 		}
116 	}
117 
118 }
  • Liña 30: indicamos que TextView vai ter un menú contextual asociado.
  • Liñas 55-69: Creamos un Array estático que logo asignamos a un dinámico.
    • Liña 62: usamos o array dinámico para logo en tempo de execución poder engadir/borrar elementos do adaptador e por tanto do ListView.
    • Liña 68: indica que o ListView de froitas vai ter un menú contextual asociado.


  • Liñas 71-83: onCreateContexMenu() vai ser chamado cando se prema durante un anaco sobre unha view, neste caso comprobamos sobre que view se premeu e lánzase ("inflase") o correspondente menú contextual, cada un deles definido nun ficheiro xml distinto.


  • Liñas 85-116: En función do id do ítem premido realizamos unhas accións ou outras como no caso dos menús básicos. Só que neste caso os ids proveñen de ítems de menús declarados en 2 ficheiros distintos.


Personalizar título do menú contextual

  • Se queremos que o menú contextual teña un título debemos usar o método: setHeaderTitle()
  • As seguintes imaxes amosan un exemplo para o caso do TextView e o ListView:


  • Os cambios a realizar no código Java son os seguintes:
  • No memento no que hai que crear o menú contextual:
 1 @Override
 2 	public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
 3 		super.onCreateContextMenu(menu, v, menuInfo);
 4 		MenuInflater inflater = getMenuInflater();
 5 
 6 		// Comprobamos se o menú contextual se lanzou sobre a etiqueta ou sobre
 7 		// a lista
 8 		if (v.getId() == R.id.tv){
 9 			menu.setHeaderTitle("Etiqueta de texto");
10 			inflater.inflate(R.menu.menu_contextual_etiqueta, menu);
11 		}
12 		else if (v.getId() == R.id.lvFroitas) {
13 			AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) menuInfo;
14 			menu.setHeaderTitle(lv.getAdapter().getItem(info.position).toString());
15 			inflater.inflate(R.menu.menu_contextual_lista, menu);
16 		}
17 	}
  • Liñas 9,14: establecemos o título para o menú contextual.




-- Ángel D. Fernández González e Carlos Carrión Álvarez -- (2015).