为什么getActionView()返回null

6

我已经搜索了数小时,希望找到解决方案。我只想在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()'

我很困惑,因为在定义 R.id.myswitch 的前一行,我刚刚定义了项目(item),我弄错了吗?

3个回答

4
除了简单的打字错误(应该是menu_switch以匹配您的XML),根据操作视图培训,您必须使用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
我检查了链接 https://developer.android.com/training/appbar/action-views#action-view,那里没有 MenuItemCompat.getActionView。该链接建议使用 searchItem.getActionView(); - Shivam Pokhriyal

3
替换
MenuItem item = menu.findItem(R.id.myswitch);

使用

MenuItem item = menu.findItem(R.id.menu_switch);

由于您的菜单XML中的项目ID为menu_switch,而不是myswitch。


2
如何使用静态函数MenuItemCompat
MenuItemCompat.getActionView (MenuItem item)

这也是正确的,但另一个人的先发了。谢谢! - Plays2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接