Implementación del cajón de navegación del menú lateral ActionBarSherlock en Android

Descargue la biblioteca de soporte más reciente

Descargue la última revisión de la biblioteca de soporte 13 que admite el nuevo Cajón de navegación. 

Enlace:  http://developer.android.com/tools/extras/support-library.html

Reemplace la biblioteca de soporte anterior ( android-support-v4.jar ) con la nueva biblioteca de soporte en su  biblioteca ActionBarSherlock.

Paquete de soporte, revisión 13 (mayo de 2013)

Cambios para la biblioteca de soporte v4:
  • Se agregó DrawerLayout  para crear un cajón de navegación que se puede extraer desde el borde de una ventana.

Prepare su proyecto importando la  biblioteca ActionBarSherlock .

Cree un nuevo proyecto en Eclipse  File  >  New  >  Android Application Project. Complete los detalles y nombre su proyecto  SideMenuTutorial .

Nombre de la aplicación:  SideMenuTutorial

Nombre del proyecto:  SideMenuTutorial

Nombre del paquete:  com.androidbegin.sidemenututorial

Abra su  MainActivity .java  y pegue el siguiente código.

Actividad principal .java

paquete com.androidbegin.sidemenututorial;

importar com.actionbarsherlock.app.SherlockFragmentActivity;
importar com.actionbarsherlock.view.MenuItem;

importar android.support.v4.app.FragmentTransaction;
importar android.support.v4.app.Fragment;
importar android.content.res.Configuration;
importar android.os.Bundle;
importar android.support.v4.app.ActionBarDrawerToggle;
importar android.support.v4.widget.DrawerLayout;
importar android.view.View;
importar android.widget.AdapterView;
importar android.widget.ListView;
importar android.support.v4.view.GravityCompat;

clase pública MainActivity extiende SherlockFragmentActivity {

	// Declarar Variables
	DrawerLayoutmDrawerLayout;
	ListView mDrawerList;
	ActionBarDrawerToggle mDrawerToggle;
	MenuListAdapter mMenuAdapter;
	Cadena[] título;
	Cadena[] subtítulo;
	icono int[];
	Fragmento fragmento1 = nuevo Fragmento1();
	Fragmento fragmento2 = nuevo Fragmento2();
	Fragmento fragmento3 = nuevo Fragmento3();
	privado CharSequence mDrawerTitle;
	privado CharSequence mTitle;

	@Anular
	public void onCreate (Paquete guardadoInstanceState) {
		super.onCreate(estadoDeInstanciaGuardado);
		// Obtener la vista del cajón_principal.xml
		setContentView(R.layout.drawer_main);

		// Obtener el Título
		mTitle = mDrawerTitle = getTitle();

		// Generar titulo
		title = new String[] { "Título Fragmento 1", "Título Fragmento 2",
				"Título Fragmento 3" };

		// Generar subtitulo
		subtítulo = new String[] { "Fragmento de subtítulo 1", "Fragmento de subtítulo 2",
				"Fragmento de subtítulo 3" };

		// Generar icono
		icono = nuevo int[] { R.drawable.action_about, R.drawable.action_settings,
				R.drawable.colecciones_nube};

		// Localiza DrawerLayout en el cajón_principal.xml
		mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);

		// Localiza ListView en el cajón_principal.xml
		mDrawerList = (ListView) findViewById(R.id.listview_drawer);

		// Establecer una sombra personalizada que superponga el contenido principal cuando el cajón
		// abre
		mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow,
				GravityCompat.INICIO);

		// Pasar arreglos de cadenas a MenuListAdapter
		mMenuAdapter = new MenuListAdapter(MainActivity.this, title, subtitle,
				icono);

		// Establecer el MenuListAdapter en ListView
		mDrawerList.setAdapter(mMenuAdapter);

		// Capturar elemento de menú de vista de lista hacer clic
		mDrawerList.setOnItemClickListener(nuevo DrawerItemClickListener());

		// Habilitar el ícono de la aplicación ActionBar para que se comporte como una acción para alternar el cajón de navegación
		getSupportActionBar().setHomeButtonEnabled(true);
		getSupportActionBar().setDisplayHomeAsUpEnabled(true);

		// ActionBarDrawerToggle une las interacciones adecuadas
		// entre el cajón deslizante y el icono de la aplicación de la barra de acción
		mDrawerToggle = new ActionBarDrawerToggle(esto, mDrawerLayout,
				R.dibujable.ic_cajón, R.cadena.cajón_abierto,
				R.cadena.cajón_cerrar) {

			public void onDrawerClosed(Ver vista) {
				// TODO stub de método generado automáticamente
				super.onDrawerClosed(ver);
			}

			public void onDrawerOpened(Ver vista del cajón) {
				// TODO stub de método generado automáticamente
				// Establecer el título en la acción cuando se abre el cajón
				getSupportActionBar().setTitle(mDrawerTitle);
				super.enCajónAbierto(vistaCajón);
			}
		};

		mDrawerLayout.setDrawerListener(mDrawerToggle);

		if (estadoInstanciaGuardada == nulo) {
			seleccionar elemento (0);
		}
	}

	@Anular
	onOptionsItemSelected booleano público (elemento MenuItem) {

		if (elemento.getItemId() == android.R.id.home) {

			si (mDrawerLayout.isDrawerOpen(mDrawerList)) {
				mDrawerLayout.closeDrawer(mDrawerList);
			} más {
				mDrawerLayout.openDrawer(mDrawerList);
			}
		}

		volver super.onOptionsItemSelected(elemento);
	}

	// Escucha de clics de ListView en el cajón de navegación
	implementos de clase privada DrawerItemClickListener
			ListView.OnItemClickListener {
		@Anular
		public void onItemClick(AdapterView<?> parent, View view, int position,
				identificación larga) {
			seleccionar elemento (posición);
		}
	}

	selectItem vacío privado (posición int) {

		FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
		// Localizar posición
		interruptor (posición) {
		caso 0:
			ft.replace(R.id.content_frame, fragmento1);
			descanso;
		caso 1:
			ft.replace(R.id.content_frame, fragmento2);
			descanso;
		caso 2:
			ft.replace(R.id.content_frame, fragmento3);
			descanso;
		}
		ft.commit();
		mDrawerList.setItemChecked(posición, verdadero);

		// Obtener el título seguido de la posición
		setTitle(título[posición]);
		// Cerrar cajón
		mDrawerLayout.closeDrawer(mDrawerList);
	}

	@Anular
	vacío protegido en PostCreate (Paquete de estado de instancia guardado) {
		super.onPostCreate(estadoDeInstanciaGuardado);
		// Sincroniza el estado de alternancia después de que se haya producido onRestoreInstanceState.
		mDrawerToggle.syncState();
	}

	@Anular
	public void onConfigurationChanged(Configuración newConfig) {
		super.onConfigurationChanged(newConfig);
		// Pasar cualquier cambio de configuración a los conmutadores del cajón
		mDrawerToggle.onConfigurationChanged(nuevaConfig);
	}

	@Anular
	public void setTitle(CharSequence title) {
		mTitulo = titulo;
		getSupportActionBar().setTitle(mTitle);
	}
}

En esta actividad, hemos creado algunos títulos, subtítulos e íconos de muestra en matrices de cadenas y números enteros y los pasamos a MenuListAdapter para mostrarlos en una vista de lista como un menú lateral. Al hacer clic en el menú lateral de la vista de lista, se mostrará el fragmento seleccionado junto con el título en la barra de acción. ActionBarDrawerToggle facilita el comportamiento de interacción adecuado entre el icono de la barra de acción y el cajón de navegación.

Hemos preparado algunos íconos de muestra para este tutorial. Inserte los íconos de muestra descargados en su res > drawable-hdpi .

Iconos de muestra

[etiqueta wpfilebase = ID de archivo = 49 tpl = botón de descarga /]

A continuación, cree un diseño gráfico XML para su cajón de navegación. Vaya a  res  >  diseño  > Haga clic con el botón derecho en el  diseño  >  Nuevo  >  Archivo XML de Android

Asigne un nombre a su nuevo archivo XML cajón_principal.xml  y pegue el siguiente código.

cajón_principal .xml

<android.support.v4.widget.DrawerLayout xmlns_android="http://schemas.android.com/apk/res/android"
    android_id="@+id/diseño_cajón"
    android_layout_width="match_parent"
    android_layout_height="match_parent" >

    <FrameLayout
        android_id="@+id/content_frame"
        android_layout_width="match_parent"
        android_layout_height="match_parent" />

    <ListView
        android_id="@+id/listview_drawer"
        android_layout_width="240dp"
        android_layout_height="match_parent"
        android_layout_gravity="inicio"
        androide_fondo="#111"
        android_choiceMode="singleChoice"
        android_divider="@android:color/transparente"
        android_dividerHeight="0dp" />

</android.support.v4.widget.DrawerLayout>

Producción:

Diseño XML de navegación del menú lateral  

A continuación, cree una clase de adaptador de menú personalizado. Vaya a  Archivo  >  Nuevo  >  Clase  y asígnele el nombre  MenuListAdapter .java. Seleccione su paquete llamado  com.androidbegin.sidemenututorial  y haga clic en  Finalizar .

Abra su  MenuListAdapter .java  y pegue el siguiente código.

MenuListAdapter .java

paquete com.androidbegin.sidemenututorial;

importar android.content.Context;
importar android.view.LayoutInflater;
importar android.view.View;
importar android.view.ViewGroup;
importar android.widget.BaseAdapter;
importar android.widget.ImageView;
importar android.widget.TextView;

clase pública MenuListAdapter extiende BaseAdapter {

	// Declarar Variables
	contexto contexto;
	Cadena[] mTitulo;
	Cadena[] mSubTítulo;
	int[] icono;
	LayoutInflater inflador;

	Public MenuListAdapter (contexto contextual, título de cadena [], subtítulo de cadena [],
			int[] icono) {
		este.contexto = contexto;
		this.mTitle = título;
		this.mSubTitle = subtítulo;
		este.mIcon = icono;
	}

	@Anular
	public int getCount() {
		devuelve mTitulo.longitud;
	}

	@Anular
	objeto público getItem (posición int) {
		return mTitulo[posicion];
	}

	@Anular
	getItemId largo público (posición int) {
		posición de retorno;
	}

	public View getView (posición int, View convertView, ViewGroup parent) {
		// Declarar Variables
		Vista de texto txtTitle;
		Vista de texto txtSubTitle;
		ImageView imgIcon;

		inflador = (LayoutInflater) contexto
				.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
		Ver itemView = inflater.inflate(R.layout.drawer_list_item, padre,
				falso);

		// Localiza las Vistas de Texto en el cajón_lista_elemento.xml
		txtTitle = (TextView) itemView.findViewById(R.id.title);
		txtSubTitle = (TextView) itemView.findViewById(R.id.subtitle);

		// Ubique el ImageView en el cajón_lista_elemento.xml
		imgIcon = (ImageView) itemView.findViewById(R.id.icon);

		// Establecer los resultados en TextViews
		txtTitle.setText(mTitle[posición]);
		txtSubTitle.setText(mSubTitle[posición]);

		// Establecer los resultados en ImageView
		imgIcon.setImageResource(mIcon[posición]);

		volver itemView;
	}

}

En esta clase de adaptador de menú personalizado, las matrices de cadenas y enteros se configuran en TextViews e ImageViews seguidas de las posiciones.

A continuación, cree un diseño gráfico XML para el elemento de menú de vista de lista. Vaya a  res  >  diseño  > Haga clic con el botón derecho en el  diseño  >  Nuevo  >  Archivo XML de Android

Asigne un nombre a su nuevo archivo XML  cajón_lista_elemento.xml  y pegue el siguiente código.

cajón_lista_elemento .xml

<?versión xml="1.0" codificación="utf-8"?>
<LinearLayout xmlns_android="http://schemas.android.com/apk/res/android"
    estilo="?attr/spinnerDropDownItemStyle"
    android_layout_width="match_parent"
    android_layout_height="?attr/dropdownListPreferredItemHeight"
    android_background="?android:attr/activatedBackgroundIndicator"
    android:orientación="horizontal" >

    <ImagenVista
        android_id="@+id/icono"
        android_layout_width="wrap_content"
        android_layout_height="match_parent"
        android_justViewBounds="true" />

    <LinearLayout
        android_layout_width="wrap_content"
        android_layout_height="match_parent"
        android_gravedad="centro_vertical|izquierda"
        android:orientación="vertical" >

        <Vista de texto
            android_id="@+id/título"
            estilo="?attr/spinnerDropDownItemStyle"
            android_layout_width="wrap_content"
            android_layout_height="wrap_content"
            Android: ellipsize = "fin"
            android_singleLine="verdadero" />

        <Vista de texto
            android_id="@+id/subtítulo"
            estilo="?attr/spinnerDropDownItemStyle"
            android_layout_width="wrap_content"
            android_layout_height="wrap_content"
            Android: ellipsize = "fin"
            android_singleLine="verdadero"
            android_textAppearance="?attr/textAppearancePequeño" />
    </LinearLayout>

</LinearLayout>

Producción:

Artículo de la lista del cajón

A continuación, cree el primer fragmento. Vaya a  Archivo  >  Nuevo  >  Clase  y asígnele el nombre  Fragmentos1 .java. Seleccione su paquete llamado  com.androidbegin. sidemenututorial  y haga clic en  Finalizar .

Abra su  Fragments1 .java  y pegue el siguiente código.

Fragmentos1 .java

paquete com.androidbegin.sidemenututorial;

importar com.actionbarsherlock.app.SherlockFragment;
importar android.os.Bundle;
importar android.view.LayoutInflater;
importar android.view.View;
importar android.view.ViewGroup;

public class Fragment1 extiende SherlockFragment {
	@Anular
	Public View onCreateView(LayoutInflater inflater, contenedor ViewGroup,
			Paquete guardadoInstanceState) {
		Ver rootView = inflater.inflate(R.layout.fragment1, container, false);
		volver rootView;
	}

}

A continuación, cree el segundo fragmento. Vaya a  Archivo  >  Nuevo  >  Clase  y asígnele el nombre  Fragmentos2 .java. Seleccione su paquete llamado  com.androidbegin. sidemenututorial  y haga clic en  Finalizar .

Abra su  Fragments2 .java  y pegue el siguiente código.

Fragmentos2 .java

paquete com.androidbegin.sidemenututorial;

importar com.actionbarsherlock.app.SherlockFragment;
importar android.os.Bundle;
importar android.view.LayoutInflater;
importar android.view.View;
importar android.view.ViewGroup;

public class Fragment2 extiende SherlockFragment {
	@Anular
	Public View onCreateView(LayoutInflater inflater, contenedor ViewGroup,
			Paquete guardadoInstanceState) {
		Ver rootView = inflater.inflate(R.layout.fragment2, container, false);
		volver rootView;
	}

}

A continuación, cree el tercer fragmento. Vaya a  Archivo  >  Nuevo  >  Clase  y asígnele el nombre  Fragmentos3 .java. Seleccione su paquete llamado  com.androidbegin. sidemenututorial  y haga clic en  Finalizar .

Abra su  Fragments3 .java  y pegue el siguiente código.

Fragmentos3 .java

paquete com.androidbegin.sidemenututorial;

importar com.actionbarsherlock.app.SherlockFragment;
importar android.os.Bundle;
importar android.view.LayoutInflater;
importar android.view.View;
importar android.view.ViewGroup;

public class Fragment3 extiende SherlockFragment {
	@Anular
	Public View onCreateView(LayoutInflater inflater, contenedor ViewGroup,
			Paquete guardadoInstanceState) {
		Ver rootView = inflater.inflate(R.layout.fragment3, container, false);
		volver rootView;
	}

}

A continuación, cree un diseño gráfico XML para el primer fragmento. Vaya a  res  >  diseño  > Haga clic con el botón derecho en el  diseño  >  Nuevo  >  Archivo XML de Android

Nombre su nuevo archivo XML  fragment1.xml  y pegue el siguiente código.

fragmento1 .xml

<RelativeLayout xmlns_android="http://schemas.android.com/apk/res/android"
    xmlns_herramientas="http://esquemas.android.com/herramientas"
    android_layout_width="match_parent"
    android_layout_height="match_parent" >

    <Vista de texto
        android_layout_width="wrap_content"
        android_layout_height="wrap_content"
        android_layout_centerHorizontal="verdadero"
        android_layout_centerVertical="verdadero"
        android_text="@cadena/Fragmento1" />

</RelativeLayout>

A continuación, cree un diseño gráfico XML para el segundo fragmento. Vaya a  res  >  diseño  > Haga clic con el botón derecho en el  diseño  >  Nuevo  >  Archivo XML de Android

Nombre su nuevo archivo XML  fragment2.xml  y pegue el siguiente código.

fragmento2 .xml

<RelativeLayout xmlns_android="http://schemas.android.com/apk/res/android"
    xmlns_herramientas="http://esquemas.android.com/herramientas"
    android_layout_width="match_parent"
    android_layout_height="match_parent" >

    <Vista de texto
        android_layout_width="wrap_content"
        android_layout_height="wrap_content"
        android_layout_centerHorizontal="verdadero"
        android_layout_centerVertical="verdadero"
        android_text="@cadena/Fragmento2" />

</RelativeLayout>

A continuación, cree un diseño gráfico XML para el tercer fragmento. Vaya a  res  >  diseño  > Haga clic con el botón derecho en el  diseño  >  Nuevo  >  Archivo XML de Android

Nombre su nuevo archivo XML  fragment3.xml  y pegue los siguientes códigos.

fragmento3 .xml

<RelativeLayout xmlns_android="http://schemas.android.com/apk/res/android"
    xmlns_herramientas="http://esquemas.android.com/herramientas"
    android_layout_width="match_parent"
    android_layout_height="match_parent" >

    <Vista de texto
        android_layout_width="wrap_content"
        android_layout_height="wrap_content"
        android_layout_centerHorizontal="verdadero"
        android_layout_centerVertical="verdadero"
        android_text="@cadena/Fragmento3" />

</RelativeLayout>

A continuación, cambie el nombre y los textos de la aplicación. Abra su  strings.xml  en su carpeta  res  >  valores  y pegue el siguiente código.

cadenas.xml

<recursos>

    <string name="app_name">Tutorial del menú lateral</string>
    <string name="hello_world">¡Hola mundo!</string>
    <string name="menu_settings">Configuración</string>
    <string name="Fragment1">Este es el Fragmento 1</string>
    <string name="Fragment2">Este es el Fragmento 2</string>
    <string name="Fragment3">Este es el Fragmento 3</string>
    <string name="drawer_open">Abrir cajón de navegación</string>
    <string name="drawer_close">Cerrar cajón de navegación</string>

</recursos>

En su  AndroidManifest.xml , debemos cambiar el estilo del tema a » Theme.Sherlock » y establecer la versión SDK mínima de Android que prefiera. Abra su  AndroidManifest.xml  y pegue el siguiente código.

AndroidManifest.xml

<manifiesto xmlns_android="http://schemas.android.com/apk/res/android"
    paquete="com.androidbegin.sidemenututorial"
    android_versionCode="1"
    android_versionName="1.0" >

    <usos-sdk
        android_minSdkVersion="4"
        android_targetSdkVersion="15" />

    <aplicación
        android_icono="@dibujable/ic_launcher"
        android_etiqueta="@cadena/nombre_aplicación"
        android_tema="@estilo/Tema.Sherlock" >
        <actividad android_name=".MainActivity" >
            <intent-filter>
                <acción android_name="android.intent.action.MAIN" />

                <categoría android_name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </actividad>
    </aplicación>

</manifiesto>