我现在一直在寻找解决方案。我只想在ActionBar下添加一个开关(就像在蓝牙设置中一样)。我在这里发现了类似的问题,但它可能已经过时了。无论如何,这是我的代码:
MainActivity:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.menu_main, menu);
MenuItem item = menu.findItem(R.id.myswitch);
switchButton = (Switch) item.getActionView();
return super.onCreateOptionsMenu(menu);
}
menu_main.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:id="@+id/menu_switch"
android:title="off/on"
app:showAsAction="always"
app:actionLayout="@layout/switchlayout"
app:actionViewClass="android.support.v7.widget.Switch" />
</menu>
switchlayout.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="fill_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<Switch
android:id="@+id/myswitch"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:background="#1E88E5" />
</RelativeLayout>
但无论我做什么,我总能得到:
尝试调用... getActionView()&#39;在空对象引用上
我感到很困惑,因为我只是定义了R.id.myswitch
之前定义的项目,我是否搞砸了?
答案 0 :(得分:4)
除了简单的错误类型(应该menu_switch
匹配您的XML),根据action view training,您必须使用MenuItemCompat.getActionView()来提取ActionView
(并且,在您的情况下,将其投放到SwitchCompat
,因为没有android.support.v7.widget.Switch
)。
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.menu_main, menu);
MenuItem item = menu.findItem(R.id.menu_switch);
switchButton = (SwitchCompat) MenuItemCompat.getActionView(item);
return super.onCreateOptionsMenu(menu);
}
答案 1 :(得分:3)
替换
MenuItem item = menu.findItem(R.id.myswitch);
与
MenuItem item = menu.findItem(R.id.menu_switch);
因为菜单xml中你的项目ID是menu_switch,而不是myswitch。
答案 2 :(得分:2)
如何将MenuItemCompat与静态函数一起使用:
MenuItemCompat.getActionView (MenuItem item)