¿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ú.
- Adaptar chrisbanes ActionBar-PullToRefresh a fragmentos (NavigationDrawer)
- Cajón de navegación de estilo de material, el color de la barra de estado se pone demasiado oscuro
- Dimensión de imagen de fondo para la cabecera del cajón de navegación
- ¿Cómo crear un divisor simple en el nuevo NavigationView?
- Esperando que el Cajón de Navegación se cierre antes de inicializar Fragmentos con el lazo vacío while
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
- Cómo abrir diferentes actividades al hacer clic en los elementos del cajón de navegación?
- ¿Cómo mostrar el cajón de navegación en todas las actividades?
- ¿Cómo agregar valor de notificación para el elemento en NavigationView para el cajón de diseño de material?
- Cómo abrir el cajón de navegación en el botón de clic en el fragmento principal?
- Cajón de navegación onNavigationDrawerItemSelected llamado antes de MainActivity onCreate?
- Android DrawerLayout.setDrawerLockMode () no funciona
- Cambiar los elementos del cajón de navegación dentro del fragmento
- Java.lang.NullPointerException: Intenta invocar el método virtual 'ActionBar.setNavigationMode (int)' en una referencia de objeto nulo
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.
- Retrofit 2 – cuerpo de respuesta nula
- Cómo mostrar la configuración de texto a voz en mi aplicación?