Scroll to top

Spanish (Español) translation by Juliana Carvajal (you can also view the original English article)

¡Obtén información sobre los menús contextuales y la interacción del usuario con una pulsación prolongada en Android en este consejo rápido del SDK de Android!

La plataforma Android proporciona algunos menús estándar que puedes usar en tus aplicaciones. El menú contextual aparece cuando los usuarios mantienen presionados elementos de la interfaz de usuario, presionando el elemento y manteniéndolo presionado hasta que aparezca el menú. Los usuarios de Android suelen estar acostumbrados a este tipo de interacción, ya que es estándar para las funciones del sistema, como la modificación de los iconos de la pantalla de inicio. La guía para desarrolladores de Android compara el menú contextual con hacer clic con el botón derecho en una computadora. La implementación del menú contextual es sencilla y es un ingrediente clave en muchas aplicaciones.


Paso 1: Abre o crea un proyecto

Si tienes una aplicación existente con la que deseas implementar un menú contextual, abre la clase de actividad a la que deseas agregarla. De lo contrario, crea un nuevo proyecto y agrégale una clase de actividad. El código fuente incluye todo el procesamiento necesario, así que si no estás seguro, consúltalo. Si estás creando una nueva actividad para tu aplicación, recuerda agregarla a tu archivo de manifiesto de la siguiente manera:

1
<activity android:name=".MyLovelyClass"></activity>

Modifica el nombre para adaptarlo a tu propia clase.


Paso 2: Importa los recursos de Android

Agrega las declaraciones de importación necesarias para el procesamiento del menú contextual. Es posible que no necesites todos estos recursos importados dependiendo de cómo elijas implementar el menú contextual, y tu IDE puede agregar algunos de ellos automáticamente. Para usar la técnica como se demuestra en este tutorial, tu clase Activity necesitará las siguientes importaciones:

1
import android.app.Activity;
2
import android.os.Bundle;
3
import android.view.ContextMenu;
4
import android.view.MenuInflater;
5
import android.view.MenuItem;
6
import android.view.View;
7
import android.view.ContextMenu.ContextMenuInfo;
8
import android.widget.TextView;
9
import android.widget.Toast;

Paso 3: agrega un elemento de la interfaz de usuario a la pulsación larga

Dentro del diseño de tu actividad, incluye el elemento de vista de la interfaz de usuario que deseas que los usuarios puedan mantener presionado para el menú contextual. El siguiente contenido XML de diseño te muestra cómo hacer esto, así que úsalo si estás creando un nuevo proyecto y necesitas ayuda:

1
<LinearLayout xmlns:android="https://schemas.android.com/apk/res/android"
2
	android:layout_width="fill_parent"
3
	android:layout_height="fill_parent"
4
	android:orientation="vertical"
5
	android:gravity="center" >
6
<TextView android:id="@+id/press" 
7
	android:layout_width="wrap_content" 
8
	android:layout_height="wrap_content"
9
	android:textSize="30sp"
10
	android:text="Long-press me" />
11
</LinearLayout>

Puedes indicarle a tu clase de actividad que use este diseño de la siguiente manera:

1
public class MyLovelyClass extends Activity {
2
	public void onCreate(Bundle savedInstanceState) {
3
		super.onCreate(savedInstanceState);
4
		setContentView(R.layout.lovely_layout);
5
	}
6
}

Modifica el nombre para adaptarlo a tu propia clase. En este caso, el archivo de diseño XML se guarda como "lovely_layout.xml" en la carpeta "res/layout" de la aplicación.

Activity Screen With Interactive View ItemActivity Screen With Interactive View ItemActivity Screen With Interactive View Item

Paso 4: crea un recurso de menú

Si tu paquete de aplicación no tiene una carpeta de "menú" dentro del directorio de recursos "res", crea una. Dentro de la carpeta del menú, crea un nuevo archivo XML para tu menú y guárdalo con el nombre que elijas. En este archivo, define los elementos que aparecerán en el menú contextual. Puedes utilizar el siguiente código:

1
<menu xmlns:android="http://schemas.android.com/apk/res/android">
2
    <item android:id="@+id/option1"
3
	android:title="A Context Option" />
4
    <item android:id="@+id/option2"
5
	android:title="Another Context Option" />
6
</menu>

Modifica los elementos para adaptarlos a tu propia aplicación y agrega más si es necesario.


Paso 5: Regístrate para el menú contextual

Debes indicarle a Android que escuche las pulsaciones prolongadas en el elemento de la interfaz de usuario para el que desee proporcionar el menú contextual. Dentro del método "onCreate" de tu actividad, agrega el siguiente código, haciendo modificaciones para adaptarse a los detalles de tu propia aplicación:

1
	//get a reference to the view for pressing

2
TextView pressView = (TextView)findViewById(R.id.press);
3
	//register if for context

4
registerForContextMenu(pressView);

Especifica el atributo de ID que usaste para tu propio elemento de vista en el archivo de diseño XML donde este ejemplo usa "presionar". Esto le indica a tu aplicación que detecte a los usuarios que presionan prolongadamente el elemento de vista especificado. Cuando eso suceda, la aplicación llamará al método "onCreateContextMenu" en el que puedes indicarle que use el recurso del menú contextual.


Paso 6: usa tu recurso de menú

Debes informar a Android que deseas que use el recurso de menú XML que creó como menú contextual para el elemento de vista registrado. Agrega el siguiente método en tu clase de actividad:

1
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
2
	super.onCreateContextMenu(menu, v, menuInfo);
3
	MenuInflater inflater = getMenuInflater();
4
	inflater.inflate(R.menu.lovely_context, menu);
5
}

Modifica esto si es necesario para reflejar el nombre de archivo que elegiste para tu propio archivo XML del menú contextual. Este ejemplo usa un archivo de menú llamado "lovely_context.xml" para demostración.

Menu Items to Appear on Long-PressMenu Items to Appear on Long-PressMenu Items to Appear on Long-Press

Paso 7: Implementar prensas largas

Tu clase de actividad ahora detecta pulsaciones prolongadas en tu elemento de vista, pero aún necesitas definir qué debe suceder cuando se selecciona cada elemento en tu menú. Agrega el siguiente método a tu clase:

1
public boolean onContextItemSelected(MenuItem item) {
2
		//find out which menu item was pressed

3
	switch (item.getItemId()) {
4
		case R.id.option1:
5
			doOptionOne();
6
			return true;
7
		case R.id.option2:
8
			doOptionTwo();
9
			return true;
10
		default:
11
			return false;
12
	}
13
}

Modifica las declaraciones de casos para que reflejen los atributos de identificación que le diste a tus elementos de menú en el archivo XML. La declaración de cambio utiliza el parámetro de elemento de menú pasado para verificar qué opción de menú ha seleccionado el usuario. Puedes incluir una declaración de caso adicional para cada opción en tu menú contextual si agregaste más tú mismo. Dentro de cada declaración, el código especifica un método para llamar cuando el usuario elige ese elemento. Ahora necesitas implementar los métodos especificados en esta declaración.

Choosing an Item From the Context MenuChoosing an Item From the Context MenuChoosing an Item From the Context Menu

Paso 8: agrega métodos de opciones de contexto

La definición de métodos dedicados para cada opción del menú contextual mantiene tu clase de actividad bien organizada, así que agrega cada uno de los que incluiste en tu declaración de cambio. Los siguientes métodos demuestran el principio:

1
//method to execute when option one is chosen

2
private void doOptionOne() {
3
	Toast.makeText(this, "Option One Chosen...", Toast.LENGTH_LONG).show();
4
}
5
6
//method to execute when option two is chosen

7
private void doOptionTwo() {
8
	Toast.makeText(this, "Option Two Chosen...", Toast.LENGTH_LONG).show();	
9
}

Estos métodos simplemente escriben un mensaje corto en la interfaz para realizar una demostración. En tus propias clases puedes implementar cualquier procesamiento que necesites.

Context Menu Item Choice ResultContext Menu Item Choice ResultContext Menu Item Choice Result

Conclusión

Tu aplicación ahora tiene el código de procesamiento necesario para proporcionar el menú contextual a los usuarios que presionan y mantienen presionado el elemento de vista elegido. A continuación, se muestra el código de actividad completo, y puedes descargar la carpeta de origen adjunta que también contiene los archivos XML para el diseño y los elementos del menú.

1
import android.app.Activity;
2
import android.os.Bundle;
3
import android.view.ContextMenu;
4
import android.view.MenuInflater;
5
import android.view.MenuItem;
6
import android.view.View;
7
import android.view.ContextMenu.ContextMenuInfo;
8
import android.widget.TextView;
9
import android.widget.Toast;
10
11
public class MyLovelyClass extends Activity {
12
13
	public void onCreate(Bundle savedInstanceState) {
14
		super.onCreate(savedInstanceState);
15
		setContentView(R.layout.lovely_layout);
16
			
17
		//get a reference to the view for pressing

18
		TextView pressView = (TextView)findViewById(R.id.press);
19
		
20
                //register it for context

21
		registerForContextMenu(pressView);
22
	}
23
	
24
	public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
25
		super.onCreateContextMenu(menu, v, menuInfo);
26
		MenuInflater inflater = getMenuInflater();
27
		inflater.inflate(R.menu.lovely_context, menu);
28
	}
29
	
30
	public boolean onContextItemSelected(MenuItem item) {
31
			//find out which menu item was pressed

32
		switch (item.getItemId()) {
33
			case R.id.option1:
34
				doOptionOne();
35
				return true;
36
			case R.id.option2:
37
				doOptionTwo();
38
				return true;
39
			default:
40
				return false;
41
		}
42
	}
43
	
44
	private void doOptionOne() {
45
		Toast.makeText(this, "Option One Chosen...", Toast.LENGTH_LONG).show();
46
	}
47
	
48
	private void doOptionTwo() {
49
		Toast.makeText(this, "Option Two Chosen...", Toast.LENGTH_LONG).show();		
50
	}
51
}

Si tu aplicación incluye una sección de ayuda o instrucciones de cualquier tipo, es posible que desees mencionar el elemento con el menú contextual, ya que es posible que tus usuarios no se den cuenta de que se ha proporcionado esta funcionalidad.


Sobre el autor

Sue Smith

Soy un desarrollador web / de software y un escritor técnico / de comedia; consulta BeNormal.info para obtener más detalles. Las Nonsense apps son mi primer intento de desarrollo para Android. He escrito para muchos clientes diferentes, incluida Smashing Magazine. Mis propios sitios incluyen la revista de artes falsas BrainDeadAir. Sígueme en Twitter @BrainDeadAir o envíame un correo electrónico a sue@benormal.info.