の で を使用してSearchView
いActionBar
ますListView
。虫めがねに触れると、SearchView
その編集ボックスが表示され、ユーザーはリストのコンテンツをフィルタリングするためのテキストを入力できます。それはほとんど動作します。ただし、ユーザーが [上へ] ボタンを押すSearchView
と、アイコンが折りたたまれて戻り、ウィジェット内のテキストがクリアされ、フィルタリングがリセットされます。SearchView
(私の場合)効果は、がアイコン化されていない場合にのみリストをフィルタリングできることです。SearchView
必要な動作は、が折りたたまれた後もフィルター テキストを保持することです。
注意: Android 4.3 で動作が変更された可能性があります。4.2.2 では、希望どおりに動作しました。以下の観察を参照してください。
詳細:具体的には、メニューには次の項目が含まれます。
<item android:id="@+id/menu_search_customers"
android:title="@string/menu_search_text"
android:icon="@android:drawable/ic_menu_search"
android:showAsAction="ifRoom|collapseActionView"
android:actionViewClass="android.widget.SearchView" />
アイコンと に注意してくださいandroid:showAsAction
。展開すると、デフォルトでUpボタンが表示されると思いますSearchView
(Upとは、アイコンとアイコンを意味します-公式のNavigation with Back and Up<
のブルーブックの右の画像を参照してください)。デフォルトのハンドラーの実装は、展開されたものを折りたたむだけのようです(アイコンの状態に戻ります)。SearchView
デバッグ中に、 UponQueryTextChange()
を使用すると が空のテキストで起動されることがわかりました。(Android 4.2.2 には当てはまらないと思います。OS の更新前は希望どおりに機能していたからです。)これが、リスト項目のフィルタリングもリセットされる理由です。以下を参照してください。折りたたまれ、フィルタ テキストがアクション バーにサブタイトルとして表示されます。onQueryTextChange()
SearchView
これまでのところ、に関連する私のコードはSearchView
次のようになります。
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// MenuInflater adds the magnifying glass icon for the SearchView
// to the ActionBar as the always visible menu item.
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.customers_menu, menu);
// Get the related SearchView widget.
SearchView sv = (SearchView) menu.findItem(R.id.menu_search_customers)
.getActionView();
// Get the changes immediately.
sv.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
// I am not sure whether the onQueryTextSubmit() is important
// for the purpose.
@Override
public boolean onQueryTextSubmit(String query) {
getActionBar().setSubtitle(mCurFilter);
return true;
}
@Override
public boolean onQueryTextChange(String newText) {
// The newText is stored into a member variable that
// is used when the new CursorLoader is created.
mCurFilter = newText;
getActionBar().setSubtitle(mCurFilter);
getLoaderManager().restartLoader(0, null,
CustomersOverviewActivity.this);
return true;
}
});
return true;
}
再起動されたローダーは、onCreateLoader
. mCurFilter
が SQL クエリの作成に使用されていることに注意してください。
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
String[] projection = { CustomerTable._ID,
CustomerTable.CODE,
CustomerTable.NAME,
CustomerTable.STREET,
CustomerTable.TOWN };
String selection = null; // init
String[] selectionArgs = null; // init
if ( ! mCurFilter.isEmpty()) {
selection = CustomerTable.NAME + " like ?";
selectionArgs = new String[]{ "%" + mCurFilter +"%" };
}
CursorLoader cursorLoader = new CursorLoader(this,
DemoContentProvider.CUSTOMERS_CONTENT_URI, projection,
selection, selectionArgs,
orderInfo);
return cursorLoader;
}
が呼び出される前に上が押されたときの状況を検出したいと思います。このようにして (たとえば) フラグを設定し、空のコンテンツによって割り当てをブロックすることができます。また、検索アイコンが再び展開されたときに、表示される前に展開されたテキストを初期化したいと思います(つまり、展開されたビューはフィルターテキストで事前設定されています)。それはどのように行うことができますか?onQueryTextChange()
mCurFilter
SearchView
SearchView
mCurFilter
更新: hadの以前の実装SearchView
...
@Override
public void onActionViewCollapsed() {
clearFocus();
updateViewsVisibility(true);
mQueryTextView.setImeOptions(mCollapsedImeOptions);
mExpandedInActionView = false;
}
今、それは含まれています...
@Override
public void onActionViewCollapsed() {
setQuery("", false);
clearFocus();
updateViewsVisibility(true);
mQueryTextView.setImeOptions(mCollapsedImeOptions);
mExpandedInActionView = false;
}
クエリを空の文字列に設定する理由を知っていますか? 新しい実装を古いコードでオーバーライドする必要がありますか? それとももっと良い方法がありますか?