Пример android.support.v4.widget.SearchViewCompat?
Я пытаюсь использовать SearchViewCompat
с ActionBarSherlock
в приложении API 8.
public boolean onCreateOptionsMenu(Menu menu) {
MenuItem item = menu.add("Search")
.setIcon(isLight ? R.drawable.ic_search_inverse : R.drawable.ic_search)
.setActionView(R.layout.collapsible_edittext);
item.setShowAsAction(
MenuItem.SHOW_AS_ACTION_ALWAYS |
MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW);
// To use SearchViewCompat, I need to add it to the Menu item as well:
View searchView = SearchViewCompat.newSearchView(this);
// ...
SearchViewCompat.setOnQueryTextListener(...);
// ...
item.setActionView(searchView);
Обратите внимание, что и верхний, и нижний код необходимо вызвать setActionView()
. Означает ли это, что выполнить поиск невозможно?
Ответы
Ответ 1
Если вы используете библиотеку ActionBarSherlock версии 4.2, вы можете заменить виджет ViewView API 11 виджета SearchBarSherlock SearchView, чтобы сделать его обратно совместимым:
search.xml
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/menu_search"
android:icon="@drawable/ic_action_search"
android:title="@string/description_search"
android:orderInCategory="0"
android:actionViewClass="com.actionbarsherlock.widget.SearchView"
android:showAsAction="ifRoom|collapseActionView" />
</menu>
Класс действия
//IMPORTANT!!!
import com.actionbarsherlock.widget.SearchView;
...
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
getSupportMenuInflater().inflate(R.menu.search, menu);
setupSearchMenuItem(menu);
return true;
}
private void setupSearchMenuItem(Menu menu) {
MenuItem searchItem = menu.findItem(R.id.menu_search);
if (searchItem != null) {
SearchView searchView = (SearchView) searchItem.getActionView();
if (searchView != null) {
SearchManager searchManager =
(SearchManager) getSystemService(SEARCH_SERVICE);
searchView.setSearchableInfo(
searchManager.getSearchableInfo(getComponentName()));
}
}
}
}
Ответ 2
В чем проблема? SearchViewCompat
вернет null
для устройств pre-HC, поскольку виджет SearchView
не существует. Это означает, что вам нужно будет предоставить свое собственное пользовательское представление действий, которое имитирует HC SearchView.
Вы также можете заархивировать компонент SearchView
из источников Android и использовать его.
В противном случае вы можете просто использовать существующие интерфейсы поиска Android, и в этом случае для устройств HC + вы используете представление действия для выполнения поиска, но на устройствах Froyo и Gingerbread пользователь нажимает на значок поиска, а панель поиска оживляет от верх.
Надеюсь, что это поможет.
Ответ 3
В какой-то момент вашей деятельности:
public class HomeActivity extends SherlockFragmentActivity implements
SearchView.OnQueryTextListener {
// ...
SearchView searchView = (com.actionbarsherlock.widget.SearchView)
actionBarCustom.findViewById(R.id.search);
SearchManager sm = (SearchManager)getSystemService(SEARCH_SERVICE);
searchView.setSearchableInfo(sm.getSearchableInfo(getComponentName()));
searchView.setSubmitButtonEnabled(true);
searchView.setOnQueryTextListener(this);
И затем отфильтруйте свой адаптер списка:
@Override
public boolean onQueryTextSubmit(String query) {
return true;
}
@Override
public boolean onQueryTextChange(String newText) {
mAdapter.getFilter().filter(newText.trim());
return false;
}
Таким образом, ваш адаптер списка должен реализовывать фильтрацию.
Ответ 4
Лучше использовать MenuItemCompat, я думаю, что это полезно для вас
getMenuInflater().inflate(R.menu.main, menu);
MenuItem searchItem = menu.findItem(R.id.search);
SearchManager searchManager =(SearchManager)getSystemService(Context.SEARCH_SERVICE);
SearchView searchView = (SearchView)MenuItemCompat.getActionView(searchItem);
SearchableInfo info = searchManager.getSearchableInfo(getComponentName());
searchView.setSearchableInfo(info);