古い Android バージョン (2.3.x など) で動作する、アクションバーを使用して listView 項目でフィルターを使用する方法を示す実用的なソリューションがないことに気付きました。
私が見つけた唯一の例は、フラグメントの例のファイル「LoaderCursorSupport.java」にあります。ただし、コードに示すように、searchView を作成できる場合、つまり Android 3.x 以降でのみ機能します。
View searchView=SearchViewCompat.newSearchView(getActivity());
if(searchView!=null)
...
actionBarSherlock のバージョン 4.2でも、上記のバグ (または機能の欠落、どのように見ても) は依然として存在します。
それで、私は自分のソリューションを作成しましたが、これはうまく機能します(公式ライブラリにも私の修正を追加してほしいと思います)が、責任のある editText ビュー内の「x」ボタンを取得する場所がわかりませんテキストのクリア。
ネイティブのルック アンド フィールを取得してコードに正しく配置する方法を教えてください。
これが私が話していることのスクリーンショットです:
この機能を使用したい人のために、ここに私のコードスニペットがあります:
@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);
}