Android getActionView与searchview一起返回null

Android getActionView与searchview一起返回null,android,eclipse,searchview,Android,Eclipse,Searchview,正在尝试让searchview在应用程序上工作 sdk最小17最大22 仿真器api 18的测试 菜单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_settings"

正在尝试让searchview在应用程序上工作

sdk最小17最大22

仿真器api 18的测试

菜单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_settings"
        android:orderInCategory="100"
        android:title="@string/action_settings"
        app:showAsAction="never"/>
    <item android:id="@+id/search" 
        android:icon="@drawable/ic_action_search" 
        android:title="@string/search_title" 
        app:showAsAction="ifRoom|collapseActionView" 
        android:orderInCategory="200" 
        app:actionViewClass="android.support.v7.widget.SearchView">        
    </item> 
    <item android:id="@+id/scan" 
        android:title="@string/scan" 
        android:showAsAction="ifRoom"
        android:orderInCategory="300">        
    </item>   
</menu>
运行“调试”并查看“搜索”菜单项时,操作显示为空

布局显示将android.support.v7.widget.SearchView显示为未知xml属性


我在这个项目上使用Eclipse而不是Android Studio。

这就是我如何将SearchView添加到菜单中的方式(这在一个片段中):


另外,我还建议您切换到Android Studio。

您正在使用支持库。试试这个:

@Override
public boolean onCreateOptionsMenu(final Menu menu) {
    getMenuInflater().inflate(R.menu.menu, menu);
    final SearchView searchView = (SearchView) MenuItemCompat.getActionView(menu.findItem(R.id.menu_search));
    // ...
    return true;
}

我不确定我的东西到底出了什么问题。这一切似乎都合乎逻辑。我怀疑我有一些拼写错误,它们是不正确的xmlns。但它的工作方式,我有它

我非常感谢您的帮助,但建议您解释一下您认为的问题是什么,解决方法是什么以及原因。它真的帮助人学习

MenuItemCompat是帮助以向后兼容的方式访问API级别4之后引入的MenuItem中的功能的工具。这种情况下没有必要这样做

请继续回答问题,这确实有帮助


谢谢

您是否以某种方式使用Proguard或缩小代码

当您使用像Proguard这样的minify方法时,您无法直接访问(但通过某种声明性方式或反射)的类和方法将被删除。为了避免这种情况,您需要指示构建专门保留这些类/方法

在这种情况下,可以删除SearchView类,因为它不是直接调用的

尝试在proguard规则文件中添加此文件(在GetDefaultProGuard文件中检查gradle文件的正确文件名):


谢谢你!帮我省了很多麻烦!:)
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    final MenuItem item = menu.add("Search");
    item.setIcon(android.R.drawable.ic_menu_search);
    item.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
    final SearchView searchView = new SearchView(getActivity());
    searchView.setOnQueryTextListener(this);
    searchView.setIconifiedByDefault(true);
    item.setActionView(mSearchView);
}
@Override
public boolean onCreateOptionsMenu(final Menu menu) {
    getMenuInflater().inflate(R.menu.menu, menu);
    final SearchView searchView = (SearchView) MenuItemCompat.getActionView(menu.findItem(R.id.menu_search));
    // ...
    return true;
}
-keep class android.support.v7.widget.SearchView { *; }