Я заметил, что нет рабочего решения, которое показывает, как использовать фильтр для элементов listView с помощью панели действий, которое работает в более старых версиях Android (например, 2.3.x).
Единственный пример, который я нашел, находится в файле «LoaderCursorSupport.java» примера фрагментов. Однако это работает только тогда, когда можно создать searchView, то есть начиная с Android 3.x, как показано в коде:
View searchView=SearchViewCompat.newSearchView(getActivity());
if(searchView!=null)
...
Вышеупомянутая ошибка (или отсутствующая функция, как ни крути) существует даже в версии 4.2 действияBarSherlock.
Итак, я сделал свое собственное решение, которое отлично работает (и я бы хотел, чтобы официальная библиотека тоже могла добавить к нему мое исправление), но я не знаю, где взять кнопку «x» в представлении editText, которое отвечает за очистка текста.
Может ли кто-нибудь сказать мне, как получить родной внешний вид и правильно поместить его в код?
Вот скриншот того, о чем я говорю:
Для тех, кто хочет использовать эту функцию, вот мой фрагмент кода:
@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);
}
dev
имеетSearchView
. - person Jake Wharton   schedule 17.09.2012