2015-07-16 12 views
10

Zaimplementowałem szufladę nawigacji z widokiem nawigacji. i dodaję wartość w widoku nawigacji poprzez plik menu.xml.Jak otworzyć podmenu po kliknięciu pozycji menu w szufladzie nawigacji?

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

wszystko działa dobrze, ale mam do czynienia z problemem, chcę wyświetlić podmenu po kliknięciu w menu.

Próbowałem wiele rzeczy jest jak: -

dodać podmenu w menu.xml, element wewnątrz. somthing tak ..

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

następnie zwróci mi wyjście tak.

Wyjście: kliknij na ten link wypisywana

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

Teraz problemem jest to, że w ten sposób nie jestem w stanie kliknąć na menu, podmenu są jedynie kliknąć tutaj.

Chcę tu pokazać podmenu, dopiero po kliknięciu na menu, podmenu inaczej nie pokazano inny albo powiedzieć, że jest w stanie niewidzialnym

+0

można przesyłać obrazy gdzieś jak na Dropbox lub dysku Google, a następnie udostępnić łącze. – Bunny

+0

To jest niekompletny kod Patrz link: https://stackoverflow.com/questions/32419446/adding-expandablelistview-to-navigationview –

+0

Niezupełne rozwiązanie Patrz link: https://stackoverflow.com/questions/32419446/adding- expandablelistview-to-viewview –

Odpowiedz

7

Możesz go utworzyć, korzystając z Widoku rozwijanego.

spojrzenie na tejhere

1

Wolę należy udać się z niestandardowy układ w szufladzie strona nawigacji.

Oto przykładowy link - how to implement custom layout in navigation drawer.

Należy również wdrożyć rozszerzalnej ListView w bocznej nawigacji szuflady do scenariusza, here jest próbka rozszerzalnej widoku listy.

Musisz połączyć obie rzeczy w szufladzie nawigacji z rozwijaną listą.

+0

OK Próbuję tych ex, może to działa –

22

Najlepszym rozwiązaniem jest mieć rozwijaną listą widoku nawigacji view.See kod poniżej 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> 

Nagłówek nawigacja układ jest jak poniżej 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> 

W czynności widoku nawigacji ustaw adapter dla widoku listy rozwijanej. 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) { 

} 
} 

Adapter rozszerzalnej do widoku listy jest następujący

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 jest następujący

<?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 jest następujący

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

Wysłałem cały kod dla jasności. Mam nadzieję, że to pomoże .......

+1

dzięki, że napisałeś cały kod. Byłoby pomocne, gdybyś mógł opublikować również klasę ExpandedMenuModel: –

+0

dwa atrybuty? nazwa, identyfikator do rysowania ??? –

Powiązane problemy