我的MenuItem的getActionView()返回null

Waz*_*_Be 40 null android view android-actionbar

我只想通过代码调整ActionBar MenuItem的视图.

不幸的是,似乎getActionView总是返回null!

我的代码:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = this.getSupportMenuInflater();
    inflater.inflate(R.menu.folder, menu);
    return super.onCreateOptionsMenu(menu);

}

public boolean onPrepareOptionsMenu(final Menu menu) {
    MenuItem menuFolder = menu.findItem(R.id.menu_folder);
    Log.i("", "* onPrepareOptionsMenu *" + menuFolder);
    Log.i("", "* getActionView *" + menuFolder.getActionView());
Run Code Online (Sandbox Code Playgroud)

日志是:

01-11 22:13:42.884:I /(7893):*onPrepareOptionsMenu*com.actionbarsherlock.internal.view.menu.MenuItemWrapper@41401ac8

01-11 22:13:42.884:I /(7893):*getActionView*null

非常感谢任何帮助

编辑:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >

    <item 
          android:id="@+id/menu_folder"
          android:icon="@drawable/ic_menu_archive"
          android:showAsAction="always"/>
</menu>
Run Code Online (Sandbox Code Playgroud)

Omi*_*nia 54

你应该使用

app:actionLayout="@layout/menu_actionbar_basket"
Run Code Online (Sandbox Code Playgroud)

这就是你使用的技巧

android:actionLayout="@layout/menu_actionbar_basket"
Run Code Online (Sandbox Code Playgroud)

您将始终在默认工具栏中获得null异常.

  • 谢谢@Smartiz,你节省我的时间;) (2认同)

Gab*_*han 32

getActionView()只有在有自定义actionView时才有效setActionView.

  • 是否有替代方法可以访问MenuItem的视图? (9认同)
  • 有一刻.我有ActionBarSherlock项目和两个菜单文件夹:只是菜单和菜单-v11.在menu-v11中我有'android:actionLayout ="@ layout/search_layout"`的菜单项,它适用于所有Android 11+版本.在此之后我复制了这个项目并使用appcompat-v7而不是ActionBarSherlock(minApiVersion现在是11).我有两个菜单文件夹:menu和menu-v14.现在`getActionView()`返回null!A必须写`menuSearch.setActionView(R.layout.search_layout);`!所以检查一下 - 在ActionBarSherlock中,它应该可以在xml中运行 (5认同)
  • 当应用程序中有新内容时,我想在图标上放一个"徽章",所以我需要View添加这个小计数器 (4认同)
  • 我有同样的问题,我的错误是我没有正确使用actionLayout xml属性.首先,你必须在菜单标签中定义一个自定义命名空间,例如`xmlns:app ="http://schemas.android.com/apk/res-auto"`然后在你想要使用的菜单项上像这样的actionLayout属性:`app:actionLayout ="@ layout/month_picker"`在这种情况下,month_picker布局是一个微调器.这样做不需要使用setActionView方法. (3认同)
  • 好的,那么你想为项目创建一个视图并使用setActionView来设置它.这是正确的答案.可能有一个黑客通过获取操作栏并遍历其子项寻找视图,但你不想这样做. (2认同)

Vit*_*lov 28

对我来说,有效的解决方案是使用app命名空间而不是android.

app:actionViewClass="android.support.v7.widget.SearchView"

别忘了申报: xmlns:app="http://schemas.android.com/apk/res-auto"


Amo*_*shi 6

如果您的调试版本工作没有任何问题,并且只有发布版本存在问题,那么这可能是因为proguard配置.如果您已在应用程序中启用了proguard,请将以下行添加到proguard-rules.pro

-keep class android.support.v7.widget.SearchView { *; }
Run Code Online (Sandbox Code Playgroud)


小智 5

第一个解决方案

这可能是你没有设置恰巧actionLayout在菜单文件中,这样设置你的actionLayout在菜单文件

app:actionLayout="@layout/your_action_layout"

第二个解决方案 ,第二个解决方案是

android:actionLayout="@layout/your_action_layout"

app:actionLayout="@layout/your_action_layout"