Този отговор е малко закъснял, но смятам, че ще бъде полезен за бъдещите зрители. Дилемата изглежда идва от неяснотата на урока за Android SearchView. Сценарият, който cover предполага, че ще показвате резултатите в същата дейност, в която се намира SearchView. В такъв сценарий маркерът за активност във файла AndroidManifest.xml
ще изглежда по следния начин:
<activity
android:name=".MainActivity"
android:label="@string/main_activity_label"
android:launchMode="singleTop">
<intent-filter>
<action android:name="android.intent.action.SEARCH"/>
</intent-filter>
<meta-data android:name="android.app.searchable"
android:resource="@xml/searchable" />
</activity>
След това, за да обработите резултатите в същата дейност, трябва да замените метода onNewIntent
:
@Override
public void onNewIntent(Intent intent){
setIntent(intent);
if(Intent.ACTION_SEARCH.equals(intent.getAction())) {
String query = intent.getStringExtra(SearchManager.QUERY);
//now you can display the results
}
}
Въпреки това, в ситуация, в която искаме да покажем резултатите в друга дейност, трябва да поставим филтъра за намерения и мета таг в дейността с резултати и да въведем нов мета таг за дейността SearchView. И така, нашите дейности ще изглеждат нещо подобно във файла AndroidManifest.xml
:
<activity
android:name=".MainActivity"
android:label="@string/main_activity_label"
android:launchMode="singleTop">
<!-- meta tag points to the activity which displays the results -->
<meta-data
android:name="android.app.default_searchable"
android:value=".SearchResultsActivity" />
</activity>
<activity
android:name=".SearchResultsActivity"
android:label="@string/results_activity_label"
android:parentActivityName="com.example.MainActivity">
<!-- Parent activity meta-data to support 4.0 and lower -->
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="com.example.MainActivity" />
<!-- meta tag and intent filter go into results activity -->
<meta-data android:name="android.app.searchable"
android:resource="@xml/searchable" />
<intent-filter>
<action android:name="android.intent.action.SEARCH" />
</intent-filter>
</activity>
След това в метода onCreateOptionsMenu на нашата MainActivity активирайте SearchView (предполага се, че добавяте SearchView към ActionBar). Вместо да използваме getComponentName()
в извикването на метода getSearchableInfo() на SearchManager, ние създаваме нов обект ComponentName, използвайки контекста на MainActivity и класа SearchResultsActivity:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_home, menu);
SearchView search = (SearchView) MenuItemCompat.getActionView(menu.findItem(R.id.action_search);
// Associate searchable configuration with the SearchView
SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
search.setSearchableInfo(searchManager.getSearchableInfo(new ComponentName(this, SearchResultsActivity.class)));
search.setQueryHint(getResources().getString(R.string.search_hint));
return true;
}
И накрая, в нашия клас SearchResultsActivity, в метода onCreate, можем да обработваме резултатите от търсенето:
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
String query = intent.getStringExtra(SearchManager.QUERY);
//use the query to search your data somehow
}
}
Не забравяйте да създадете файла с ресурси searchable.xml
и да добавите SearchView към вашето оформление.
searchable.xml (res/xml/searchable.xml; създайте xml папка под res, ако е необходимо):
<?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"
android:voiceSearchMode="showVoiceSearchButton|launchRecognizer"/>
Оформление (пример за добавяне на SearchView към ActionBar като елемент от менюто):
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
tools:context="com.example.MainActivity">
<group android:checkableBehavior="single">
<item android:id="@+id/action_search" android:title="Search"
android:orderInCategory="1" app:showAsAction="collapseActionView|ifRoom"
app:actionViewClass="android.support.v7.widget.SearchView"/>
</group>
</menu>
Ресурси:
person
chRyNaN
schedule
19.08.2015