Как открыть подменю после нажатия на элемент меню в навигационном ящике?

Я реализовал навигационный ящик с навигационным видом. И я добавляю значение в виде навигации через файл 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> 

Каждая вещь работает нормально, но я столкнулся с проблемой, я хочу отобразить подменю, после нажатия на меню.

Я пробовал много всего:

Я добавляю подменю в menu.xml, внутри элемента. Что-то вроде этого ..

 <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> 

То он возвращает мне вывод вроде этого.

Выход: нажмите эту ссылку, чтобы увидеть результат

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

Теперь проблема в том, что таким образом я не могу щелкнуть по меню, здесь доступно только подменю.

Я хочу, чтобы здесь отображалось подменю, только после нажатия на меню, в противном случае подменю показывает другому или говорит, что оно находится в невидимом состоянии

Вы можете создать его с помощью ExpandableListview.

Взгляните на это здесь

Лучшее решение – иметь расширяемое представление списка в режиме навигации. Посмотрите на код ниже 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> 

Заголовок навигации по макету находится ниже: 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> 

В своей деятельности по навигации выберите адаптер для расширения списка. 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) { } } 2  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) { } } 

Адаптер для расширения списка выглядит следующим образом

  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 выглядит следующим образом

  <?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 выглядит следующим образом

  <?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> 

Для ясности я опубликовал весь код. Надеюсь это поможет…….

Я предпочитаю, чтобы вы пошли с пользовательским расположением в боковой боковой ящик.

Вот пример ссылки – как реализовать пользовательский макет в навигационном ящике.

Вам также нужно реализовать расширяемый список в боковой панели навигации для вашего сценария, вот пример расширяемого списка.

Вам необходимо объединить обе вещи в достижимый навигационный ящик с расширяемым списком.