Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/191.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android设计导航抽屉-如何在nav xml中添加开关?_Java_Android_Android Layout_Navigation Drawer_Material Design - Fatal编程技术网

Java Android设计导航抽屉-如何在nav xml中添加开关?

Java Android设计导航抽屉-如何在nav xml中添加开关?,java,android,android-layout,navigation-drawer,material-design,Java,Android,Android Layout,Navigation Drawer,Material Design,我正在使用新的Android设计导航抽屉。我想在抽屉里加一个开关。是否有一个可行的方法来实现这一点 这是菜单xml: <menu xmlns:android="http://schemas.android.com/apk/res/android"> <group android:id="@+id/nav_view_menu_group_1" android:checkableBehavior="single"> &l

我正在使用新的Android设计导航抽屉。我想在抽屉里加一个开关。是否有一个可行的方法来实现这一点

这是菜单xml:

<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <group
        android:id="@+id/nav_view_menu_group_1"
        android:checkableBehavior="single">
        <item
            android:id="@+id/nav_view_menu_item_myschedule"
            android:icon="@drawable/ic_navview_my_schedule"
            android:title="@string/navview_menu_item_myschedule"
            android:titleCondensed="@string/navview_menu_item_myschedule" />
        <item
            android:id="@+id/nav_view_menu_item_iolive"
            android:icon="@drawable/ic_navview_play_circle_fill"
            android:title="@string/navview_menu_item_iolive"
            android:titleCondensed="@string/navview_menu_item_iolive"
            android:visible="false"/>
        <item
            android:id="@+id/nav_view_menu_item_explore"
            android:icon="@drawable/ic_navview_explore"
            android:title="@string/navview_menu_item_explore"
            android:titleCondensed="@string/navview_menu_item_explore" />
        <item
            android:id="@+id/nav_view_menu_item_map"
            android:icon="@drawable/ic_navview_map"
            android:title="@string/navview_menu_item_map"
            android:titleCondensed="@string/navview_menu_item_map"
            android:visible="false"/>
    </group>

</menu>

如何将一个
更改为交换机:


我目前正在使用默认布局:

<android.support.design.widget.NavigationView
        android:id="@+id/nav_view"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:fitsSystemWindows="true"
        app:menu="@menu/activity_main_drawer" />


我非常感谢您的反馈。谢谢。

我们可以通过以下方式完成

@Override
public boolean onPrepareOptionsMenu(Menu menu) {

    //Get a reference to your item by id
    MenuItem item = menu.findItem(R.id.menu_pick_color);

    //Here, you get access to the view of your item, in this case, the layout of the item has a FrameLayout as root view but you can change it to whatever you use
    FrameLayout rootView = (FrameLayout)item.getActionView();

    //Then you access to your control by finding it in the rootView
    YourControlClass control = (YourControlClass) rootView.findViewById(R.id.control_id);

    //And from here you can do whatever you want with your control

    return true;
}

我发现的一种方法是在您想要的菜单项上使用
setActionView

    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);
可能还需要单击侦听器来更改交换机的状态:

    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;
            }
        }
    }
我没有尝试过,但您可能可以在xml中使用android:actionLayout=“@layout/switch_layout”
,并指向您创建的自定义布局


也可以尝试使用一个可能提供更健壮性的。不过,我也没有尝试过这种方法。

如果您只想检查开关中的更改,您可以为开关设置onCheckedChangeListener,如下所示

((Switch) navigationView.getMenu().findItem(R.id.darkModeSwitch).getActionView())
            .setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            if(isChecked) {
                Toast.makeText(MainActivity.this, "Checked", Toast.LENGTH_SHORT).show();
            } else {
                Toast.makeText(MainActivity.this, "Unchecked", Toast.LENGTH_SHORT).show();
            }
        }
    });
如果你想保持冷静,请使用lambda

((Switch) navigationView.getMenu().findItem(R.id.darkModeSwitch).getActionView())
            .setOnCheckedChangeListener((buttonView, isChecked) -> {
                if(isChecked) {
                    Toast.makeText(MainActivity.this, "Checked", Toast.LENGTH_SHORT).show();
                } else {
                    Toast.makeText(MainActivity.this, "Unchecked", Toast.LENGTH_SHORT).show();
                }
            });

你试过自定义布局吗?你现在用的是什么,抽屉布局?还是其他?我用的是
((Switch) navigationView.getMenu().findItem(R.id.darkModeSwitch).getActionView())
            .setOnCheckedChangeListener((buttonView, isChecked) -> {
                if(isChecked) {
                    Toast.makeText(MainActivity.this, "Checked", Toast.LENGTH_SHORT).show();
                } else {
                    Toast.makeText(MainActivity.this, "Unchecked", Toast.LENGTH_SHORT).show();
                }
            });