Intereting Posts
Что такое OBB (Opaque Binary Blob) на Android-сайте? Разрешение Описание Тип пути Как вычисляется значение плотности в android 16 секунд до тех пор, пока не будет обнаружен запрос Bluetooth-разъединения Вызвано: android.os.NetworkOnMainThreadException Можно ли выбрать TextView и содержать ссылки? Реализация чата между веб-страницей и андроидом Как я могу автоматически очищать вывод logcat перед каждым запуском в Android Studio? Регистр PushPlugin отправляется в обработчик ошибок, показывающий «Класс не найден» с кордорой 4.0.0 для платформы Android Разработка Android на базе Android Служба Android и повторяющаяся задача, выполняемая в потоках Запуск фрагмента по имени переменной Установить фокус в незаполненном edittext, как можно реализовать приложение для Android OnPause () как определить, вызвана ли новая активность приложения или если приложение полностью приостановлено? Предварительные рыночные публикации для Android (юридические) вопросы

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

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

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

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

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

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

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