ActionBarsherlock searchview: setOnQueryTextListener
Я пытаюсь создать фильтр в списке, используя вид поиска ActionBarSherlock. Код, который у меня есть, следующий:
@Override
public boolean onCreateOptionsMenu(final Menu menu) {
getSupportMenuInflater().inflate(R.menu.building_search, menu);
SearchView searchView = new SearchView(getSupportActionBar().getThemedContext());
SearchView.OnQueryTextListener queryTextListener = new SearchView.OnQueryTextListener()
{
public boolean onQueryTextChange(String newText)
{
// this is your adapter that will be filtered
listAdapter.getFilter().filter(newText);
return true;
}
public boolean onQueryTextSubmit(String query)
{
// this is your adapter that will be filtered
listAdapter.getFilter().filter(query);
return true;
}
};
searchView.setOnQueryTextListener(queryTextListener);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.search:
onSearchRequested();
return true;
}
return super.onOptionsItemSelected(item);
}
Это мой импорт:
import android.os.Bundle;
import android.widget.AbsListView;
import android.widget.ArrayAdapter;
import be.ugent.zeus.hydra.AbstractSherlockActivity;
import be.ugent.zeus.hydra.R;
import be.ugent.zeus.hydra.data.caches.AssociationsCache;
import com.actionbarsherlock.view.Menu;
import com.actionbarsherlock.view.MenuItem;
import com.actionbarsherlock.widget.SearchView;
import com.dd.plist.NSArray;
import com.dd.plist.NSDictionary;
import com.dd.plist.NSString;
import com.dd.plist.XMLPropertyListParser;
import com.emilsjolander.components.stickylistheaders.StickyListHeadersListView;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.logging.Level;
import java.util.logging.Logger;
Большинство из них работает: в моей панели действий я получаю значок поиска, который можно щелкнуть и расширяет поиск. То, что, однако, не работает, является фактическим слушателем. Я поставил точки останова в обоих методах, но когда я отлаживаю, ничего не происходит. Программа не разбивается, и ничто не фильтруется, и я не могу понять, почему.
Есть ли у кого-нибудь идеи?
Спасибо заранее.
Ответы
Ответ 1
Поскольку каждый другой ответ содержал немного правды, но не полностью ответил на вопрос, я создам свой собственный ответ.
Когда эта проблема была создана - полгода назад - ABS не полностью реализовала функциональность SearchView. Начиная с ABS 4.2.0, это было реализовано.
Моя полная реализация, следуя образцу приложения ABS, можно найти здесь.
Ответ 2
Вот как я реализовал свой поиск с помощью ActionBarSherlock:
В menu.xml в папке res/menu я добавил значок:
<item android:id="@+id/search"
android:title="@string/search_title"
android:icon="@drawable/ic_search"
android:showAsAction="collapseActionView|ifRoom"
android:actionViewClass="com.actionbarsherlock.widget.SearchView"/>
Затем я создал класс, который отвечает за получение запросов поиска действий и представление данных:
public class SearchActivity extends SherlockFragmentActivity{
@Override
protected void onCreate(Bundle savedInstanceState) {
Log.d(TAG, "This is the search view activity");
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.search_result_layout);
}
private void handleIntent(Intent intent){
if(Intent.ACTION_SEARCH.equals(intent.getAction())){
searcdhQuery = intent.getStringExtra(SearchManager.QUERY);
//here we shall do e search..
Log.d(TAG, "This is the search query:" + searcdhQuery);
//This is the asynctask query to connect to the database...
String[] value = {searcdhQuery};
SearchQuery searchQuery = new SearchQuery();
searchQuery.execute(value);
}
}
@Override
protected void onNewIntent(Intent intent) {
// TODO Auto-generated method stub
super.onNewIntent(intent);
handleIntent(intent);
}
}
В манифесте эта активность включена в фильтры поиска и просмотра, как показано ниже:
<activity android:name=".SearchActivity"
android:launchMode="singleTop">
<intent-filter>
<action android:name="android.intent.action.SEARCH" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW" />
</intent-filter>
<meta-data
android:name="android.app.searchable"
android:resource="@xml/searchable"/>
</activity>
Также в манифесте не забывайте метаданные в приложении, показывающие поиск по умолчанию активности, как показано ниже:
<meta-data android:name="android.app.default_searchable"
android:value=".SearchActivity" />
Наконец, в onCreateOptionsMenu не забудьте добавить конфигурацию поиска, связав ее с службой поиска:
//associating the searchable configuration with the search service...
SearchManager searchManager = (SearchManager)getSystemService(Context.SEARCH_SERVICE);
SearchView searchView = (SearchView)menu.findItem(R.id.search).getActionView();
searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
В методе onOptionsItemSelected ничего не требуется.
Это отлично сработало для меня. Если вам нужна дополнительная информация, пожалуйста, найдите дополнительную информацию из Поиск в режиме просмотра в actionBarSherlock и руководство для разработчиков по настройке интерфейса поиска.
Надеюсь, это поможет.
Ответ 3
Если вы не нашли ответа, вот как я это делаю (я использую ActionBarSherlock):
-
добавить запись в декларацию меню
<item android:id="@+id/menu_search"
android:actionViewClass="com.actionbarsherlock.widget.SearchView"
android:icon="@drawable/wfm_menu_search"
android:showAsAction="always|withText|collapseActionView"
android:title="@string/menu_search"/>
-
В вашей деятельности переопределите "onCreateOptionsMenu", чтобы раздуть ваше меню и связать ваш SearcView:
public boolean onCreateOptionsMenu(final Menu menu) {
getSupportMenuInflater().inflate(R.menu.main_menu, menu);
this.refreshMenuItem = menu.findItem(R.id.menu_refresh);
this.searchView = (SearchView) menu.findItem(R.id.menu_search).getActionView();
this.searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
// collapse the view ?
menu.findItem(R.id.menu_search).collapseActionView();
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
// search goes here !!
// listAdapter.getFilter().filter(query);
return false;
}
});
Что это, никаких других действий. Надеюсь, вы сочтете это полезным.
Ответ 4
Это ваш полный код? Прямо сейчас в onCreateOptionsMenu
вы создаете SearchView
и назначаете ему OnQueryTextListener
, но это все, что вы с ним делаете. Я не вижу в вашем коде, где вы добавляете этот SearchView
в завышенное меню.
Как вы говорите, вы видите виджет на экране, я предполагаю, что вы указали виджет в файле R.menu.building_search
, и в этом случае вы должны искать этот виджет (на котором нет установленного на нем слушателя поэтому никаких действий не выполняется), а не объявлять новый (который не будет взаимодействовать с пользователем):
SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
SearchView searchView = (SearchView) menu.findItem(R.id.menu_search).getActionView();
(Это из руководства по поиску на сайте разработчика Android, если я не ошибаюсь, это также должно работать и для ActionBarSherlock).