【问题标题】:Switch in Navigation drawer item with Design Support Library on Android在 Android 上使用设计支持库切换导航抽屉项目
【发布时间】:2015-08-29 16:32:57
【问题描述】:

我需要将 Switch 放在导航抽屉中的项目内。我正在使用新的设计支持库,但我根本找不到它是否可行。使用时

android:checkable

项目刚刚被完全选中,这不是我想要的。

这是我真正想要的截图。有可能实现吗?

【问题讨论】:

  • 你好@mlody,我想问一下。如何在导航抽屉中添加该开关。我在这里问了一个问题 = stackoverflow.com/questions/33951901/… - 谢谢
  • @Joolah 不幸的是我没有添加这个开关,因为我没有找到没有外部 NavigationDrawer 的方法。

标签: android navigation-drawer android-support-library android-design-library androiddesignsupport


【解决方案1】:

你应该可以的。

您的抽屉式导航视图可以是LinearLayout,在其中,您可以包含您的NavigationView 和另一个ViewGroup 添加开关。

【讨论】:

  • 你的意思是把 放在 标签之间吗?我可以这样做,但我得到的只是文本视图和在导航抽屉 ImageView 上绘制的开关,不是它的一部分,而是它。
【解决方案2】:

是的,你可以很容易地做到这一点,我会发布我的代码以便你实现它

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

主活动布局应该是:

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

这是一步一步的tutorial for Navigation Drawer using Design Library

【讨论】:

  • 您的解决方案中没有 Switch。
【解决方案3】:

我发现这样做的一种方法是在你想要的 menuItem 上使用 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);

可能还需要一个点击监听器来更改 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;
        }
    }
}

我没有尝试过,但您可能可以在 xml 中使用 android:actionLayout="@layout/switch_layout" 并指向您创建的自定义布局。

也可以尝试使用可能会提供更多稳健性的 ActionProvider。不过这个方法我也没试过。

【讨论】:

  • 免责声明:请确认您使用的是 app:actionLayout="@layout/layout_menu_profile" 而不是 android:actionLayout="@layout/layout_menu_profile"
【解决方案4】:

导航抽屉的菜单项:

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

以及该项目的布局:

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

编辑:

我最终使用了不同的方法。事实上,我发现您可以使用抽屉中的任何视图,因此没有必要为菜单内容而烦恼。只需以通常的方式(使用侦听器等)创建一个视图并添加到抽屉中。

【讨论】:

  • 非常感谢。有用。我很遗憾一年前我不知道。
  • 如何为switch添加监听器,能否在响应中添加代码
  • 您如何向交换机添加监听器,因为您显然无法以正常方式进行。
  • mehmet & mogren3000:我最终使用了不同的方法。事实上,我发现您可以在抽屉中使用 any 视图,因此没有必要为菜单内容而烦恼。只需以通常的方式(使用侦听器等)创建一个视图并添加到抽屉中。
  • 如何知道java文件中的switch是否切换了?
【解决方案5】:

我做了这样的事情。

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();
        }

    });

【讨论】:

    【解决方案6】:

    似乎没有一个答案是完整的,所以经过更多研究后,我得出了以下结论:

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

    【讨论】:

    • 如果你得到 NULLPointer 试试这个 - 导航项目中引用了开关。 (Switch) navigationView.getMenu().findItem(R.id.item).getActionView().findViewById(R.id.switch);
    • 免责声明:请确认您使用的是 app:actionLayout="@layout/layout_menu_profile" 而不是 android:actionLayout="@layout/layout_menu_profile"
    • @AbrahamMathew 是的,我是。您可以在答案本身中看到它。
    【解决方案7】:

    如果您必须更新导航中的切换开关,那么最好使用两种不同的菜单布局,带有选中的开关和没有选中的开关。因此,通过检查当前状态,您可以轻松更改导航抽屉。

    【讨论】:

      【解决方案8】:

      对于那些使用Kotlin Extensions的人

      1. 菜单文件
      <menu 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">
      
          <item
              android:id="@+id/nav_notifications_switch"
              android:icon="@drawable/ic_notifications"
              android:title="@string/notifications"
              app:actionLayout="@layout/drawer_notifications_switch" />
      
      </menu>
      
      1. 切换布局文件
      <Switch xmlns:android="http://schemas.android.com/apk/res/android"
          android:id="@+id/toggleSwitch"
          android:layout_width="fill_parent"
          android:layout_height="match_parent" />
      
      1. 代码访问
      nav_view.menu.findItem(R.id.nav_notifications_switch)
          .actionView
          .toggleSwitch
          .setOnCheckedChangeListener { _, isChecked ->
              
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多