J'ai implémenté un tiroir de navigation, avec vue de navigation. et j'ajoute de la valeur dans la vue de navigation via un fichier 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>
tout fonctionne bien, mais je suis confronté à un problème, je veux afficher les sous-menus, après avoir cliqué sur le menu.
J'ai essayé beaucoup de choses comme: -
J'ajoute un sous-menu dans menu.xml, à l'intérieur de l'élément. quelque chose comme ça ..
<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>
puis il me renvoie une sortie comme celle-ci.
Sortie: cliquez sur ce lien pour voir la sortie
https://drive.google.com/file/d/0B0B9-WZYydK7RG1yY0tRdkhOSW8/view?usp=sharing
Maintenant, le problème est que, de cette façon, je ne peux pas cliquer sur le menu, seuls les sous-menus sont cliquables ici.
Je veux ici afficher le sous-menu, seulement après avoir cliqué sur le menu, sinon le sous-menu s'affiche pour les autres ou dit qu'il est dans un état invisible
La meilleure solution consiste à avoir une vue de liste extensible dans la vue de navigation.Voir le code ci-dessous 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>
L'en-tête de navigation de mise en page est comme ci-dessous 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>
Dans votre activité d'affichage de navigation, définissez l'adaptateur pour l'affichage de liste extensible. 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) {
}
}
L'adaptateur pour l'affichage de liste extensible est le suivant
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 est le suivant
<?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 est le suivant
<?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>
J'ai publié tout le code pour plus de clarté. J'espère que cela t'aides.......
Je préfère que vous optiez pour une disposition personnalisée dans le tiroir de navigation latérale.
Voici un exemple de lien - comment implémenter une disposition personnalisée dans le tiroir de navigation.
Vous devez également implémenter la vue de liste extensible dans le tiroir de navigation latérale pour votre scénario, ici est un exemple de vue de liste extensible.
Vous devez combiner les deux éléments pour créer un tiroir de navigation avec une liste extensible.