我想在用户输入搜索查询时打开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)
答案 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));
感谢lahsrah,Xamarin 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 版本上都解决了。