20

私のアプリケーションは、現在、左側にListFragment、右側にDetailsFragment(以下のタブレットのレイアウトに似ています)という設定があります。私は(ListFragmentで)検索語が提出された検索ウィジェットは、リストの内容を更新する必要があります持っているアクションバーでAndroid Actionbar検索ウィジェットの実装ListFragment

layout

。 android dev(http://developer.android.com/guide/topics/search/search-dialog.html)の検索ガイドに従っていますが、同じアクティビティでリストを更新するための検索に問題があります。

検索用語が送信されたときに新しいアクティビティを呼び出すことで、実装の一部を動作させることができましたが、これはバックボタンが奇妙に動作する(つまり、戻るボタンを押しても検索ウィジェットで前のアクティビティに移動します検索語を表示する)。

<intent-filter> 
     <action android:name="android.intent.action.SEARCH" /> 
    </intent-filter> 
    <meta-data android:name="android.app.searchable" 
       android:resource="@xml/searchable"/> 

を次のように私はマニフェストに意図行を追加しているが、現在の活動のリストを更新するための検索ウィジェットを取得することが可能ですか?

答えて

46

はい、実際のところ、それは「通常の」ユースケースです。あなたが覚えておかなければならないのは、検索アクションバーウィジェットを使用するフラグメントは、ウィジェットがそのフラグメントと共に破壊されるため、一般的にそれを登録する部分でなければならないということです。

をご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

+0

ありがとうございました詳細な説明をいただきありがとうございます。私は数日後に実装を試み、問題があるかどうかをお知らせします。 – bencallis

+0

ありがとうございました非常に有益な答えを働いています。私が思っていたことの一つは、アプリケーションでは、デフォルトでは、カテゴリを表す3つのタブがあり、これらのタブを削除したいと思っています。ユーザーが検索を終了(戻る)してタブを追加し直します。 – bencallis

+0

@bencallis SearchViewでsetOnCloseListener(SearchView.OnCloseListener listener)を使用したいと思っています。 – ckozl

関連する問題