How to add checkbox to material navigation drawer?

前端 未结 4 930
醉梦人生
醉梦人生 2020-12-14 20:59

I use Menu items Icon Menu but I want to add checkbox to all menu item. This is my drawer_menu.xml



        
相关标签:
4条回答
  • 2020-12-14 21:45

    In response to @Alex's answer, you can use it like this :

    <item
        android:id="@+id/checkboxX-axis"
        android:title="Show x-axis"
        android:icon="@drawable/ic_x_axis_black_24dp"
        app:actionViewClass="android.widget.CheckBox"
        />
    

    and to access the checkBox programatically you can do this :

    MenuItem menuItem = navigationView.getMenu().findItem(R.id.checkboxX_axis);
    CompoundButton compundButton = (CompoundButton) menuItem.getActionView();
    compundButton.setChecked(true) // or set an eventListener to it.
    
    0 讨论(0)
  • 2020-12-14 21:48

    After long research i decide to use custom sliding drawer. I solved my problem maybe you can use my way.So i have checkbox now.

    First of all i defined drawer_list_item.xml

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="30dp"
    android:background="@color/list_item_title">
    
    <ImageView
        android:id="@+id/icon"
        android:layout_width="25dp"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_marginLeft="12dp"
        android:layout_marginRight="12dp"
        android:contentDescription="@string/desc_list_item_icon"
        android:src="@drawable/ic_home"
        android:layout_centerVertical="true" />
    
    <TextView
        android:id="@+id/title"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_toRightOf="@id/icon"
        android:minHeight="?android:attr/listPreferredItemHeightSmall"
        android:textAppearance="?android:attr/textAppearanceListItemSmall"
        android:textColor="@color/counter_text_bg"
        android:gravity="center_vertical"
        android:text="text"
        android:paddingRight="40dp"/>
    
    <CheckBox
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/checkBox"
        android:checked="false"
        android:layout_marginLeft="20dp"
        android:buttonTint="@color/md_indigo_500"
        android:layout_marginEnd="19dp"
        android:layout_alignBaseline="@+id/title"
        android:layout_alignBottom="@+id/title"
        android:layout_alignParentEnd="true" />
    
    </RelativeLayout>
    

    now we have icon,text, and lovely checkbox.

    after that i add listview in activity_main.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_width="match_parent"
    android:layout_height="match_parent">
    <!-- Framelayout to display Fragments -->
    <FrameLayout
        android:id="@+id/frame_container"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
    
    <!-- Listview to display slider menu -->
    <ListView
        android:id="@+id/list_slidermenu"
        android:layout_width="240dp"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:choiceMode="singleChoice"
        android:divider="@android:color/transparent"
        android:dividerHeight="0dp"
        android:listSelector="@drawable/list_selector"
        android:background="@color/list_item_title"/>
    
    </android.support.v4.widget.DrawerLayout>
    

    i put the ListView here. finally i defined programmatically code in onCreate in MainActivity.java

        mTitle = mDrawerTitle = getTitle();     
        navMenuTitles = getResources().getStringArray(R.array.nav_drawer_items);
        navMenuIcons = getResources().     
        obtainTypedArray(R.array.nav_drawer_icons);
    
        mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
        mDrawerList = (ListView) findViewById(R.id.list_slidermenu);
    
        navDrawerItems = new ArrayList<NavDrawerItem>();
        navDrawerItems.add(new NavDrawerItem(navMenuTitles[0],   
        navMenuIcons.getResourceId(0, -1)));
    
        navDrawerItems.add(new NavDrawerItem(navMenuTitles[1],  
        navMenuIcons.getResourceId(1, -1)));
    
        navDrawerItems.add(new NavDrawerItem(navMenuTitles[2], 
        navMenuIcons.getResourceId(2, -1)));
    
        navDrawerItems.add(new NavDrawerItem(navMenuTitles[3], 
        navMenuIcons.getResourceId(3, -1)));
    
        navDrawerItems.add(new NavDrawerItem(navMenuTitles[4], 
        navMenuIcons.getResourceId(4, -1)));
    
        navDrawerItems.add(new NavDrawerItem(navMenuTitles[5],   
        navMenuIcons.getResourceId(5, -1)));
    
        navMenuIcons.recycle();
    
    
        adapter = new NavDrawerListAdapter(getApplicationContext(),
                navDrawerItems);
        mDrawerList.setAdapter(adapter);
    
    
        getActionBar().setDisplayHomeAsUpEnabled(true);
        getActionBar().setHomeButtonEnabled(true);
    
        mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,         
          R.string.app_name, 
        ){
            public void onDrawerClosed(View view) {
                getActionBar().setTitle(mTitle);
                invalidateOptionsMenu();
            }
    
            public void onDrawerOpened(View drawerView) {
                getActionBar().setTitle(mDrawerTitle);
                invalidateOptionsMenu();
            }
        };
        mDrawerLayout.setDrawerListener(mDrawerToggle);
    
    @Override
    public boolean onPrepareOptionsMenu(Menu menu) {
        boolean drawerOpen = mDrawerLayout.isDrawerOpen(mDrawerList);
        menu.findItem(R.id.action_settings).setVisible(!drawerOpen);
        return super.onPrepareOptionsMenu(menu);
    }
    
    @Override
    public void setTitle(CharSequence title) {
        mTitle = title;
        getActionBar().setTitle(mTitle);
    }
    
    @Override
    protected void onPostCreate(Bundle savedInstanceState) {
        super.onPostCreate(savedInstanceState);.
        mDrawerToggle.syncState();
    }
    
    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        mDrawerToggle.onConfigurationChanged(newConfig);
    }
    

    and also you have use

    i take icon and text in string.xml you have to define string array for text and array for icon. i follow this tutorial for this code this is very useful you can find more detail in http://www.androidhive.info/2013/11/android-sliding-menu-using-navigation-drawer/

    I hope this solution is useful.

    0 讨论(0)
  • 2020-12-14 21:55

    With app:actionLayout you can make miracles happen.

    Here's an example achieving custom widgets in drawer without any Java code:

    <android.support.v4.widget.DrawerLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:openDrawer="end"
        >
        <android.support.design.widget.NavigationView
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_gravity="end"
            android:background="@android:color/white"
            app:menu="@menu/widgets"
            />
    </android.support.v4.widget.DrawerLayout>
    

    menu/widgets.xml

    <?xml version="1.0" encoding="utf-8"?>
    <menu
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto">
        <item
            android:title="Widgets"
            >
            <menu>
                <item
                    android:title="Checkable menu item (checked)"
                    android:checkable="true"
                    android:checked="true"
                    />
                <item
                    android:title="CheckBox"
                    app:actionLayout="@layout/widget_check" />
                <item
                    android:title="Switch"
                    app:actionLayout="@layout/widget_switch" />
                <item
                    android:title="EditText"
                    app:actionLayout="@layout/widget_edit" />
                <item
                    android:title=""
                    app:actionLayout="@layout/widget_wide" />
                <item
                    android:title="NumberPicker"
                    app:actionLayout="@layout/widget_number" />
                <item
                    android:title="Custom LinearLayout number"
                    app:actionLayout="@layout/widget_custom" />
            </menu>
        </item>
    </menu>
    

    All the layouts (each is a single file)

    <!-- layout/widget_check.xml -->
    <CheckBox
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:text="check"
        android:checked="true"
        />
    
    <!-- layout/widget_edit.xml -->
    <EditText
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="hello"
        android:inputType="text"
        />
    
    <!-- layout-v14/widget_switch.xml
         for older versions you can add a CheckBox into layout/widget_switch.xml
         and treat both as Checkable or CompoundButton -->
    <Switch
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:checked="true"
        tools:targetApi="ICE_CREAM_SANDWICH"
        />
    
    <!-- layout/widget_wide.xml
         Just some text, notice that it's wide on the UI because it has a lot of text,
         and not because it has match_parent -->
    <TextView
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center"
        android:background="#888"
        android:text="Wide can be only forced by content, match_parent doesn't work"
        />
    
    <!-- layout-v11/widget_number.xml
         you're probably better off creating a custom widget anyway -->
    <NumberPicker
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        tools:targetApi="HONEYCOMB"
        />
    
    <!-- layout/widget_custom.xml -->
    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_gravity="center"
        android:gravity="center"
        android:orientation="horizontal"
        >
        <Button
            android:layout_width="32dp"
            android:layout_height="32dp"
            android:padding="0dp"
            android:text="&lt;"
            android:gravity="center"
            />
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="12"
            />
        <Button
            android:layout_width="32dp"
            android:layout_height="32dp"
            android:padding="0dp"
            android:text="&gt;"
            android:gravity="center"
            />
    </LinearLayout>
    

    Connecting with code

    You can access it just like any other menu:

    // <item android:id="@+id/switch" title="Switch" ... />
    NavigationView nav = (NavigationView)findViewById(R.id.navigation_view);
    MenuItem switchItem = nav.getMenu().findItem(R.id.switch);
    CompoundButton switchView = (CompoundButton)MenuItemCompat.getActionView(switchItem);
    switchView.setOnCheckedChangeListener(new OnCheckedChangeListener() {
        @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { }
    });
    
    0 讨论(0)
  • 2020-12-14 21:56

    Alternative solution to TWiStErRob code is to use actionViewClass

       <item
            android:id="@+id/nav_switch"
            android:title="Switch"
            app:actionViewClass="android.widget.Switch"
        />
    

    So u dont need to create the layout file. Of course, for case of Switch, it should be menu for API 14+

    0 讨论(0)
提交回复
热议问题