Switch in Navigation drawer item with Design Support Library on Android

前端 未结 8 1895
长情又很酷
长情又很酷 2020-12-30 07:05

I need to put Switch inside item in navigation drawer. I\'m using new design support library, but I cannot find if it is posibble at all. When using

android         


        
相关标签:
8条回答
  • 2020-12-30 07:40

    Your menu item for the navigation drawer:

    <item
        android:id="@+id/nav_item1"
        android:icon="@drawable/ic_item1"
        android:title="item1"
        app:actionLayout="@layout/layout_switch"
        />
    

    and the layout for that item:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="horizontal" android:layout_width="match_parent"
        android:layout_height="match_parent">
    
        <android.support.v7.widget.SwitchCompat
            android:id="@+id/drawer_switch"
            android:layout_width="fill_parent"
            android:layout_height="match_parent"
            android:text=""/>
    
    </LinearLayout>
    

    EDIT:

    I ended up using a different approach. In fact, I found out that you can use any view in the drawer, so there's no point in bothering with the menu stuff. Just create a view the usual way (with listeners, etc.) and add in to the drawer.

    0 讨论(0)
  • 2020-12-30 07:43

    simply yes you can do this easily, i will post my code so you can implement it

    <item android:id="@+id/nav_item_1"
            android:title="Android"
            android:icon="@drawable/ic_android_black_24dp"
            android:checked="true"/>
    

    and the Main Activity Layout should be :

    <android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">
    
    <LinearLayout
        android:id="@+id/main_content"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
    
        <android.support.v7.widget.Toolbar
            android:id="@+id/app_bar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@color/colorPrimary"
            android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" />
    
        <TextView
            android:id="@+id/content_text"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:layout_marginTop="50dp"
            android:text="Your Content Goes Here"
            android:textAppearance="?android:attr/textAppearanceLarge"
            android:textColor="@color/colorAccent" />
    
        <!-- your content layout -->
    
    </LinearLayout>
    
    <android.support.design.widget.NavigationView
        android:id="@+id/menu_drawer"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        app:headerLayout="@layout/drawer_header"
        app:menu="@menu/menu_drawer" />
    

    And here's a step by step tutorial for Navigation Drawer using Design Library

    0 讨论(0)
  • 2020-12-30 07:44

    One way I have found of doing this would be to use setActionView on the menuItem you want:

    mNavigationView.getMenu().findItem(R.id.nav_connect)
            .setActionView(new Switch(this));
    
    // To set whether switch is on/off use:
    ((Switch) mNavigationView.getMenu().findItem(R.id.nav_connect).getActionView()).setChecked(true);
    

    Probably want a click listener as well to change the state of the Switch:

    mNavigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
        @Override
        public boolean onNavigationItemSelected(MenuItem menuItem) {
    
            switch (menuItem.getItemId()) {
                case R.id.nav_connect:
                    ((Switch) menuItem.getActionView()).toggle();
                    return true;
            }
        }
    }
    

    I haven't tried, but you could probably use android:actionLayout="@layout/switch_layout" in xml and point to a custom layout you created.

    Also could try using an ActionProvider which might offer a little more robustness. I haven't tried this method either though.

    0 讨论(0)
  • 2020-12-30 07:47

    I did something like this.

    navigationView.getMenu().findItem(R.id.vibrate)
                .setActionView(new Switch(this));
    
        Switch vibrateSwitch =(Switch) 
    navigationView.getMenu().findItem(R.id.vibrate).getActionView();
        vibrateSwitch.setChecked(true);
        vibrateSwitch.setOnCheckedChangeListener(new 
    CompoundButton.OnCheckedChangeListener(){
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean 
    isChecked){
                    SharedPreferences sharedPreferences = 
    getSharedPreferences(getString(R.string.MyPREFERENCES), MODE_PRIVATE);
                    SharedPreferences.Editor editor = sharedPreferences.edit();
                    editor.putBoolean(getString(R.string.VIBRATE), isChecked);
                    editor.commit();
            }
    
        });
    
    0 讨论(0)
  • 2020-12-30 07:55

    None of the answers seems to be complete so after some more research here is what I came up with:

    drawer_switch.xml:

    <?xml version="1.0" encoding="utf-8"?>
    <android.support.v7.widget.SwitchCompat 
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/drawer_switch"
        android:layout_width="fill_parent"
        android:layout_height="match_parent" />
    

    drawer_menu.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="@string/header">
            <menu>
                <item
                    android:id="@+id/switch_item"
                    android:icon="@drawable/ic_switch_item"
                    app:actionLayout="@layout/drawer_switch"
                    android:title="@string/switch_item" />
            </menu>
        </item>
    </menu>
    

    DrawerActivity.java:

    SwitchCompat drawerSwitch = (SwitchCompat) navigationView.getMenu().findItem(R.id.switch_item).getActionView();
    drawerSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                @Override
                public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                    if (isChecked) {
                        // do stuff
                    } else {
                        // do other stuff
                    }
                }
    });
    

    DrawerActivity.java:

    @Override
    public boolean onNavigationItemSelected(@NonNull MenuItem item) {
    
        int id = item.getItemId();
    
        if (id == R.id.switch_item) {
            return false;
        }
    
        closeDrawer();
        return true;
    }
    
    0 讨论(0)
  • 2020-12-30 07:56

    If you have to update the switch in navigation with respect to it's toggling then it's better to use two different menu layouts with checked switch and without checked switch. So by checking the current state you can easily change the navigation drawer.

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