¿Cómo abrir el submenú después de hacer clic en el elemento de menú en el cajón de navegación?

Implementé un cajón de navegación, con vista de navegación. Y estoy añadiendo valor en la vista de navegación a través de un archivo menu.xml.

<android.support.design.widget.NavigationView android:id="@+id/nvView" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_gravity="start" app:itemTextColor="@android:color/white" android:background="?attr/colorAccent" app:menu="@menu/drawer_view" app:headerLayout="@layout/nav_header" > </android.support.design.widget.NavigationView> 

Todo está funcionando bien, pero estoy frente a un problema, quiero mostrar submenús, después de hacer clic en el menú.

He intentado muchas cosas como: –

Añado el submenú en menu.xml, dentro del artículo. Algo así

 <menu xmlns:android="http://schemas.android.com/apk/res/android"> <group android:checkableBehavior="single"> <item android:id="@+id/nav_ChangeOutlet_fragment" android:icon="@drawable/home_icon" android:title="@string/changeOutlet" android:checked="true"> <menu> <group> <item android:title="one"></item> <item android:title="two"></item> <item android:title="three"></item> </group> </menu> 

Entonces me devuelve la salida como esto.

Salida: haga clic en este enlace para ver la salida

Https://drive.google.com/file/d/0B0B9-WZYydK7RG1yY0tRdkhOSW8/view?usp=sharing

Ahora el problema es que, de esta manera no soy capaz de hacer clic en el menú, sólo el submenú se puede hacer clic aquí.

Quiero aquí para mostrar el submenú, sólo después de hacer clic en el menú, de lo contrario sub menú se muestra a otro o decir que está en estado invisible

Puede crearlo utilizando una lista expandible.

Mira esto aquí

La mejor solución es tener una vista de lista expandible en la vista de navegación.Ver el código siguiente activity_navigation_view.xml

  <android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/drawer_layout" android:layout_height="match_parent" android:layout_width="match_parent" android:fitsSystemWindows="true"> <include layout="@layout/navigation_view_fragment_container"/> <android.support.design.widget.NavigationView android:id="@+id/nav_view" android:layout_height="match_parent" android:layout_width="wrap_content" android:layout_gravity="start" android:fitsSystemWindows="true" app:headerLayout="@layout/navigation_view_header"> <ExpandableListView android:layout_width="wrap_content" android:layout_height="match_parent" android:background="@android:color/white" android:layout_marginTop="192dp" android:id="@+id/navigationmenu"> </ExpandableListView> </android.support.design.widget.NavigationView> </android.support.v4.widget.DrawerLayout> 

El encabezado de navegación de diseño es el siguiente: navigation_view_header.xml

  <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="192dp" android:background="#ff5722" android:padding="16dp" android:theme="@style/ThemeOverlay.AppCompat.Dark" android:orientation="vertical" android:gravity="bottom"> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Username" android:textAppearance="@style/TextAppearance.AppCompat.Body1"/> </LinearLayout> 

En la actividad de la vista de navegación, establezca el adaptador para la vista de lista expandible. NavigationViewActivity.java

  public class NavigationViewActivity extends AppCompatActivity { private DrawerLayout mDrawerLayout; ExpandableListAdapter mMenuAdapter; ExpandableListView expandableList; List<ExpandedMenuModel> listDataHeader; HashMap<ExpandedMenuModel, List<String>> listDataChild; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_navigation_view); final ActionBar ab = getSupportActionBar(); /* to set the menu icon image*/ ab.setHomeAsUpIndicator(R.drawable.ic_menu); ab.setDisplayHomeAsUpEnabled(true); mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); expandableList= (ExpandableListView) findViewById(R.id.navigationmenu); NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view); if (navigationView != null) { setupDrawerContent(navigationView); } prepareListData(); mMenuAdapter = new ExpandableListAdapter(this, listDataHeader, listDataChild, expandableList); // setting list adapter expandableList.setAdapter(mMenuAdapter); } private void prepareListData() { listDataHeader = new ArrayList<String>(); listDataChild = new HashMap<String, List<String>>(); // Adding data header listDataHeader.add("heading1"); listDataHeader.add("heading2"); listDataHeader.add("heading3"); // Adding child data List<String> heading1= new ArrayList<String>(); heading1.add("Submenu of item 1"); List<String> heading2= new ArrayList<String>(); heading2.add("Submenu of item 2"); heading2.add("Submenu of item 2"); heading2.add("Submenu of item 2"); listDataChild.put(listDataHeader.get(0), heading1);// Header, Child data listDataChild.put(listDataHeader.get(1), heading2); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.menu, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: mDrawerLayout.openDrawer(GravityCompat.START); return true; } return super.onOptionsItemSelected(item); } private void setupDrawerContent(NavigationView navigationView) { navigationView.setNavigationItemSelectedListener( new NavigationView.OnNavigationItemSelectedListener() { @Override public boolean onNavigationItemSelected(MenuItem menuItem) { menuItem.setChecked(true); mDrawerLayout.closeDrawers(); return true; } }); } @Override public void onFragmentInteraction(Boolean isDataSaved) { } } 

El adaptador para la vista de lista expandible es el siguiente

  public class ExpandableListAdapter extends BaseExpandableListAdapter { private Context mContext; private List<String> mListDataHeader; // header titles // child data in format of header title, child title private HashMap<String, List<String>> mListDataChild; ExpandableListView expandList; public ExpandableListAdapter(Context context, List<String> listDataHeader,HashMap<String, List<String>> listChildData,ExpandableListView mView) { this.mContext = context; this.mListDataHeader = listDataHeader; this.mListDataChild = listChildData; this.expandList=mView; } @Override public int getGroupCount() { int i= mListDataHeader.size(); Log.d("GROUPCOUNT",String.valueOf(i)); return this.mListDataHeader.size(); } @Override public int getChildrenCount(int groupPosition) { int childCount=0; if(groupPosition!=2) { childCount=this.mListDataChild.get(this.mListDataHeader.get(groupPosition)) .size(); } return childCount; } @Override public Object getGroup(int groupPosition) { return this.mListDataHeader.get(groupPosition); } @Override public Object getChild(int groupPosition, int childPosition) { Log.d("CHILD",mListDataChild.get(this.mListDataHeader.get(groupPosition)) .get(childPosition).toString()); return this.mListDataChild.get(this.mListDataHeader.get(groupPosition)) .get(childPosition); } @Override public long getGroupId(int groupPosition) { return groupPosition; } @Override public long getChildId(int groupPosition, int childPosition) { return childPosition; } @Override public boolean hasStableIds() { return false; } @Override public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) { ExpandedMenuModel headerTitle = (ExpandedMenuModel) getGroup(groupPosition); if (convertView == null) { LayoutInflater infalInflater = (LayoutInflater) this.mContext .getSystemService(Context.LAYOUT_INFLATER_SERVICE); convertView = infalInflater.inflate(R.layout.listheader, null); } TextView lblListHeader = (TextView) convertView .findViewById(R.id.submenu); ImageView headerIcon= (ImageView)convertView.findViewById(R.id.iconimage); lblListHeader.setTypeface(null, Typeface.BOLD); lblListHeader.setText(headerTitle.getIconName()); headerIcon.setImageDrawable(headerTitle.getIconImg()); return convertView; } @Override public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) { final String childText = (String) getChild(groupPosition, childPosition); if (convertView == null) { LayoutInflater infalInflater = (LayoutInflater) this.mContext .getSystemService(Context.LAYOUT_INFLATER_SERVICE); convertView = infalInflater.inflate(R.layout.list_submenu, null); } TextView txtListChild = (TextView) convertView .findViewById(R.id.submenu); txtListChild.setText(childText); return convertView; } @Override public boolean isChildSelectable(int groupPosition, int childPosition) { return true; } } 

List_submenu.xml es el siguiente

  <?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"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="10dp" android:textColor="#000000" android:layout_marginLeft="20dp" android:textSize="18sp" android:id="@+id/submenu"/> </LinearLayout> 

Listheader.xml es como sigue

  <?xml version="1.0" encoding="utf-8"?> <LinearLayout android:layout_width="match_parent" android:layout_height="2dp" android:orientation="vertical" xmlns:android="http://schemas.android.com/apk/res/android" > <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent"> <ImageView android:layout_width="50dp" android:layout_height="50dp" android:paddingBottom="10dp" android:paddingLeft="10dp" android:paddingTop="10dp" android:id="@+id/iconimage"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="10dp" android:textColor="#000000" android:textSize="20sp" android:id="@+id/submenu"/> </LinearLayout> </LinearLayout> 

He publicado código completo para mayor claridad. Espero que esto ayude…….

Yo prefiero que usted debe ir con el diseño personalizado en el cajón de navegación lateral.

Aquí está el enlace de muestra – cómo implementar el diseño personalizado en el cajón de navegación.

También es necesario implementar listview expandible en el cajón de navegación lateral para su escenario, aquí es una muestra de vista de lista ampliable.

Usted necesita combinar ambas cosas para lograr el cajón de la navegación con la lista extensible.

  • Cómo ocultar el indicador del cajón de navegación mientras utiliza appcompat21
  • Cómo configurar un observador para actualizar el cajón de navegación después de que el método onActivityResult recibió un resultado de intención
  • ¿Cómo crear un cajón de navegación personalizado que abre ListView junto al cajón onitemclick?
  • ¿Barra de herramientas Android para API 19? (Para la API 21 funciona bien)
  • ExpandableListView y el NavigationDrawer
  • Cajón de navegación - Desactivar clic en los elementos detrás del cajón
  • ¿Cómo utilizar el diseño de material de acción barra de navegación de cajón animación de conmutación?
  • ¿Cómo utilizo DrawerLayout para mostrar sobre la Barra de Acción / Barra de herramientas y debajo de la barra de estado?
  • Navegación Cajón de contenedores múltiples y mejores prácticas
  • Cajón de navegación de estilo de diseño de Android 5.0 para KitKat
  • Barra de herramientas y NavigationDrawer
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.