Android-操作栏中SearchView上的NullPointerException

Android-操作栏中SearchView上的NullPointerException,android,nullpointerexception,android-actionbar,searchview,Android,Nullpointerexception,Android Actionbar,Searchview,我在尝试将SearchView小部件添加到活动中的ActionBar时遇到问题-调用getActionView获取SearchView对象时,我得到一个空值 我一直在遵循安卓开发者指南,还浏览了大量的SO问题以及互联网上的一些其他链接;都没有用。这可能很简单,但我没能弄明白——在我看来,我的代码基本上与谷歌的代码相同(除了更改一些名称等),但仍然不起作用 任何帮助都将不胜感激 下面是相关的代码位。请让我知道,如果有什么不清楚的,如果你有什么可能是错误的想法 活动代码: private L

我在尝试将SearchView小部件添加到活动中的ActionBar时遇到问题-调用getActionView获取SearchView对象时,我得到一个空值

我一直在遵循安卓开发者指南,还浏览了大量的SO问题以及互联网上的一些其他链接;都没有用。这可能很简单,但我没能弄明白——在我看来,我的代码基本上与谷歌的代码相同(除了更改一些名称等),但仍然不起作用

任何帮助都将不胜感激

下面是相关的代码位。请让我知道,如果有什么不清楚的,如果你有什么可能是错误的想法

活动代码:

    private ListView workflowListView;
    private DrawerLayout drawerLayout;
    private ListView drawerList;
    private ActionBarDrawerToggle drawerToggle;

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        getWindow().requestFeature(Window.FEATURE_ACTION_BAR);
        setContentView(R.layout.activity_workflow_list);

        workflowListView = (ListView) findViewById(R.id.workflowListView);
        drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
        drawerList = (ListView) findViewById(R.id.drawer_list);

        drawerToggle = new ActionBarDrawerToggle(
             this,                  /* host Activity */
             drawerLayout,         /* DrawerLayout object */
             R.drawable.ic_launcher,  /* nav drawer icon to replace 'Up' caret */
             R.string.app_name,  /* "open drawer" description */
             R.string.app_name  /* "close drawer" description */
             ) {

                /** Called when a drawer has settled in a completely closed state. */
                public void onDrawerClosed(View view) {
    //                getActionBar().setTitle("Closed drawer");
                }

                /** Called when a drawer has settled in a completely open state. */
                public void onDrawerOpened(View drawerView) {
    //                getActionBar().setTitle("Open drawer");
                }
       };

       drawerLayout.setDrawerListener(drawerToggle);
       ActionBar actionBar = getActionBar();
       actionBar.setDisplayShowTitleEnabled(false);

       actionBar.setDisplayHomeAsUpEnabled(true);
       actionBar.setHomeButtonEnabled(true);
       actionBar.setIcon(android.R.color.transparent);

       String[] testData = {"a", "b", "c", "d"};
       ArrayList<String> workflowList = new ArrayList<String>();
           for (String s : testData) {

                workflowList.add(s);
           }

       ArrayAdapter<String> workflowAdapter = new ArrayAdapter<String>(this.getApplicationContext(), R.layout.workflow_list_item, workflowList);

            workflowListView.setAdapter(workflowAdapter);
   }


   @Override
   public boolean onCreateOptionsMenu(Menu menu) {
   // Inflate the menu; this adds items to the action bar if it is present.
        MenuInflater inflater = getMenuInflater();

        inflater.inflate(R.menu.workflow_list, menu);
        inflater.inflate(R.menu.options_menu, menu);

        // Associate searchable configuration with the SearchView
        SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);

        // The below line returned null even though it was used in Google sample code
        SearchView searchView = (SearchView) menu.findItem(R.id.search).getActionView();

        searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));

        return super.onCreateOptionsMenu(menu);
    }
私有ListView工作流程ListView;
私人抽屉布局;
私有列表视图抽屉列表;
私人诉讼律师事务所;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
getWindow().requestFeature(Window.FEATURE\u ACTION\u栏);
setContentView(R.layout.activity\u工作流\u列表);
workflowListView=(ListView)findViewById(R.id.workflowListView);
抽屉布局=(抽屉布局)findViewById(R.id.抽屉布局);
抽屉列表=(ListView)findViewById(R.id.drawer\u列表);
抽屉切换=新动作bardrawertoggle(
此,/*主机活动*/
抽屉布局,/*抽屉布局对象*/
R.drawable.ic_启动器,/*导航抽屉图标替换“Up”插入符号*/
R.string.app_名称,/*“打开抽屉”说明*/
R.string.app_name/*“关闭抽屉”说明*/
) {
/**当抽屉处于完全关闭状态时调用*/
公共无效onDrawerClosed(视图){
//getActionBar().setTitle(“封闭抽屉”);
}
/**当抽屉处于完全打开状态时调用*/
打开图纸上的公共空白(视图抽屉视图){
//getActionBar().setTitle(“打开抽屉”);
}
};
抽屉布局。设置抽屉链接器(抽屉切换);
ActionBar ActionBar=getActionBar();
actionBar.setDisplayShowTitleEnabled(false);
actionBar.setDisplayHomeAsUpEnabled(true);
actionBar.setHomeButtonEnabled(真);
actionBar.setIcon(android.R.color.transparent);
字符串[]testData={“a”、“b”、“c”、“d”};
ArrayList workflowList=新建ArrayList();
for(字符串s:testData){
工作流程列表。添加;
}
ArrayAdapter workflowAdapter=新的ArrayAdapter(this.getApplicationContext(),R.layout.workflow\u list\u项,workflowList);
setAdapter(workflowAdapter);
}
@凌驾
公共布尔onCreateOptions菜单(菜单){
//为菜单充气;这会将项目添加到操作栏(如果存在)。
MenuInflater充气机=getMenuInflater();
充气机。充气(右菜单。工作流程列表,菜单);
充气机。充气(右菜单。选项菜单,菜单);
//将可搜索配置与SearchView关联
SearchManager SearchManager=(SearchManager)getSystemService(Context.SEARCH\u服务);
//下面的行返回null,即使它在Google示例代码中使用
SearchView SearchView=(SearchView)菜单.findItem(R.id.search).getActionView();
searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName());
返回super.onCreateOptions菜单(菜单);
}
xml/searchable.xml:

<?xml version="1.0" encoding="utf-8"?>

<searchable xmlns:android="http://schemas.android.com/apk/res/android"
        android:label="@string/app_name"
        android:hint="@string/search_hint"
        android:includeInGlobalSearch="false" />

菜单/选项\u 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/search"
          android:title="@string/search_title"
          android:icon="@drawable/ic_action_search"
          android:showAsAction="always|collapseActionView"
          android:actionViewClass="android.support.v7.widget.SearchView" />
</menu>

尝试将故障线路替换为:

mSearchMenuItem = menu.findItem(R.id.action_search);
mSearchView = (EnglishVerbSearchView) MenuItemCompat.getActionView(mSearchMenuItem);
其中R.id.action\u search是菜单中搜索项的id

编辑

您的清单应如下所示:

<activity
       android:name="com.bronzelabs.twc.activities.WorkflowListActivity"
       android:label="@string/app_name"
       android:theme="@style/Theme.AppCompat.Light" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
</activity>
<activity 
        android:name=".activities.SearchResultActivity"
        android:theme="@style/Theme.AppCompat.Light"
        android:launchMode="singleTop">
        <intent-filter>
            <action android:name="android.intent.action.SEARCH" />
        </intent-filter>
        <meta-data android:name="android.app.searchable" android:resource="@xml/searchable"
            android:value=".activities.SearchResultActivity" />
    </activity>
编辑2

确保您的菜单xml文件是这样的(请注意
yourapp
namespace中的这两个属性-这是使用compat库时需要的):


我也有同样的问题。我的解决办法是: 代替
android:actionViewClass=“android.support.v7.widget.SearchView”


我认为您正在占用FragmentActivity,您需要扩展ActionBarActivity的

我遇到了一个非常类似的问题,下面的行返回空值

SearchView searchView = (android.support.v7.widget.SearchView)MenuItemCompat.getActionView(searchMenuItem);
修复程序在我的
style.xml
文件中,我将AppTheme的父项更改为
Theme.AppCompat.Light

<resources>
    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light">

切换到v21支持库时,我的发布版本中可能出现了类似的问题,但调试版本中没有。原来是一个混淆问题,将这一行添加到我的proguard-rules.txt文件中修复了它:

-keep class android.support.v7.widget.SearchView { *; }

对于仍在搜索的人来说,我遵循了上面的一切,似乎无法让事情进展。我打包了我的searchView.setSearchableInfo。。。在一个空检查中,瞧!它跑得恰到好处

if (searchView != null) {
    searchView.setSearchableInfo(searchManager.getSearchableInfo(
                    new ComponentName(getApplicationContext(), SearchActivity.class)));
}

首先检查您正在为actionViewClass使用app命名空间

android:actionViewClass=“android.support.v7.widget.SearchView”
-这会抛出NPE

app:actionViewClass=“android.support.v7.widget.SearchView”
-使用这个

第二


检查您是否在
menu.xml
中使用了相同的
,在您的活动中对我来说,这是正确的答案: 在menu/options_menu.xml中,使用以下命令:

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

选项\u menu.xml
中,您真的需要使用支持库吗?你能试着设置
android:actionViewClass=“android.widget.SearchView”
?@jbihan-好吧,这是应用程序规范所要求的,所以即使我现在删除它,将来也必须包含它
-keep class android.support.v7.widget.SearchView { *; }
if (searchView != null) {
    searchView.setSearchableInfo(searchManager.getSearchableInfo(
                    new ComponentName(getApplicationContext(), SearchActivity.class)));
}
app:actionViewClass="android.support.v7.widget.SearchView"