Ejercicio 16 Menu Contextual

7
Ejercicio 16 Menus Principal y Submenus con Opciones NOTA USE UN EMULADOR PARA API 10 (Nexus One) NOTA EN ANDROID MANIFEST USE SOLO MIN-SDK 10 OJO a LOS INDICES DE LAS OPCIONES Variables private TextView labelResultado; private ListView listadoPrincipal; // Definimos el adaptador que va a usar el ListView private ArrayAdapter<String> adaptador; // Matriz con los datos del adaptador private String[] datos = new String[]{"Opción 0 listado","Opción 1 listado","Opción 2 listado","Opción 3 listado","Opción 4 listado"}; Los menús contextuales siempre están asociados a un componente en concreto de la pantalla y se muestra cuando el usuario lo pulsa un rato. Normalmente, se suele mostrar opciones específicas para el elemento pulsado. Por ejemplo, en un componente de tipo lista podríamos tener un menú contextual que aparezca al pulsar sobre un elemento en concreto de la lista y que permita editar su texto o eliminarlo de la lista. La creación y utilización de este tipo de menús contextuales son muy parecidas a las de los menús y submenús básicos que hemos visto anteriormente, aunque presentan algunas particularidades que vamos a tratar a continuación. Vamos a partir del ejemplo anterior de esta Unidad, al que vamos a añadir un menú contextual que aparece al pulsar sobre la etiqueta de texto donde mostramos la opción seleccionada y un ListView con elementos sobre los que pulsar seguidamente y mostrar opciones de edición.

description

ANDROID

Transcript of Ejercicio 16 Menu Contextual

  • Ejercicio 16 Menus Principal y Submenus con Opciones

    NOTA USE UN EMULADOR PARA API 10 (Nexus One)

    NOTA EN ANDROID MANIFEST USE SOLO MIN-SDK 10

    OJO a LOS INDICES DE LAS OPCIONES

    Variables

    private TextView labelResultado;

    private ListView listadoPrincipal;

    // Definimos el adaptador que va a usar el ListView

    private ArrayAdapter adaptador;

    // Matriz con los datos del adaptador

    private String[] datos = new String[]{"Opcin 0 listado","Opcin 1

    listado","Opcin 2 listado","Opcin 3 listado","Opcin 4 listado"};

    Los mens contextuales siempre estn asociados a un componente en

    concreto de la pantalla y se muestra cuando el usuario lo pulsa un

    rato. Normalmente, se suele mostrar opciones especficas para el

    elemento pulsado.

    Por ejemplo, en un componente de tipo lista podramos tener un men

    contextual que aparezca al pulsar sobre un elemento en concreto de la

    lista y que permita editar su texto o eliminarlo de la lista.

    La creacin y utilizacin de este tipo de mens contextuales son muy

    parecidas a las de los mens y submens bsicos que hemos visto

    anteriormente, aunque presentan algunas particularidades que vamos a

    tratar a continuacin.

    Vamos a partir del ejemplo anterior de esta Unidad, al que vamos a

    aadir un men contextual que aparece al pulsar sobre la etiqueta de

    texto donde mostramos la opcin seleccionada y un ListView con

    elementos sobre los que pulsar seguidamente y mostrar opciones de

    edicin.

  • Lo primero que debemos hacer es indicar en el mtodo onCreate() de la

    Actividad que la etiqueta y el listado tienen asociado un men

    contextual. Esto se hace usando la funcin registerForContextMenu():

    @Override

    protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.main);

    //Obtenemos las referencias a los componentes

    labelResultado = (TextView)findViewById(R.id.labelResultado);

    listadoPrincipal =

    (ListView)findViewById(R.id.ListadoPrincipal);

    //Rellenamos la lista con datos de ejemplo

    adaptador = new ArrayAdapter(this,

    android.R.layout.simple_list_item_1, datos);

    listadoPrincipal.setAdapter(adaptador);

    //Asociamos los mens contextuales a los componentes

    registerForContextMenu(labelResultado);

    registerForContextMenu(listadoPrincipal);

    } // end onCreate

    A continuacin, de igual forma que hicimos con los mens bsicos para

    crear las opciones disponibles con el mtodo onCreateOptionsMenu(),

    vamos a construir los mens contextuales asociados a los diferentes

    componentes de la aplicacin con el mtodo onCreateContextMenu().

    A diferencia del mtodo onCreateOptionsMenu() Android invoca este

    mtodo cada vez que es necesario mostrar un men contextual. Este

    mtodo lo implementaremos de misma forma que los mens bsicos,

    inflndolo con un archivo de diseo XML o crendolo con sentencias

    Java. En este ejemplo hemos decidido disear los mens en XML. El men

    contextual que aparece en la etiqueta se define en el fichero

    menu_context_etiqueta.xml:

    El men contextual que aparece en el ListView se define en el fichero

    menu_context_lista.xml:

  • Para implementar el mtodo onCreateContextMenu() hay que tener en

    cuenta que definimos varios mens contextuales en la misma Actividad,

    por lo que hay que construir un men distinto dependiendo del

    componente asociado.

    Para hacerlo, obtenemos el ID del componente al que se va a ir

    asociado el men contextual, que se recibe en el parmetro (View v)

    del mtodo onCreateContextMenu() utilizando el mtodo getId() de dicho

    parmetro:

    @Override

    // Mtodo donde definimos el men contextual cuando se despliega

    public void onCreateContextMenu(ContextMenu menu, View v,

    ContextMenuInfo menuInfo)

    {

    super.onCreateContextMenu(menu, v, menuInfo);

    //Inflador del men contextual

    MenuInflater inflater = getMenuInflater();

    // Si el componente que vamos a dibujar es la etiqueta usamos

    // el fichero XML correspondiente

    if(v.getId() == R.id.labelResultado)

    inflater.inflate(R.menu.menu_context_etiqueta, menu);

    // Si el componente que vamos a dibujar es el ListView usamos

    // el fichero XML correspondiente

    else if(v.getId() == R.id.ListadoPrincipal)

    {

    AdapterView.AdapterContextMenuInfo info =

    (AdapterView.AdapterContextMenuInfo)menuInfo;

    // Definimos la cabecera del men contextual

    menu.setHeaderTitle(

    listadoPrincipal.getAdapter().getItem(info.position).toString());

    // Inflamos el men contextual

    inflater.inflate(R.menu.menu_context_lista, menu);

    }

    }

  • En el caso del men contextual para el listado hemos personalizado el ttulo

    del men contextual mediante el mtodo setHeaderTitle(), para que muestre el

    texto del elemento seleccionado en el listado.

    Para hacer esto es necesario conocer la posicin del elemento seleccionado en

    el listado mediante el ltimo parmetro menuInfo. Este parmetro contiene

    informacin adicional del componente sobre el que el usuario ha pulsado para

    mostrar el men contextual.

    En este caso en particular del componente ListView contiene la posicin del

    elemento pulsado. Para obtenerlo, hacemos un cambio de formato (typecasting)

    del parmetro menuInfo a un objeto del tipo AdapterContextMenuInfo y

    accedemos a su propiedad position.

    Por ltimo, para implementar las acciones que hay que ejecutar cuando el

    usuario selecciona una opcin determinada del men contextual vamos a

    implementar el mtodo onContextItemSelected() de manera similar a cmo

    hacamos con onOptionsItemSelected() para los mens bsicos:

    @Override

    // Si el usuario selecciona una opcin del men contextual mostramos

    // la opcin seleccionada en la etiqueta

    public boolean onContextItemSelected(MenuItem item) {

    AdapterContextMenuInfo info =

    (AdapterContextMenuInfo) item.getMenuInfo();

    switch (item.getItemId()) {

    // Se selecciona la opcin 1 de men contextual de la etiqueta

    case R.id.ContextLabelOp1:

    labelResultado.setText("Etiqueta: Opcin 1");

    return true;

    // Se selecciona la opcin 2 de men contextual de la etiqueta

    case R.id.ContextLabelOp2:

    labelResultado.setText("Etiqueta: Opcin 2");

    return true;

    // Se selecciona la opcin "Editar texto opcin" de men

    contextual de la etiqueta

    case R.id.EditTextOp:

    labelResultado.setText("Opcin " + info.position + "

    listado: Cambio de texto");

    // Cambiamos el contenido de la matriz de datos

    datos[info.position]="Opcin "+info.position+" listado

    modificado";

    // Reiniciamos el adaptador para que recargue los datos y

    actualice el ListBox

    adaptador.notifyDataSetChanged();

    return true;

  • // Se selecciona la opcin "Reiniciar texto opcin" de men

    contextual de la etiqueta

    case R.id.ReiniciaTextOp:

    labelResultado.setText("Opcin " + info.position + "

    listado: Reinicio texto");

    datos[info.position]="Opcin "+info.position+" listado";

    adaptador.notifyDataSetChanged();

    return true;

    default:

    return super.onContextItemSelected(item);

    }

    }

    Fjate en el cdigo anterior que se puede mantener pulsado el dedo sobre la

    etiqueta azul o sobre una opcin del listado y seleccionar una de las

    opciones del men contextual.

  • En el cdigo anterior tambin hemos utilizado la informacin del

    objeto AdapterContextMenuInfo para saber qu elemento de la lista se

    ha pulsado aunque, en esta ocasin, lo obtenemos llamando al mtodo

    getMenuInfo() de la opcin de men MenuItem recibida como parmetro.

    Adems, para modificar la opcin del listado hemos usado el mtodo

    notifyDataSetChanged() del adaptador para que se recarguen los

    elementos del listado una vez hemos modificado el texto de uno de

    ellos.

    SI NECESITAIS EL MAIN.XML

  • android:layout_width="fill_parent" android:text="Opcin

    seleccionada:"

    android:textAppearance="?android:attr/textAppearanceLarge"

    android:layout_marginLeft="3dip"

    android:layout_marginTop="20dip">