はい、実際のところ、それは「通常の」ユースケースです。あなたが覚えておかなければならないのは、検索アクションバーウィジェットを使用するフラグメントは、ウィジェットがそのフラグメントと共に破壊されるため、一般的にそれを登録する部分でなければならないということです。
をごListFragment
、同じListFragment
内オーバーライドすることで、あなたのオプションメニューを作成
@Override
public void onActivityCreated(Bundle savedInstanceState) {
..
setHasOptionsMenu(true);
..
}
...あなたがオプションメニュー項目を持っていることが知られてみましょうに:ここでは
は、それを適切にタイアップする方法ですコールバック、SearchViewウィジェットリファレンスを取得したら、QueryTextListenerコールバックを登録します。
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.grid_default, menu);
SearchView searchView = (SearchView)menu.findItem(R.id.grid_default_search).getActionView();
searchView.setOnQueryTextListener(queryListener);
}
earchがウィジェットをプログラム(Java)のいずれかを経由または宣言(XML)ここで(上から名付けgrid_default.xml、)XMLです:バックで今
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/grid_default_search"
android:icon="@android:drawable/ic_menu_search"
android:title="search"
android:showAsAction="always"
android:actionViewClass="android.widget.SearchView"
/>
<!-- other items or whatever -->
</menu>
ごListFragment
あなたは私たちが上記の登録queryListener
を作成する必要があります。
private String grid_currentQuery = null; // holds the current query...
final private OnQueryTextListener queryListener = new OnQueryTextListener() {
@Override
public boolean onQueryTextChange(String newText) {
if (TextUtils.isEmpty(newText)) {
getActivity().getActionBar().setSubtitle("List");
grid_currentQuery = null;
} else {
getActivity().getActionBar().setSubtitle("List - Searching for: " + newText);
grid_currentQuery = newText;
}
getLoaderManager().restartLoader(0, null, MyListFragment.this);
return false;
}
@Override
public boolean onQueryTextSubmit(String query) {
Toast.makeText(getActivity(), "Searching for: " + query + "...", Toast.LENGTH_SHORT).show();
return false;
}
};
私の例ではデータベースが小さく、結果が速かったためにキーが押されたときに再クエリを実行していましたが、これを変更する必要があります。私はちょうどウィジェットの現在のテキストにListFragment
の中にプライベートクラスのフィールドを設定するためにウィジェットを使用していることに気づくでしょうCHウィジェット(grid_currentQuery
)、その後、私はちょうど私のonCreateLoader
の内側に、私はちょうど私がこのように使用したクエリ更新していますgetLoaderManager().restartLoader(0, null, MyListFragment.this);
呼び出しています:
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle bargs) {
String sort = "SortColumn ASC";
String[] grid_columns = new String[] { "ColumnA", "ColumnB", "Etc..." };
String grid_whereClause = "ColumnToSearchBy LIKE ?"
if (!TextUtils.isEmpty(grid_currentQuery)) {
return new CursorLoader(getActivity(), DataProvider.CONTENT_URI, grid_columns, grid_whereClause, new String[] { grid_currentQuery + "%" }, sort);
}
return new CursorLoader(getActivity(), DataProvider.CONTENT_URI, grid_columns, null, null, sort);
}
をし、それはあなたが本当に行うために必要なすべてのですが、私はこれはみじん切りのようなものであると認識しgetLoaderManager().initLoader(0, null, this);
と、処理する必要のあるローダーコールバックの残りの部分を使用して、最初にローダーを起動するアダプターを設定する必要があるため、これは次のようなものです。しかし、あなたはあなたのListActivity
sおよびListFragments
秒でLoaderManager
Sを使用して(、アンドロイドの人々によって前方設定のベストプラクティスに従っている場合、それはあなたのためにかなり簡単なはず...
私は、これは明確化のためにお気軽に役に立てば幸いコメントが必要な場合は-ck
ありがとうございました詳細な説明をいただきありがとうございます。私は数日後に実装を試み、問題があるかどうかをお知らせします。 – bencallis
ありがとうございました非常に有益な答えを働いています。私が思っていたことの一つは、アプリケーションでは、デフォルトでは、カテゴリを表す3つのタブがあり、これらのタブを削除したいと思っています。ユーザーが検索を終了(戻る)してタブを追加し直します。 – bencallis
@bencallis SearchViewでsetOnCloseListener(SearchView.OnCloseListener listener)を使用したいと思っています。 – ckozl