如何在android中的菜单项中添加切换按钮

时间:2014-01-22 11:57:11

标签: android menu android-optionsmenu

我的应用程序中有选项菜单项。要求是在菜单项中添加切换按钮。这可能吗?

5 个答案:

答案 0 :(得分:46)

在撰写本文时, 3个选项

1)使用app:actionViewClass。例如:

<?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="Switch!"
        app:actionViewClass="android.widget.Switch"
        app:showAsAction="always" />
</menu>

2)您可以在菜单项中使用自定义布局来添加切换按钮。例如:

使用Switch创建布局(或者,您也可以使用ToggleButton),res/layout/menu_switch.xml

<?xml version="1.0" encoding="utf-8"?>
<Switch xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:padding="64dp" />

在菜单项中使用该布局:

<?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/switch_button_title"
        app:actionLayout="@layout/menu_switch"
        app:showAsAction="always" />
</menu>

3)您需要将菜单的android:checkable属性设置为true并在运行时控制其已检查状态。例如:

菜单

<item
    android:id="@+id/checkable_menu"
    android:checkable="true"
    android:title="@string/checkable" />

<强>活动

private boolean isChecked = false;

@Override
public boolean onPrepareOptionsMenu(Menu menu) {
    MenuItem checkable = menu.findItem(R.id.checkable_menu);
    checkable.setChecked(isChecked);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case R.id.checkable_menu:
            isChecked = !item.isChecked();
            item.setChecked(isChecked);
            return true;
        default:
            return false;
    }
}

希望这有帮助。

答案 1 :(得分:1)

使用app:actionViewClass

 <item android:id="@+id/id"
    android:title="@string/string"
    app:actionViewClass="android.widget.ToggleButton"
    android:orderInCategory="80"
    app:showAsAction="always" />

答案 2 :(得分:0)

public boolean onPrepareOptionsMenu(final Menu menu) {       
      if(super.mMapView.isTraffic()) 
           menu.findItem(MENU_TRAFFIC_ID).setIcon(R.drawable.traffic_off_48); 
      else 
           menu.findItem(MENU_TRAFFIC_ID).setIcon(R.drawable.traffic_on_48); 

      return super.onPrepareOptionsMenu(menu); 
 }

答案 3 :(得分:0)

您的意思是想要将切换按钮添加为选项菜单中显示的元素/项目之一,或者从菜单中向列表项添加按钮吗?

然后你可以使用自定义布局(如果需要,可以使用ListView)并在

中对其进行充气
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.main_menu, menu);
    return true;
}

并且每次按钮切换时都可以保存值。

public boolean onOptionsItemSelected(MenuItem item) {
  switch (item.getItemId()) {
    case R.id.btnToggleValue:
      // save it here
      return true;
    case R.id.btnSecond:
      ...
      return true;
    default:
      return super.onOptionsItemSelected(item);
  }
}

答案 4 :(得分:0)

在菜单项中使用actionViewClass="android.widget.Switch时遇到了几个问题。实际上,它确实显示了ToolBar上的开关,尽管对我来说:

  • 当我切换时,onOptionsItemSelected()并没有真正被调用 开关。
  • setChecked()上使用MenuItem不会切换其状态。

在调试并删除actionViewClass="android.widget.Switch之后,onOptionsItemSelected()再次被调用。

不确定发生了什么;也许我正在使用通过ActionBar设置的自定义setSupportActionBar(),并通过在{strong>片段中启用setHasOptionsMenu(true)来使用OptionsMenu回调。

我通过使开关本身膨胀来解决此问题,并在其上设置OnCheckedChangeListener

<item
    android:id="@+id/switch"
    android:title=""
    app:actionViewClass="androidx.appcompat.widget.SwitchCompat"
    app:showAsAction="always" />

在片段中

@Override
public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) {
    inflater.inflate(R.menu.my_menu, menu);
    MenuItem menuItem = menu.findItem(R.id.switch);
    SwitchCompat switch = (SwitchCompat) menuItem.getActionView();

    switch.setOnCheckedChangeListener((buttonView, isChecked) -> {
        // Do something when `isChecked` is true or false
    });

}

要以编程方式切换开关,请在setChecked()而不是Switch上调用MenuItem