【问题标题】:SearchView wont start SearchActivity, constantly crashingSearchView 不会启动 SearchActivity,不断崩溃
【发布时间】:2017-12-10 19:28:02
【问题描述】:

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

我在AndroidManifestapplication 标签中有这个

    <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)

【问题讨论】:

  • 你需要setSearchableInfo做什么?
  • @pskink 我不完全确定。我在我查找的大多数地方都看到了它。这是开始SearchResultsActivity我猜
  • 那么你到底想达到什么目的呢?
  • 每次用户从我的源活动@pskink 按下键盘上的搜索按钮时,我都想打开SearchResultsActivity
  • 键盘上的搜索按钮?软键盘?

标签: android searchview android-search android-searchmanager


【解决方案1】:

升级到 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

【讨论】:

    【解决方案2】:

    在 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 版本上都解决了。

    【讨论】:

      猜你喜欢
      • 2020-06-10
      • 1970-01-01
      • 1970-01-01
      • 2023-03-22
      • 2017-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多