Подтвердить что ты не робот

Пример 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(). Означает ли это, что выполнить поиск невозможно?

4b9b3361

Ответ 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);