2015-07-16 18 views
10

Ho implementato un cassetto di navigazione, con vista di navigazione. e sto aggiungendo valore nella visualizzazione di navigazione attraverso un file menu.xml.Come aprire il sottomenu dopo aver cliccato sulla voce di menu nel cassetto di navigazione?

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

ogni cosa sta funzionando bene, ma sto affrontando un problema, voglio visualizzare il sottomenu di, dopo il click sul menu.

Ho provato molte di cosa come: -

aggiungo sottomenu menu.xml, voce dentro. somthing come questo ..

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

poi tornare mi output come questo.

uscita: cliccare su questo link per vedere l'uscita

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

Ora problema è che, in questo modo, io non sono in grado di fare clic sul menù, solo sottomenu sono cliccabili qui.

voglio qui per mostrare sottomenu, solo dopo che cliccare sul menù, altrimenti sottomenu non mostrato ad altri o dicono che è in stato invisibile

+0

È possibile caricare le immagini da qualche parte come su Dropbox o Google Drive e poi condividere collegamento. – Bunny

+0

È un codice incompleto Fare riferimento a Link: https://stackoverflow.com/questions/32419446/adding-expandablelistview-to-navigationview –

+0

Soluzione incompleta Fare riferimento a Link: https://stackoverflow.com/questions/32419446/adding- expandablelistview-to-navigationview –

risposta

7

È possibile creare utilizzando un ExpandableListview.

un'occhiata a questohere

1

preferisco si dovrebbe andare con layout personalizzato nel cassetto di navigazione laterale.

Ecco collegamento campione - how to implement custom layout in navigation drawer.

È inoltre necessario implementare ListView espandibile nel cassetto di navigazione laterale per lo scenario, here è campione di vista elenco espandibile.

È necessario combinare entrambe le funzioni in un cassetto di navigazione con elenco espandibile.

+0

Ok Sto provando questi ex, può funzionare –

22

La soluzione migliore è quella di avere una visione elenco espandibile nella navigazione view.See seguente codice 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'intestazione navigazione layout è come sotto 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> 

Nell'attività della visualizzazione di navigazione, impostare l'adattatore per la vista elenco espandibile. 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'adattatore per la visualizzazione elenco espandibile è il seguente

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 è il seguente

<?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 è il seguente

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

Ho pubblicato l'intero codice per chiarezza. Spero che questo aiuti .......

+1

grazie che hai pubblicato tutto il codice. Sarebbe utile se si potesse inserire anche la classe ExpandedMenuModel –

+0

due attributi giusti ?? nome, id disegnabile ??? –