Menús
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
- 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:
- A seguinte imaxe amosa 3 botóns de menú na Barra de Acción e o menú Overflow
- Nesta imaxe vese como un dos menús da action bar ten submenús:
- Finalmente as seguintes imaxes amosan Menús Contextuais
- Flotantes (esquerda)
- ou na barra de accións (dereita)
- Referencias:
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
- 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.
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.
- <group>: un grupo é un conxunto de elementos que teñen certas características.
- 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.
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
- Menús básicos
As imaxes dos menús
- Neste caso colocouse en cada recurso res/drawable a imaxe da cara:
- Esta imaxe pode obterse do seguinte zip: media:Res.zip e unha vez descomprimido pódese copiar tal cal ao proxecto a "res"
- Estas imaxes e outras poden obterse de:
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.
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).
- O funcionamento é semellante ao anterior e deixamos para o participante no curso o seguinte enlace para que afonde no seu funcionamento:
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
- Creación dunha segunda Activity
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.
- 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:
- Títulos para os menús contextuais
- 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).