一:在menu的item中引用该布局
这了用到了app:actionLayout来指定自定义菜单布局,需要注意的是必须是app:actionLayout,而不应该是android:actionLayout,否则onCreateOptionsMenu方法中的getActionView()方法会返回null。
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/open_speed"
android:title=""
app:actionLayout="@layout/switch_layout_main"
app:showAsAction="always"/>
<item
android:icon="@android:drawable/ic_menu_add"
android:title=""
app:showAsAction="ifRoom">
<!-- item包含menu表示该menu是item下的子菜单 -->
<menu>
<!-- 将group中的菜单项放于一个组里面 -->
<group>
<item
android:id="@+id/menu_add"
android:icon="@android:drawable/ic_menu_add"
android:title="添加应用"
app:showAsAction="ifRoom"/>
<item
android:id="@+id/menu_all_start"
android:icon="@android:drawable/ic_menu_add"
android:title="全部开始"
app:showAsAction="ifRoom"/>
<item
android:id="@+id/menu_all_pause"
android:icon="@android:drawable/ic_menu_add"
android:title="全部暂停"
app:showAsAction="ifRoom"/>
</group>
</menu>
</item>
</menu>
二:在onCreateOptionsMenu(Menu menu)中引用该布局
SwitchCompat需要监听时应该这样重写,不能直接写在onCreate方法中的
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_main, menu);
final MenuItem item = menu.findItem(R.id.open_speed);
SwitchCompat speedSwitch = (SwitchCompat) item.getActionView();
speedSwitch.setOnCheckedChangeListener((buttonView, isChecked) -> {
if (isChecked) {
Toast.makeText(MainActivity.this, "open speed:"+Constants.SPEED_VISIT_TIME+"--"+Constants.SPEED_VISIT_COUNT, Toast.LENGTH_LONG).show();
mHandler.sendEmptyMessage(MSG_APP_START_SPEED);
} else {
Toast.makeText(MainActivity.this, "close speed:"+Constants.SPEED_VISIT_TIME+"--"+Constants.SPEED_VISIT_COUNT, Toast.LENGTH_LONG).show();
mHandler.sendEmptyMessage(MSG_APP_STOP_SPEED);
}
});
return true;
}