getSearchableInfo returns 空

getSearchableInfo returns NULL

在尝试了 Whosebug 中关于这个问题的所有解决方案之后,我决定在这里提问。

我正在尝试在我的操作栏中实现搜索栏。 我正在使用 AppCompatActivity 并导入 android.support.v7.widget.SearchView.

郑重声明,我正在使用 PageManager 和 TabLayout(如果有任何关系的话)。

我在以下行中收到 java.lang.NullPointerException 错误:

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

这是我的代码:

搜索栏声明在 menu_main.xml:

<item
        android:id="@+id/searchPlace"
        android:title="@string/search_hint"
        android:actionViewClass="android.support.v7.widget.SearchView"
        android:showAsAction="always"/>

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" />

AndroidManifest.xml

<application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/Theme.AppCompat.Light.NoActionBar" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>

            <meta-data
                android:name="android.app.default_searchable"
                android:value=".searchResultActivity" />

        </activity>
        <activity
            android:name=".Settings"
            android:label="@string/title_activity_settings" >
        </activity>

        <activity
            android:name=".searchResultActivity"
            android:label="@string/app_name"
            android:theme="@style/Theme.AppCompat.Light.NoActionBar">

            <!-- to identify this activity as "searchable" -->
            <intent-filter>
                <action android:name="android.intent.action.SEARCH" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>

            <meta-data
                android:name="android.app.searchable"
                android:resource="@xml/searchable" />
        </activity>

在我的 MainActivity.java onCreateOptionsMenu 中搜索代码:

// Associate searchable configuration with the SearchView
        SearchManager searchManager =
                (SearchManager) getSystemService(Context.SEARCH_SERVICE);
        SearchView searchView =
                (SearchView) menu.findItem(R.id.searchPlace).getActionView();
        searchView.setSearchableInfo(
                searchManager.getSearchableInfo(getComponentName()));

Logcat 错误:

Process: il.co.test.test, PID: 1642
java.lang.NullPointerException
        at il.co.test.test.MainActivity.onCreateOptionsMenu(MainActivity.java:106)
        at android.app.Activity.onCreatePanelMenu(Activity.java:2538)
        at android.support.v4.app.FragmentActivity.onCreatePanelMenu(FragmentActivity.java:262)
        at android.support.v7.internal.view.WindowCallbackWrapper.onCreatePanelMenu(WindowCallbackWrapper.java:85)
        at android.support.v7.app.AppCompatDelegateImplBase$AppCompatWindowCallbackBase.onCreatePanelMenu(AppCompatDelegateImplBase.java:267)
        at android.support.v7.internal.view.WindowCallbackWrapper.onCreatePanelMenu(WindowCallbackWrapper.java:85)
        at android.support.v7.internal.app.ToolbarActionBar.populateOptionsMenu(ToolbarActionBar.java:448)
        at android.support.v7.internal.app.ToolbarActionBar.run(ToolbarActionBar.java:65)
        at android.os.Handler.handleCallback(Handler.java:733)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:136)
        at android.app.ActivityThread.main(ActivityThread.java:5017)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:515)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
        at dalvik.system.NativeStart.main(Native Method)

更新

我不确定,我不知道如何检查 - 但我很确定我的 getActionVIew() returns NULL.

更新 2 - 已修复!

在检查了一些关于 getActionView() null 问题的 Whosebug 之后, getActionView() of my MenuItem return null 的第二个答案解决了我的问题。 我不得不使用命名空间 app 代替 android.

真的很痛!

希望有人能发现我的错误并帮助我改正,因为我花了 6 个小时尝试了很多解决方案。

提前致谢!

搜索菜单项

<item
    android:id="@+id/searchPlace"
    android:title="@string/search_hint"
    android:actionViewClass="android.support.v7.widget.SearchView"
    android:title="@string/search"
    app:showAsAction="always|collapseActionView"/>

Activity代码

public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.your_menu, menu);
    SearchView searchView = (SearchView) menu.findItem(R.id.searchPlace).getActionView();
    searchView.setOnQueryTextListener(queryTextListener);
    return true;
}

private OnQueryTextListener queryTextListener = new OnQueryTextListener()
{
    @Override
    public boolean onQueryTextSubmit(String query) {
        //if you need this
        return false;
    }

    @Override
    public boolean onQueryTextChange(String query) {
        //your code
        return true;
    }
};

在这种情况下,您不需要可搜索的配置,不需要清单中的笔触,不需要 SearchManager 和其他东西。只需在菜单中声明搜索项即可。

在检查了一些关于 getActionView() null 问题的 Whosebug 之后, getActionView() of my MenuItem return null 的第二个答案解决了我的问题。 我不得不使用命名空间 app 代替 android.

好痛!