MenuItemCompat.getActionView始终返回null

Moh*_*hin 142 android searchview android-search android-actionbar-compat

我刚刚实现了v7 AppCompat支持库,但在MenuItemCompat.getActionView我测试的每个Android版本中总是返回null(4.2.2,2.3.4 ....)

SearchView显示在操作栏上,但它不响应触摸操作,不会展开,以显示其EditText与就像一个简单的图标.

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.menu, menu);

    MenuItem searchItem = menu.findItem(R.id.action_search);
    SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchItem);
    if (searchView != null) {
        SearchViewCompat.setOnQueryTextListener(searchView, mOnQueryTextListener);
        searchView.setIconifiedByDefault(false);
        Log.d(TAG,"SearchView not null");
    } else
        Log.d(TAG, "SearchView is null");
    }
    return super.onCreateOptionsMenu(menu);
}
Run Code Online (Sandbox Code Playgroud)

menu.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/action_search"
          app:showAsAction="always|collapseActionView"
          android:icon="@drawable/abc_ic_search"
          android:title="@string/action_bar_search"
          android:actionViewClass="android.support.v7.widget.SearchView"/>

    <item android:id="@+id/action_refresh"
          android:icon="@drawable/refresh"
          android:title="@string/action_bar_refresh"
          app:showAsAction="ifRoom"/>
</menu>
Run Code Online (Sandbox Code Playgroud)

Moh*_*hin 296

最后我找到了解决方案.

  1. 将名称空间actionViewClass从更改android:actionViewClassapp:actionViewClass

  2. 实现 android.support.v7.widget.SearchView.OnQueryTextListener当前活动的界面.

  3. 直接使用setOnQueryTextListener而不是SearchViewCompat.setOnQueryTextListener

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
      MenuInflater inflater = getMenuInflater();
      inflater.inflate(R.menu.menu, menu);
    
      MenuItem searchItem = menu.findItem(R.id.action_search);
      SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchItem);
      if (searchView != null) {
         searchView.setOnQueryTextListener(this);
      }
    
      return super.onCreateOptionsMenu(menu);
    }
    
    Run Code Online (Sandbox Code Playgroud)

  • 另请注意,android:showAsAction也需要更改为app:showAsAction.还要确保您的活动主题(不仅仅是应用程序)引用了appcompat主题.最后,app声明是"http://schemas.android.com/apk/res-auto" (5认同)
  • 很棒的答案!可能还需要澄清app:actionViewClass中的"app"还需要为"app"命名空间添加额外的xmlns声明. (4认同)
  • 如果这解决了你的问题,你应该接受你的答案.我还想将所有其他有类似问题的人指向另一个讨论类似问题的线程:http://stackoverflow.com/q/18407171/1108032.如果当前线程无法解决您的问题,请考虑在那里查看解决方案. (3认同)
  • 需要说'android.support.v7.widget.SearchView`类不应该与'android.support.v4.widget.SearchViewCompat'类混淆(这在使用ActionBarCompat库时被称为常见错误) (3认同)

Iva*_*nov 85

就我而言,它是ProGuard文件.你需要添加这一行:

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

  • 哇,为什么这是一件事?这是唯一对我有用的东西. (2认同)
  • +1.非常明显,但我仍然会提到 - 如果您已将SearchView扩展到另一个类,请在proguard中保留该类的路径! (2认同)

Sea*_*eau 42

对我来说,错误的menu.xml命名空间导入导致了这个问题.

我原来的menu.xml:

<menu xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:app="http://schemas.android.com/tools">
        <item android:id="@+id/action_search"
              android:title="@string/map_option_search"
              android:icon="@drawable/ic_action_search"
              app:showAsAction="collapseActionView|ifRoom"
              app:actionViewClass="android.support.v7.widget.SearchView"/>
</menu>
Run Code Online (Sandbox Code Playgroud)

它看起来像是xmlns:app="http://schemas.android.com/tools"导致MenuItemCompat.getActionView()返回null.更改此导入以xmlns:app="http://schemas.android.com/apk/res-auto"修复问题.

新工作menu.xml:

<menu xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:app="http://schemas.android.com/apk/res-auto">
       <item android:id="@+id/action_search"
              android:title="@string/map_option_search"
              android:icon="@drawable/ic_action_search"
              app:showAsAction="collapseActionView|ifRoom"
              app:actionViewClass="android.support.v7.widget.SearchView"/>
</menu>
Run Code Online (Sandbox Code Playgroud)


小智 5

我认为问题是您使用Support V7包中的SearchView,并且您的API级别可能设置为..... 22 ??.

将代码更改为以下内容以解决问题:

menu.xml文件

<?xml version="1.0" encoding="UTF-8" ?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
    <item 
        android:id="@+id/action_search"
        android:icon="@drawable/actionbar_button_search"
        android:title="Search"
        android:showAsAction="always"
        android:actionViewClass="android.widget.SearchView" />
</menu> 
Run Code Online (Sandbox Code Playgroud)