53

我只想通过代码调整 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());

日志是:

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>
4

6 回答 6

84

你应该使用

app:actionLayout="@layout/menu_actionbar_basket"

如果你使用这就是诀窍

android:actionLayout="@layout/menu_actionbar_basket"

你总是会在默认工具栏中得到空异常。

于 2016-02-20T05:03:16.270 回答
39

getActionView()仅在有来自的自定义 actionView 时才有效setActionView

于 2013-01-11T21:19:50.190 回答
33

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

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

不要忘记声明它: xmlns:app="http://schemas.android.com/apk/res-auto"

于 2015-05-02T21:44:42.517 回答
7

第一个解决方案

这可能是你没有在菜单文件中设置actionLayout所以在菜单文件中设置你的actionLayout

app:actionLayout="@layout/your_action_layout"

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

android:actionLayout="@layout/your_action_layout"

app:actionLayout="@layout/your_action_layout"

于 2020-09-13T16:52:14.217 回答
6

如果您的调试版本正常工作并且问题仅与发布版本有关,那么这可能是因为 proguard 配置。如果您在应用程序中启用了 proguard,则将以下行添加到 proguard-rules.pro

-keep class android.support.v7.widget.SearchView { *; }
于 2017-03-06T08:47:39.107 回答
0

为了获得我使用的 MenuItem 视图:

@Override
public boolean onOptionsItemSelected(MenuItem item) {

    switch (item.getItemId()) {
        case R.id.someMenuItem:

            View v = findViewById(R.id.someMenuItem);
            doSomethingWithView(v);

            break;
    }

    return super.onOptionsItemSelected(item);
}
于 2022-01-10T13:36:39.180 回答