SearchView不会启动SearchActivity,不断崩溃

时间:2017-07-06 16:52:07

标签: android searchview android-search android-searchmanager

我想在用户输入搜索查询时打开SearchResultsActivity,但我一直试图在过去1天内在我的活动中设置搜索视图,但没有成功。我见过很多stackoverflow问题和教程。这些解决方案都不适合我。

我在application

AndroidManifest标签中有此信息
    <meta-data
        android:name="android.app.default_searchable"
        android:value="<package>.search.SearchResultsActivity" />

这是我在清单

中声明的SearchResultsActivity
     <activity
        android:name="search.SearchResultsActivity"
        android:launchMode="singleTop">
        <intent-filter>
            <action android:name="android.intent.action.SEARCH"/>
        </intent-filter>

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

可搜索的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" />

这是我想要此搜索视图的活动

    <activity
        android:name=".goods.GoodsActivity"
        android:screenOrientation="portrait"/>

此处选项创建所述活动的菜单

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

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

    SearchView searchView = (SearchView) MenuItemCompat.getActionView(menu.findItem(R.id.search));
    ComponentName cn = new ComponentName(this, SearchResultsActivity.class);
    searchView.setSearchableInfo(searchManager.getSearchableInfo(cn));

    return true;
}

我经常遇到此代码崩溃

java.lang.NullPointerException: Attempt to read from field 'android.os.Bundle android.content.pm.PackageItemInfo.metaData' on a null object reference
at android.os.Parcel.readException(Parcel.java:1605)
at android.os.Parcel.readException(Parcel.java:1552)
at android.app.ISearchManager$Stub$Proxy.getSearchableInfo(ISearchManager.java:177)
at android.app.SearchManager.getSearchableInfo(SearchManager.java:851)
at <package>.BaseActivity.onCreateOptionsMenu(BaseActivity.java:83)
at android.app.Activity.onCreatePanelMenu(Activity.java:2846)
at android.support.v4.app.FragmentActivity.onCreatePanelMenu(FragmentActivity.java:362)
at android.support.v7.view.WindowCallbackWrapper.onCreatePanelMenu(WindowCallbackWrapper.java:98)
at android.support.v7.app.AppCompatDelegateImplBase$AppCompatWindowCallbackBase.onCreatePanelMenu(AppCompatDelegateImplBase.java:335)
at android.support.v7.view.WindowCallbackWrapper.onCreatePanelMenu(WindowCallbackWrapper.java:98)
at android.support.v7.app.ToolbarActionBar.populateOptionsMenu(ToolbarActionBar.java:454)
at android.support.v7.app.ToolbarActionBar$1.run(ToolbarActionBar.java:61)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

2 个答案:

答案 0 :(得分:0)

升级到Android 7时,我遇到了同样的问题。 为Xamarin解决这个问题的原因是使用下一行

ComponentName component = new ComponentName(PackageName, Java.Lang.Class.FromType(type).Name);
searchView.SetSearchableInfo(searchManager.GetSearchableInfo(component));

代替

ComponentName component = new ComponentName(PackageName, nameof(SearchableActivity));
searchView.SetSearchableInfo(searchManager.GetSearchableInfo(component));

感谢lahsrahXamarin Android how to get Java class name for passing into ComponentName

答案 1 :(得分:0)

在 Java 中也遇到了同样的问题,出于某种奇怪的原因,我只在 Android 7.1.1 和 Android 8.1 上遇到过这个问题。它在 6、10 和 11 上运行良好。无论如何,下面对我来说修复了它,

而不是使用, ComponentName componentName=new ComponentName(this, .class);

下面使用, componentName=new ComponentName(this,Class.forName().getClass());

这在从 6.0 及更高版本开始的所有 Android 版本上都解决了。