Использование собственного внешнего вида searchView для actionBarSherlock в старых версиях Android

Я заметил, что нет рабочего решения, которое показывает, как использовать фильтр для элементов listView с помощью панели действий, которое работает в более старых версиях Android (например, 2.3.x).

Единственный пример, который я нашел, находится в файле «LoaderCursorSupport.java» примера фрагментов. Однако это работает только тогда, когда можно создать searchView, то есть начиная с Android 3.x, как показано в коде:

View searchView=SearchViewCompat.newSearchView(getActivity());
if(searchView!=null)
...    

Вышеупомянутая ошибка (или отсутствующая функция, как ни крути) существует даже в версии 4.2 действияBarSherlock.

Итак, я сделал свое собственное решение, которое отлично работает (и я бы хотел, чтобы официальная библиотека тоже могла добавить к нему мое исправление), но я не знаю, где взять кнопку «x» в представлении editText, которое отвечает за очистка текста.

Может ли кто-нибудь сказать мне, как получить родной внешний вид и правильно поместить его в код?

Вот скриншот того, о чем я говорю:

searchView для новых версий Android

Для тех, кто хочет использовать эту функцию, вот мой фрагмент кода:

@Override
public boolean onCreateOptionsMenu(final com.actionbarsherlock.view.Menu menu)
  {
  getSupportMenuInflater().inflate(R.menu.activity_main,menu);
  _searchMenuItem=menu.findItem(R.id.menu_item_action_search);
  View searchView=SearchViewCompat.newSearchView(this);
  if(searchView!=null)
    SearchViewCompat.setOnQueryTextListener(searchView,new OnQueryTextListenerCompat()
      {
        @Override
        public boolean onQueryTextChange(final String newText)
          {
          _listAdapter.getFilter().filter(newText);
          return true;
          }

        @Override
        public boolean onQueryTextSubmit(final String query)
          {
          return super.onQueryTextSubmit(query);
          }
      });
  else
    {
    searchView=new EditText(this);
    searchView.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.WRAP_CONTENT));
    ((EditText)searchView).setHint(R.string.search);
    ((EditText)searchView).addTextChangedListener(new TextWatcher()
      {
        String curretTextToFilter =null;

        @Override
        public void onTextChanged(final CharSequence newText,final int start,final int before,final int count)
          {
          if(newText==curretTextToFilter)
            return;
          curretTextToFilter=newText.toString();
          _listAdapter.getFilter().filter(curretTextToFilter==null||curretTextToFilter.length()==0 ? null : curretTextToFilter);
          }

        @Override
        public void beforeTextChanged(final CharSequence s,final int start,final int count,final int after)
          {}

        @Override
        public void afterTextChanged(final Editable s)
          {}
      });
    }
  final View finalSearchView=searchView;
  _searchMenuItem.setOnActionExpandListener(new OnActionExpandListener()
    {
      @Override
      public boolean onMenuItemActionExpand(final MenuItem item)
        {
        if(finalSearchView instanceof EditText)
          {
          final InputMethodManager m=(InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
          finalSearchView.requestFocus();
          if(m!=null)
            m.toggleSoftInput(0,InputMethodManager.SHOW_IMPLICIT);
          }
        return true;
        }

      @Override
      public boolean onMenuItemActionCollapse(final MenuItem item)
        {
        if(finalSearchView instanceof EditText)
          ((EditText)finalSearchView).setText(null);
        else _listAdapter.getFilter().filter(null);
        return true;
        }
    });
  _searchMenuItem.setActionView(searchView);
  //
  return true;
  }

@Override
public boolean onKeyUp(final int keyCode,final KeyEvent event)
  {
  if(keyCode==KeyEvent.KEYCODE_SEARCH)
    {
    _searchMenuItem.expandActionView();
    return true;
    }
  return super.onKeyUp(keyCode,event);
  }

person android developer    schedule 17.09.2012    source источник
comment
Ветвь dev имеет SearchView.   -  person Jake Wharton    schedule 17.09.2012
comment
но я пробовал, и это не работает на эмуляторе с версией 2.3.x - нажатие на элемент действия поиска ничего не делает. разве последняя сборка 4.2, как я уже упоминал, не является последней?   -  person android developer    schedule 17.09.2012
comment
@JakeWharton Я думаю, что они обновили его с тех пор, как я попробовал. теперь это работает, но по-прежнему не позволяет иметь тот же стиль (и кнопку X).   -  person android developer    schedule 14.04.2013


Ответы (1)


За исключением кнопки «X», я думаю, что все остальное можно сделать с помощью библиотеки с темой под названием HoloEverywhere.

person android developer    schedule 07.12.2012