web-dev-qa-db-fra.com

Comment ouvrir le sous-menu après avoir cliqué sur l'élément de menu dans le tiroir de navigation?

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

11

Vous pouvez le créer à l'aide d'une ExpandableListview.

regardez ceci here

8
Neha Tyagi

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

26
Shruthi Kamoji

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.

1
Kinnar Vasa