为什么getActionView()返回null

时间:2015-11-05 02:54:51

标签: java android

我现在一直在寻找解决方案。我只想在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之前定义的项目,我是否搞砸了?

3 个答案:

答案 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)