getSearchableInfo返回NULL

时间:2015-09-02 17:03:05

标签: android android-searchmanager

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

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

对于记录,如果有任何关联,我正在使用PageManager和TabLayout。

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

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

这是我的代码:

menu_main.xml

中的搜索栏declration
<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$1.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()会返回 NULL

更新2 - 固定!

在检查了一些关于getActionView()null问题的stackoverflow之后, getActionView() of my MenuItem return null的第二个答案解决了我的问题。 我不得不使用 android 的名称空间 app 安装程序。

非常痛苦!

希望有人能找到我的错误并帮我修复它,因为我尝试了6个小时的许多解决方案。

提前致谢!

2 个答案:

答案 0 :(得分:1)

搜索菜单项

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

活动代码

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和其他东西。只需在菜单中声明搜索项即可。

答案 1 :(得分:0)

在检查了一些关于getActionView()null问题的stackoverflow之后, getActionView() of my MenuItem return null的第二个答案解决了我的问题。 我不得不使用 android 的名称空间 app 安装程序。

非常痛苦!