1. ホーム
  2. java

[解決済み] フラグメントを用いたAndroid検索

2022-04-24 10:10:52

質問

どなたか、標準的な実装方法のチュートリアルや例をご存じないでしょうか? Android検索インターフェース Fragment s? 言い換えれば、標準的な検索に SearchManager をFragmentに含めることはできますか?

解決方法は?

要するに、無理なんです。の中に検索インターフェイスを作るのは、いくつかの理由があります。 Fragment は不可能です。

  1. 検索可能なインターフェイスを作成する場合、Android マニフェストでデフォルトの "検索可能なアクティビティ" を指定する必要があります。ご存じだと思いますが Fragment は、親である Activity ということで、この分離は不可能です。

  2. もし、あなたがすでに1について理解しているのであれば、この質問をしたのは、何か魔法のようなハックがあるのではないかと期待してのことでしょう。しかし、ドキュメントには次のように書かれています。

    ユーザが検索ダイアログやウィジェットで検索を実行すると、その検索結果をもとに システムは、検索可能なアクティビティを開始し、そのアクティビティに検索結果を配信します。 クエリを、ACTION_SEARCH アクションを持つインテントに格納します。検索可能な アクティビティは、インテントのQUERYエクストラからクエリを取得し、次に を検索し、結果を表示します。

    検索結果を提供する基礎となる内部システムでは、検索結果を表示するために Activity ではなく Fragment このため,検索インターフェースは Activity を変更する必要があるため、不可能です。 基礎となるシステムそのもの . のソースコードを確認してください。 SearchableInfo クラスがあります。)

とはいえ、あなたが説明しているようなことを実現するのは、それほど難しいことではなさそうです。たとえば、searchable-Activity を実装して、その中で android.intent.action.SEARCH インテントを作成し、(結果を直ちに ListView は、検索クエリをあなたの Fragment s. 例えば、次のような検索可能なActivityを考えてみましょう。

public class SearchableActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        if (Intent.ACTION_SEARCH.equals(getIntent().getAction())) {
          String query = intent.getStringExtra(SearchManager.QUERY);
          doMySearch(query);
        }
    }

    /**
     * Performs a search and passes the results to the container
     * Activity that holds your Fragments.
     */
    public void doMySearch(String query) {
        // TODO: implement this
    }
}

検索要求があると、システムは検索可能なアクティビティを起動し、クエリを実行し、その結果をコンテナアクティビティに渡します(コンテナアクティビティには doMySearch ). コンテナアクティビティは、これらの結果を、含まれる検索可能な Fragment で、その結果が表示されます。この実装は、おそらくあなたが期待していたものより少し作業が必要ですが、よりモジュール化できる方法があると思いますし、これがあなたのできる最善の方法のように思われます。

p.s. このアプローチを使用する場合、バックスタックに追加/削除されるアクティビティに特別な注意を払う必要があるかもしれません。これを見てください。 ポスト をご覧ください。

p.p.s. 標準の検索インターフェースを完全に忘れて Fragment で説明されているように 以下のRaghavの投稿 .