我的应用程序中有选项菜单项。要求是在菜单项中添加切换按钮。这可能吗?
答案 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
。