Menu lateral Personalizado (NavDrawer)










MyActivity.java
import java.util.ArrayList;

import android.app.Activity;
import android.app.Fragment;
import android.app.FragmentManager;
import android.content.res.Configuration;
import android.content.res.TypedArray;
import android.os.Bundle;
import android.support.v4.app.ActionBarDrawerToggle;
import android.support.v4.widget.DrawerLayout;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;

import menudesilzante.NavDrawerItem;
import menudesilzante.NavDrawerListAdapter;

public class MyActivity extends Activity {
    private DrawerLayout mDrawerLayout;
    private ListView mDrawerList;
    private ActionBarDrawerToggle mDrawerToggle;

    // nav drawer title
    private CharSequence mDrawerTitle;

    // used to store app title
    private CharSequence mTitle;

    // slide menu items
    private String[] navMenuTitles;
    private TypedArray navMenuIcons;

    private ArrayList navDrawerItems;
    private NavDrawerListAdapter adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_my);

        mTitle = mDrawerTitle = getTitle();

        // load slide menu items
        navMenuTitles = getResources().getStringArray(R.array.nav_drawer_items);

        // nav drawer icons from resources
        navMenuIcons = getResources()
                .obtainTypedArray(R.array.nav_drawer_icons);

        mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
        mDrawerList = (ListView) findViewById(R.id.list_slidermenu);

        navDrawerItems = new ArrayList();

        // agregar un nuevo item al menu deslizante
        // Seccion1
        navDrawerItems.add(new NavDrawerItem(navMenuTitles[0], navMenuIcons.getResourceId(0, -1)));
        // Seccion2
        navDrawerItems.add(new NavDrawerItem(navMenuTitles[1], navMenuIcons.getResourceId(1, -1)));
        // Seccion3
        navDrawerItems.add(new NavDrawerItem(navMenuTitles[2], navMenuIcons.getResourceId(2, -1), true, "Primavera/\nVerano"));
        // Seccion4
        navDrawerItems.add(new NavDrawerItem(navMenuTitles[3], navMenuIcons.getResourceId(3, -1)));
      
        // Recycle the typed array
        navMenuIcons.recycle();

        mDrawerList.setOnItemClickListener(new SlideMenuClickListener());

        // setting the nav drawer list adapter
        adapter = new NavDrawerListAdapter(getApplicationContext(),
                navDrawerItems);
        mDrawerList.setAdapter(adapter);

        // enabling action bar app icon and behaving it as toggle button
        getActionBar().setDisplayHomeAsUpEnabled(true);
        getActionBar().setHomeButtonEnabled(true);

        mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,
                R.drawable.ic_drawer, //nav menu toggle icon
                R.string.app_name, // nav drawer open - description for accessibility
                R.string.app_name // nav drawer close - description for accessibility
        ) {
            public void onDrawerClosed(View view) {
                getActionBar().setTitle(mTitle);
                // calling onPrepareOptionsMenu() to show action bar icons
                invalidateOptionsMenu();
            }

            public void onDrawerOpened(View drawerView) {
                getActionBar().setTitle(mDrawerTitle);
                // calling onPrepareOptionsMenu() to hide action bar icons
                invalidateOptionsMenu();
            }
        };
        mDrawerLayout.setDrawerListener(mDrawerToggle);

        if (savedInstanceState == null) {
            // on first time display view for first nav item
            displayView(0);
        }
    }

    /**
     * Slide menu item click listener
     * */
    private class SlideMenuClickListener implements
            ListView.OnItemClickListener {
        @Override
        public void onItemClick(AdapterView parent, View view, int position,
                                long id) {
            // display view for selected nav drawer item
            displayView(position);
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.my, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // toggle nav drawer on selecting action bar app icon/title
        if (mDrawerToggle.onOptionsItemSelected(item)) {
            return true;
        }
        // Handle action bar actions click
        switch (item.getItemId()) {
            case R.id.action_settings:
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }

    /* *
     * Called when invalidateOptionsMenu() is triggered
     */
    @Override
    public boolean onPrepareOptionsMenu(Menu menu) {
        // if nav drawer is opened, hide the action items
        boolean drawerOpen = mDrawerLayout.isDrawerOpen(mDrawerList);
        menu.findItem(R.id.action_settings).setVisible(!drawerOpen);
        return super.onPrepareOptionsMenu(menu);
    }

    /**
     * Diplaying fragment view for selected nav drawer list item
     * */
    private void displayView(int position) {
        // update the main content by replacing fragments
        Fragment fragment = null;
        switch (position) {
            case 0:
                fragment = new Seccion();
                break;
            case 1:
                fragment = new Seccion();
                break;
            case 2:
                fragment = new Seccion();
                break;
            case 3:
                fragment = new Seccion();
                break;

            default:
                break;
        }

        if (fragment != null) {
            FragmentManager fragmentManager = getFragmentManager();
            fragmentManager.beginTransaction()
                    .replace(R.id.frame_container, fragment).commit();

            // update selected item and title, then close the drawer
            mDrawerList.setItemChecked(position, true);
            mDrawerList.setSelection(position);
            setTitle(navMenuTitles[position]);
            mDrawerLayout.closeDrawer(mDrawerList);
        } else {
            // error in creating fragment
            Log.e("Ramiro", "MainActivity - Error cuando se creo el fragment");
        }
    }

    @Override
    public void setTitle(CharSequence title) {
        mTitle = title;
        getActionBar().setTitle(mTitle);
    }

    /**
     * When using the ActionBarDrawerToggle, you must call it during
     * onPostCreate() and onConfigurationChanged()...
     */

    @Override
    protected void onPostCreate(Bundle savedInstanceState) {
        super.onPostCreate(savedInstanceState);
        // Sync the toggle state after onRestoreInstanceState has occurred.
        mDrawerToggle.syncState();
    }

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        // Pass any configuration change to the drawer toggls
        mDrawerToggle.onConfigurationChanged(newConfig);
    }

}

NavDrawerItem.java
public class NavDrawerItem {
 
 private String title;
 private int icon;
 private String count = "0";
 // boolean to set visiblity of the counter
 private boolean isCounterVisible = false;
 
 public NavDrawerItem(){}

 public NavDrawerItem(String title, int icon){
  this.title = title;
  this.icon = icon;
 }
 
 public NavDrawerItem(String title, int icon, boolean isCounterVisible, String count){
  this.title = title;
  this.icon = icon;
  this.isCounterVisible = isCounterVisible;
  this.count = count;
 }
 
 public String getTitle(){
  return this.title;
 }
 
 public int getIcon(){
  return this.icon;
 }
 
 public String getCount(){
  return this.count;
 }
 
 public boolean getCounterVisibility(){
  return this.isCounterVisible;
 }
 
 public void setTitle(String title){
  this.title = title;
 }
 
 public void setIcon(int icon){
  this.icon = icon;
 }
 
 public void setCount(String count){
  this.count = count;
 }
 
 public void setCounterVisibility(boolean isCounterVisible){
  this.isCounterVisible = isCounterVisible;
 }
}

NavDrawerListAdapter.java
import java.util.ArrayList;

import android.app.Activity;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;


public class NavDrawerListAdapter extends BaseAdapter {
 
 private Context context;
 private ArrayList<NavDrawerItem> navDrawerItems;  //CORREJIDO, gracias a ANONIMO
 
 public NavDrawerListAdapter(Context context, ArrayList navDrawerItems){
  this.context = context;
  this.navDrawerItems = navDrawerItems;
 }

 @Override
 public int getCount() {
  return navDrawerItems.size();
 }

 @Override
 public Object getItem(int position) {  
  return navDrawerItems.get(position);
 }

 @Override
 public long getItemId(int position) {
  return position;
 }

 @Override
 public View getView(int position, View convertView, ViewGroup parent) {
  if (convertView == null) {
            LayoutInflater mInflater = (LayoutInflater)
                    context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
            convertView = mInflater.inflate(R.layout.drawer_list_item, null);
        }
         
        ImageView imgIcon = (ImageView) convertView.findViewById(R.id.icon);
        TextView txtTitle = (TextView) convertView.findViewById(R.id.title);
        TextView txtCount = (TextView) convertView.findViewById(R.id.counter);
         
        imgIcon.setImageResource(navDrawerItems.get(position).getIcon());        
        txtTitle.setText(navDrawerItems.get(position).getTitle());
        
        // displaying count
        // check whether it set visible or not
        if(navDrawerItems.get(position).getCounterVisibility()){
         txtCount.setText(navDrawerItems.get(position).getCount());
        }else{
         // hide the counter view
         txtCount.setVisibility(View.GONE);
        }
        
        return convertView;
 }
}

Seccion.java
import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

/**
 * Created by user on 26/08/2014.
 */
public class Seccion1 extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        View rootView = inflater.inflate(R.layout.seccion1, container, false);

        return rootView;
    }
}



layout (carpeta)
activity_my.xml
<android.support.v4.widget.DrawerLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <!-- Framelayout to display Fragments -->
    <FrameLayout
        android:id="@+id/frame_container"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <!-- Listview to display slider menu -->
    <ListView
        android:id="@+id/list_slidermenu"
        android:layout_width="240dp"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:choiceMode="singleChoice"
        android:divider="@color/list_divider"
        android:dividerHeight="1dp"
        android:listSelector="@drawable/list_selector"
        android:background="@color/list_background"/>
</android.support.v4.widget.DrawerLayout>

drawer_list_item.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="48dp" 
    android:background="@drawable/list_selector">

    <ImageView
        android:id="@+id/icon"
        android:layout_width="25dp"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_marginLeft="12dp"
        android:layout_marginRight="12dp"
        android:contentDescription="@string/desc_list_item_icon"
        android:src="@drawable/ic_home"
        android:layout_centerVertical="true" />

    <TextView
        android:id="@+id/title"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_toRightOf="@id/icon"
        android:minHeight="?android:attr/listPreferredItemHeightSmall"
        android:textAppearance="?android:attr/textAppearanceListItemSmall"
        android:textColor="@color/list_item_title"
        android:gravity="center_vertical"
        android:paddingRight="40dp"
        android:paddingLeft="0dp"/>
    
    <TextView android:id="@+id/counter"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@drawable/counter_bg"
        android:layout_alignParentRight="true"
        android:layout_centerVertical="true"
        android:layout_marginRight="8dp"
        android:textColor="@color/counter_text_color"/>

</RelativeLayout>

seccion.xml
<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">

</LinearLayout>



drawable (carpeta)
counter_bg.xml
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle" >

    <!-- vista del color del background -->
    <solid android:color="@color/counter_text_bg" >
    </solid>

    <!-- Si queres agregar algun espacio -->
    <padding
        android:right="3dp"
        android:left="3dp" >
    </padding>

    <!-- Corner raduis -->
    <corners android:radius="2dp" >
    </corners>

</shape>

list_item_bg_normal.xml
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
  <gradient
      android:startColor="@color/list_background"
      android:endColor="@color/list_background"
      android:angle="90" />
</shape>

list_item_bg_pressed.xml
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
  <gradient
      android:startColor="@color/list_background_pressed"
      android:endColor="@color/list_background_pressed"
      android:angle="90" />
</shape>

list_selector.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:drawable="@drawable/list_item_bg_normal" android:state_activated="false"/>
    <item android:drawable="@drawable/list_item_bg_pressed" android:state_pressed="true"/>
    <item android:drawable="@drawable/list_item_bg_pressed" android:state_activated="true"/>

</selector>


values (carpeta)
strings.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>

    <string name="app_name">Ejemplo Menu</string>
    <string name="action_settings">Configuración</string>
    <string name="hello_world">Hello world!</string>
    <string name="drawer_open">Se abrio el menu lateral</string>
    <string name="drawer_close">Se cerro el menu lateral</string>

    <!-- Nombres de los items -->
    <string-array name="nav_drawer_items">
        <item >Seccion1</item>
        <item >Seccion2</item>
        <item >Seccion3</item>
        <item >Seccion4</item>
    </string-array>

    <!-- Iconos de los items -->
    <array name="nav_drawer_icons">
        <item>@drawable/ic_whats_hot</item>
        <item>@drawable/ic_people</item>
        <item>@drawable/ic_photos</item>
        <item>@drawable/ic_communities</item>
    </array>

    <!-- Content Description -->
    <string name="desc_list_item_icon">Item Icon</string>

</resources>

colors.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="list_item_title">#fff</color>
    <color name="list_background">#303030</color>
    <color name="list_background_pressed">#992416</color>
    <color name="list_divider">#272727</color>
    <color name="counter_text_bg">#626262</color>
    <color name="counter_text_color">#c5c4c4</color>
</resources>


Recursos


82 comentarios:

  1. Muchisimas gracias amigo, me ha servido de mucho. :DD recomendado por lo menos intentarlo!

    ResponderEliminar
    Respuestas
    1. hola e querido abrir tu proyecto pero solo aparece cargando y nunca lo abre, sera por que no lleva el apk o dime hay alguna solucion

      Eliminar
  2. Cuando creo un menú principal desplegable con fragments desde el MainActivity todo bien, selecciono una opción me lleva a una segunda clase esta sería un listView o botones con varias opciones y al seleccionar una la idea es que me lleve a una tercera clase.
    Pero el problema es cuando intento colocar en la 2da clase para que llame a la 3ra, hay problemas usando los métodos necesarios. En cambio si uso este desde el Main ahí si me funciona bien. No se si sea una restricción o la 2da debe tener un extends o implement .

    ResponderEliminar
    Respuestas
    1. Si entiendo
      Tenes el principal con un contendedor, que se contendedor se reemplaza por un fragment que sería la segunda llamada.
      Si queres llamar a una tercera una forma sería llamar un Activity
      del boton que tengas de la segunda llamada hace un simple
      Intent i = new Intent(getActivity, Tercerallamada.class);
      startactivity(i);

      Eliminar
  3. Rodrigo Gonzalez7 de enero de 2015, 0:43

    Hola! muy buen video! Tengo Rendering problems con el activity_my.xlm me aparece esto (uso la sdk API19, para la visualizacion de los layout): "The following classes could not be instantiated:
    - android.support.v4.widget.DrawerLayout (Open Class, Show Exception)
    Tip: Use View.isInEditMode() in your custom views to skip code or show sample data when shown in the IDE".

    Además, me gustaria tener un fragmento que haga de "home page" a todos los fragmentos del list view, osea que al abrirse la app aparezca este fragmento, y si me encuentro en cualquier otro al apretar el boton atrás del telefono me envie a este "home page", se puede hacer sin que este fragmento aparezca en el list view?
    Saludos!

    ResponderEliminar
    Respuestas
    1. El botón atrás no funciona en menu deslizante, solo funciona con los activity, cuando vas para adelante.. digamos activitya -> activity b -> activity c .. del c, podes volver al b
      en el caso del menu, no podes volver atrás porque se reemplaza y se pierde, a no se que lo guardes

      Eliminar
  4. Ramiro como podría hacer para que la aplicación no empiece en el MyActivity sino en otra clase, debo modificar el manifest?

    ResponderEliminar
  5. podrias acer uno sobre web view o dar una esplication basica de como implementarlo en una seccion

    ResponderEliminar
    Respuestas
    1. http://cursoandroidstudio.blogspot.com.ar/2014/09/webview.html

      Eliminar
  6. Hola, gracias por subir los vídeos son muy interesantes y me están ayudando mucho. Tengo una pregunta / consulta. Para hacer un navigation drawer con el estilo similar al de Google play me refiero a la parte de la foto de arriba y donde pone el email, en que parte tengo que hacerlo y que tengo que poner en el código.Otra pregunta puedo añadir una activity dentro de una seccion. por ejemplo ajustes y que vaya a la activity settings o google maps.

    Saludos y muchas gracias !

    ResponderEliminar
  7. Hola, muchas gracias por los videos, hasta ahora he ido avanzando.
    Pero me he bajado este proyecto de github, pero cuando lo instalo, me pone "Project SDK is no defined".
    Supongo que lo instalo mal, como lo importo.
    yo lo hago con "Open an existing Android studio project"
    Muchas Gracias por tu ayuda.

    ResponderEliminar
    Respuestas
    1. Error mio, solucionado. pero ahora me da el siguiente error.
      En MyActivity.java :
      mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,
      R.drawable.ic_drawer, //nav menu toggle icon
      R.string.app_name, // nav drawer open - description for accessibility
      R.string.app_name // nav drawer close - description for accessibility
      ) {
      ¿por que puede ser?
      Gracias

      Eliminar
    2. Como solucionaste el problema anterior?

      Eliminar
  8. Amigo una pregunta el metodo get donde esta creado? porque me sale error que ese metodo no existe. Me podrias explicar un pocov PORFAVOR :)

    ResponderEliminar
    Respuestas
    1. No hay ningún método GET, no te estarás confundiendo con HTML?

      Eliminar
    2. Amigo hablo de la parte del NavDrawerList Adapter en el metodo GetView():
      imgIcon.setImageResource(navDrawerItems.get(position).getIcon());
      txtTitle.setText(navDrawerItems.get(position).getTitle());

      Es en esta parte donde no reconoce los metodos de la clase NavDrawerItem. Me puedes explicar esq no se mucho :(

      Eliminar
    3. Amigo hablo de la parte del NavDrawerList Adapter en el metodo GetView():
      imgIcon.setImageResource(navDrawerItems.get(position).getIcon());
      txtTitle.setText(navDrawerItems.get(position).getTitle());

      Es en esta parte donde no reconoce los metodos de la clase NavDrawerItem. Me puedes explicar esq no se mucho :(

      Eliminar
    4. Este comentario ha sido eliminado por el autor.

      Eliminar
    5. Este comentario ha sido eliminado por el autor.

      Eliminar
    6. El Arraylist que declaras en el NavDrawerListAdapter debe ser un arraylist de objetos navdraweritem, de esta manera podras acceder a los metodos propios de arraylist y los de la clase navdraweritem. Saludos.

      Eliminar
    7. Corrige esta línea:

      private ArrayList navDrawerItems;

      esa línea es la que debería aparecer en el NavDrawerListAdapter.java

      Eliminar
    8. Perdón, esa línea a corregir, debería ser así:

      private ArrayList navDrawerItems;

      Eliminar
    9. Siento volver a escribir, pero por alguna razón lo autocorrige el blogspot y lo pone mal, a ver con espacios:

      private ArrayList < NavDrawerItem > navDrawerItems;

      Eliminar
    10. Gracias Anónimo, ahí lo corregí, lamentablemente a veces cuando lo copio, me saca el < >.

      Eliminar
  9. hola soy nuevo en android, me he encontrado con un problema al seguir los pasos en el archivo NavDrawerListAdapter.java , me marca error en este :
    import com.matiasdupuydelome.matiasapp.R;
    ¿de donde sale ?

    en MyActivity.java de igual forma:
    import menudesilzante.NavDrawerItem;
    import menudesilzante.NavDrawerListAdapter;

    estos import de donde los importo
    mi app se llama :
    package ejemplo1.com.mx.menujc;

    me podras ayudar

    ResponderEliminar
  10. hola soy nuevo en android, me he encontrado con un problema al seguir los pasos en el archivo NavDrawerListAdapter.java , me marca error en este :
    import com.matiasdupuydelome.matiasapp.R;
    ¿de donde sale ?

    en MyActivity.java de igual forma:
    import menudesilzante.NavDrawerItem;
    import menudesilzante.NavDrawerListAdapter;

    estos import de donde los importo
    mi app se llama :
    package ejemplo1.com.mx.menujc;

    me podras ayudar

    ResponderEliminar
    Respuestas
    1. cambia el "com.matiasdupuydelome.matiasapp" por el nombre de tu paquete
      capaz has creado un proyecto nuevo y has copiado con eso también..

      Eliminar
    2. lo cambie por import ejemplo1.com.mx.menujc.R;
      pero la R me la marca en rojo, sigue marcando error la "R"

      Eliminar
    3. Hace "Clean Project" - "Rebuild project" y después cerra y abrí el proyecto

      Eliminar
    4. Me marca error :
      getActionBar().setDisplayHomeAsUpEnabled(true);

      Consola:
      Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.app.ActionBar.setDisplayHomeAsUpEnabled(boolean)' on a null object reference
      at menulateralslide.elpoeta.com.menulateralslide.MyActivity.onCreate(MyActivity.java:80)

      Eliminar
    5. lo han solucionado?

      Eliminar
  11. Hola, gracias por subir los vídeos son muy interesantes y me están ayudando mucho. Tengo una pregunta / consulta. Para hacer un navigation drawer con el estilo similar al de Google play me refiero a la parte de la foto de arriba y donde pone el email, en que parte tengo que hacerlo y que tengo que poner en el código.Otra pregunta puedo añadir una activity dentro de una seccion. por ejemplo ajustes y que vaya a la activity settings o google maps.

    ResponderEliminar
    Respuestas
    1. El stilo esta en los list_item_bg_normal.xml y list_item_pressed.xml .. cambio los colores y cambia todo el diseño

      Eliminar
  12. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  13. en mi app hago un splash y luego trato de mostrar el codigo este y no me sale nada, solo en el emulador me pone que la aplicacion se detuvo. Pudieras explicarme como logro eso

    ResponderEliminar
  14. Tengo el mismo problema que el comperño Joyner, alguna sugerencia?
    Gracias!
    Buen ejemplo, lo estoy implementando para version 4.4 para arriba
    Soy nuevo en esto.

    ResponderEliminar
  15. hola amigo.gracias por tu video,la pregunta es como puedo modificar el codigo para generar un arreglo que me permita ver un submenu dentro de cualquier item . gracias de antemano

    ResponderEliminar
  16. Hola Ramiro, acabo de ver tu video del Navigation Drawer https://www.youtube.com/watch?v=IuFHUB1iI14, ya implementé satisfactoriamente eso con la plantilla de Android Studio y tu tutorial y ahora quiero aplicar un cambio de estilo, sin embargo los archivos NewDrawerItem.java y NewDrawerListAdapter.java no son generados y en vez de esos te da el NavigationDrawerFragment.java que tiene el siguiente método para los elementos del menú lateral:

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
    Bundle savedInstanceState) {
    mDrawerListView = (ListView) inflater.inflate(
    R.layout.fragment_navigation_drawer, container, false);
    mDrawerListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView parent, View view, int position, long id) {
    selectItem(position);
    }
    });
    mDrawerListView.setAdapter(new ArrayAdapter(
    getActionBar().getThemedContext(),
    android.R.layout.simple_list_item_activated_1,
    android.R.id.text1,
    new String[]{
    getString(R.string.title_section1),
    getString(R.string.title_section2),
    getString(R.string.title_section3),
    getString(R.string.title_section4),
    }));
    mDrawerListView.setItemChecked(mCurrentSelectedPosition, true);
    return mDrawerListView;
    }


    ¿Cómo podría agregar iconos y modificar los estilos de los elementos del menú lateral?

    Saludos, excelente trabajo!


    ResponderEliminar
    Respuestas
    1. en esas estoy yo también, tengo el mismo problema, si lo logras solucionar me comentas, y lo contrario.

      Eliminar
    2. En este link se detallan los cambios a realizar para que tome, tanto los títulos como los iconos, de un array.

      http://stackoverflow.com/questions/28119149/how-do-i-add-icons-to-android-studios-navigation-drawer-template

      Un cordial saludo y gracias por compartir :)

      Eliminar
  17. hola buenas tardes me da el siguiente error en el momento de modificarlo
    getActionBar().setDisplayHomeAsUpEnabled(true);
    marca nullpointerexception alguna sugerencia ?

    ResponderEliminar
    Respuestas
    1. Prueba a cambiar en la clase MyActivity el extends por un ActionBarActivity y luego usa en su lugar un getSupportActionBar()...
      Te recomiendo ademas usar un Lollipop Drawer, a mi modo de ver es más vistosa la animación del icono del menú.

      Eliminar
  18. Hola buenas tardes, mi pregunta es como implementar una Viewpager a una de las opciones del NavDawer. Gracias y me encantan tus videos,

    ResponderEliminar
  19. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  20. Ramiro, me gustaría hacer, que el listView estuviera clasificado por grupos, cada uno llevaría un nombre relacionado a su categoría y a continuación las opciones para seleccionar, no me refiero a un expandableListView, sólo a que cada grupo de secciones tuviera su propio encabezado o textView, que no sería seleccionable. Ej: Clase A: Pepito, Antoñito y Sarita. Clase B: Alonso, María y Rebeca.
    Ésta forma de organizar el listView la he visto bastante por ahí, incluso subrayando los encabezados, sabrías aclararme un poco la forma de poder hacerlo.
    Gracias, un saludo.

    ResponderEliminar
    Respuestas
    1. Ok, solucionado, para quien le interese, es fácil, con una cabecera o a pie de página (addHeaderView-addFooterView).

      Eliminar
    2. Este comentario ha sido eliminado por el autor.

      Eliminar
    3. Ok Ramiro, ahorita te mando algo con lo que estoy, aunque todavía queda mucho por pulir, un saludo.

      Eliminar
  21. Amigos perdonen la molestia, pero me tira estos dos errores y soy nuevo en esto de android, alguien podria orientarme?

    https://imageshack.com/i/pafnotSdp

    ResponderEliminar
    Respuestas
    1. Comprueba en tu archivo build.gradle, en tu proyecto, y añade este codigo, si es que no esta:

      buildTypes {
      release {
      minifyEnabled false
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
      }

      Eliminar
  22. Hola, quería preguntar ¿cómo exportaste el ActionBarDrawerToggle y DrawerLayout? estoy en android studio con la API 21, y no logró entender esa parte.

    Saludos lecs.

    ResponderEliminar
  23. hola, ami me sale este error en android studio 1.2 con windows 7 ultimate :

    Rendering Problems The following classes could not be instantiated:
    - android.support.v7.internal.widget.ActionBarOverlayLayout (Open Class, Show Exception, Clear Cache)
    Tip: Use View.isInEditMode() in your custom views to skip code or show sample data when shown in the IDE Exception Details java.lang.ClassNotFoundException: android.support.v4.view.ViewPropertyAnimatorListener Copy stack to clipboard

    como solucionarlo ?

    ResponderEliminar
  24. Hola, gracias por la valiosa informacion. Descargue el proyecto pero al correrlo en android studio 1.1.0 me da el siguiente error : Error Cause: invalid END header (bad central directory offset). He buscado pero no he encontrado algo concreto para solucionarlo. Gracias.

    ResponderEliminar
  25. Hola Ramiro, felicitaciones por el blog, me ha sido de gran ayuda. Quisiera saber ¿Como hacer un ListView simple (como el del ejemplo) en un Fragment?

    ResponderEliminar
  26. pregunta si tengo un android studio 1.2 con api 4.1 como puedo ejecutar esta aplicacion, no me deja, me marca es un glade no es la version del method requeria o algo asi y algo que ver con glade plugin, sabes como solucionarlo, pero soy algo nuevo con android, mi correo es: homerrobo@gmail.com

    ResponderEliminar
  27. como paso de la opcion lateral a un activiy si necesidad de entrar a un fragment ?

    ResponderEliminar
  28. Muy buen tutorial, te felicito. Solamente tengo una pequeña duda, como haces para que el menú aparezca automáticamente cuando se abre la aplicación. Gracias por la ayuda que puedas brindarme.

    ResponderEliminar
  29. Hola Ramiro excelentes tutoriales todos de verdad gracias, oye te quería hacer una pequeña pregunta como coloco el Icono en este menu drawable ya que lo implemente en mi app pero las formas en las que salen en Internet para colocar el icono no me funcionan aca, Gracias y disculpa las molestias.

    ResponderEliminar
  30. Hola ya realice el tutorial y todo ok pero tengo una duda al ejecutar la aplicacion me sigue apareciendo el menu con un submenu que dice "Configuracion" arriba a la derecha..

    lo he tratado de ocultar, eliminar y hasta ponerle setvisible(false) pero si hago esto la aplicación se cierra, me supongo que depende de ese menú la aplicación..

    Alguna forma de quitarlo sin afectar la aplicación?

    ResponderEliminar
  31. Hola, me funcionó bien, pero me gustaría saber como puedo llamar desde la seccion 2 (Fragment) a una clase ActionBarActivity (Tabs)
    Gracias!

    ResponderEliminar
  32. Hola Ramiro!

    Estoy creando una aplicacion desde hace ya un par de meses y muchos de tus tutoriales me han sido muy utiles!

    Comentarte simplemente que en mi caso, hay una linea que falta añadir para que el icono de ic_drawer se muestre, que es el siguiente:

    getSupportActionBar().setHomeAsUpIndicator(R.drawable.ic_drawer);

    justo despues de:
    getSupportActionBar().setDisplayHomeAsUpEnabled(true); getSupportActionBar().setHomeButtonEnabled(true);

    De todas maneras gracias!!

    ResponderEliminar
  33. hola he seguido paso a paso el tutorial, solo tengo un error
    mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
    tengo error en el drawer_layout me dice cannot resolve symbol, espero que me puedan ayudar
    soy nuevo en android
    saludos

    ResponderEliminar
  34. HOLA AMMIGO BUEN TUTORIAL FELICIDADES OYES TENGO UN DUDA COMO CREO UN 4 SECCION HAS DE CUENTA QUE YA LAS HICE Y SALEN EN EL MENU PERO NO ME CAMBIA A ESA PANTALLA SI NO A LA DEL MAIN despues de la terecera seccion ya no me corre.... help me plis porfas ayudamennn

    ResponderEliminar
  35. Hola Ramiro que tal??
    Te escribo porque tengo un problema nivel Dios, aunque creo que no debe ser compliacado. El asunto es que tengo este codigo (Main activity-onOpstionItem....):
    if(item.getItemId()==R.id.login){
    FragmentManager fragmentManager1 = getFragmentManager();
    Fragment fragment1 =new Login();
    fragmentManager1.beginTransaction()
    .replace(R.id.container, fragment1)
    .commit();
    Y este otro en la clase Login():

    public class Login extends Fragment{
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
    Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.login, container, false);
    return rootView;
    }
    }
    Ocurre que cuando quiero usar un componente del xml login no puedo.
    Si me podrias ayudar te lo agradeceria con el alma.
    NO SE SI ESTO AYUDA PERO ES PARA UN PROYECTO DE LA UNI PARA LA SEMANA QUE MARTES PROXIMO Y ESTOY QUEDAO' AHI. GRACIAS :)

    ResponderEliminar
  36. Disculpa este código funciona sobre Google maps v2?

    ResponderEliminar
  37. Hola Ramíro tengo un problema y no encuentro cual es... Me sale este error:
    at com.brayan.menu2.menu2.MainActivity.onCreate(MainActivity.java:78)

    y al dar en el error es en esta parte del codigo:

    getActionBar().setDisplayHomeAsUpEnabled(true);
    getActionBar().setHomeButtonEnabled(true);

    No me lo marca como un error como tal más bien un warning

    Method invocation ' getActionBar().setDisplayHomeAsUpEnabled(true)'may produce 'java.lang.NullException'

    ResponderEliminar
  38. hola amigo ramiro tengo una pregunta se puede agregar un activyty al menu drawer ya encontre uno proyecto que lo tiene pero no se como le hizo si quieres te lo mando y lo checas ???? ok gracias espero tu respesta ademas ese contiene el nuevo material desing

    ResponderEliminar
  39. HOLA TENGO UN PROBLEMA CON EL MENU CASE ME SALE UN ERROR EN ESTA PARTE : switch (position) espero me ayude :)

    ResponderEliminar
  40. Hombre buenas noches! Muy bueno el tutorial pero tengo un problema cuando corro me salen estos 4 errores>

    Error:(128, 36) error: cannot find symbol variable menu
    Error:(140, 22) error: cannot find symbol variable action_settings
    Error:(154, 27) error: cannot find symbol variable action_settings
    Note: Some input files use or override a deprecated API.
    Note: Recompile with -Xlint:deprecation for details.
    Note: Some input files use unchecked or unsafe operations.
    Note: Recompile with -Xlint:unchecked for details.
    Error:Execution failed for task ':app:compileDebugJavaWithJavac'.
    > Compilation failed; see the compiler error output for details.

    No se su e puedas ayudar con esto!!
    Gracias

    ResponderEliminar
  41. Error:(128, 36) error: cannot find symbol variable menu
    Error:(140, 22) error: cannot find symbol variable action_settings
    Error:(154, 27) error: cannot find symbol variable action_settings
    hola ramiro tengo este mismo error gracias por responder

    ResponderEliminar
    Respuestas
    1. disculpe, a mi me sale el mismo error logro solucionarlo si si me podría decir como.
      gracias

      Eliminar
  42. Me dio mucha risa cuando sale tu vieja en el video y la hechas :P

    ResponderEliminar
  43. una consulta, como haces para que te aparezca cuatro opciones o botones, porque comúnmente te aparecen 3

    ResponderEliminar
  44. Pero no eres él mismo que sale en los vídeos

    ResponderEliminar
  45. me podrías ayudar a quitar el error que me sale en DrawerLayout y ActionBarDrawerToggle del MyActivity

    ResponderEliminar
  46. Una Consulta, al menú lateral como muestras puedes agregarlo una forma de acordeones y dentro de ellas agruparlo los submenus.

    ResponderEliminar