我正在尝试在我的Android应用中实现搜索。有两个活动,即启动搜索的MainActivity(通过操作栏中的searchview)和ResultsActivity,其中处理搜索并使用结果对列表进行膨胀。问题是我在主活动中的onCreateOptionsMenu中调用的getSearchableInfo方法返回null,就像没有附加到活动的searchable.xml一样。我在清单中尝试了很多元数据安排的组合,也找到了互联网上的每个解决方案和其他stackoverflow问题,但似乎没有任何效果。 这些是来源:
的AndroidManifest.xml
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/Theme.AppCompat.Light" >
<activity
android:name="com.example.webparser.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.searchable"
android:resource="@xml/searchable" />
</activity>
<activity android:name="com.example.ResultsActivity" >
<intent-filter>
<action android:name="android.intent.action.SEARCH" />
</intent-filter>
</activity>
<meta-data
android:name="android.app.default_searchable"
android:value=".ResultsActivity" />
</application>
** MainActivity.java **
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
SearchManager searchManager = (SearchManager) getSystemService(getApplicationContext().SEARCH_SERVICE);
SearchView searchView = (SearchView) menu.findItem(R.id.search)
.getActionView();
searchView.setSearchableInfo(searchManager
.getSearchableInfo(getComponentName()));
Log.d("Search:", searchManager.getSearchableInfo(getComponentName())
.toString());
return true;
}
** ResultsActivity.java **
private void handleIntent(Intent intent) {
if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
String query = intent.getStringExtra(SearchManager.QUERY);
elementi = new ArrayList<String>();
for(Ricetta ricetta:ricette){
if( ricetta.getNome().toLowerCase().matches(query) ){
elementi.add(ricetta.getNome());
}
}
adapter=new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1,
elementi);
lista.setAdapter(adapter);
Log.i("LOG:", "searching");
}
}
** searchable.xml **
<?xml version="1.0" encoding="utf-8"?>
<searchable xmlns:android="http://schemas.android.com/apk/res/android"
android:label="@string/app_name"
/>
请注意我插入了一个Log.d,其中searchview应该被初始化,并且在哪里被称为getSearchableInfo,因此在运行时会引发nullpointerexception并且应用程序不会启动,但是如果删除了该Log.d然后除了搜索工作之外的所有事情(按下在搜索框中输入没有任何反应)。我认为清单存在问题,但我无法弄清楚它是什么。有没有人有任何线索? 我还尝试在singleTop中启动主要活动,将可搜索的元数据标记指向主要活动,但引发了同样的异常。
答案 0 :(得分:0)
我注意到您正在使用“菜单”尝试获取搜索视图,而不是findViewById
函数
SearchView searchView = (SearchView) menu.findItem(R.id.search)
.getActionView()
应该更像这样
SearchView searchView = (SearchView) findViewById(R.id.search);
这将为您提供您正在寻找的 SearchView 。
答案 1 :(得分:0)
面临同样的问题。以下帮助我:
这是我的MainActivity
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_list_view_test, menu);
SearchManager searchManager = (SearchManager)getSystemService(Context.SEARCH_SERVICE);
MenuItem searchItem = menu.findItem(R.id.search);
SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchItem);
searchView.setSearchableInfo( searchManager.getSearchableInfo(getComponentName()) );
return true;
注意:确保已从Support.v7.widget导入SearchView (import android.support.v7.widget.SearchView;)
这是我的MainActivity的Menu.xml
&LT; item android:id =“@ + id / search” 机器人:标题=“搜索” 机器人:图标= “@绘制/ ic_action_search” 应用:showAsAction = “ifRoom | collapseActionView” app:actionViewClass =“android.support.v7.widget.SearchView”/&gt;
答案 2 :(得分:0)
在我的情况下,我有类似的设置只是有点不同。我有:
<meta-data android:name="android.app.default_searchable"
android:value=".ResultsActivity" />
在我的主要活动中。并且
<meta-data android:name="android.app.searchable"
android:resource="@xml/searchable" />
和
searchView.setSearchableInfo(searchManager.getSearchableInfo(componentName));
应该有用。
在我的ResultActivity中。 我在MainActivity中创建了一个组件名称:
ComponentName componentName = new ComponentName(context, ResultActivity.class);
注意:请注意您的项目布局:
如果您对app:actionViewClass="android.support.v7.widget.SearchView"
android:actionViewClass="android.support.v7.widget.SearchView"