使用情况:
MenuItem中使用了app:actionLayout
<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"
tools:context="com.example.nfcdemo.MainActivity">
<item
android:id="@+id/action_open_close_nfc"
android:orderInCategory="100"
android:title=""
app:actionLayout="@layout/menu_switch"
app:showAsAction="always" />
</menu>
menu_switch对应的布局中包含了一个Switch控件
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<Switch
android:id="@+id/switchForActionBar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:text=""
android:checked="false"
android:theme="@style/ThemeOverlay.SwitchBar"
/>
</RelativeLayout>
错误原因
直接使用错误方式(findViewById)获取Switch,导致获取失败,使用时空指针异常
解决办法
使用正确的方式(menu-->menuitem-->actionview-->switch)获取Switch
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
MenuItem switchItem = menu.findItem(R.id.action_open_close_nfc);
mSwitch = (Switch) switchItem.getActionView().findViewById(R.id.switchForActionBar);
if (mNfcAdapter != null) {
mSwitch.setChecked(mNfcAdapter.isEnabled());
}
return true;
}