1. ホーム
  2. android

[解決済み] アクションバーでのSearchViewの実装

2023-07-17 19:55:07

質問

私は SearchView から arrayList<String> と同じようにドロップダウン・リストに候補を表示します。

を構築する方法をステップバイステップで説明しているチュートリアルを探します。 SearchView を構築する方法をステップバイステップで説明するチュートリアルを探しています。

私が読んだのは ドキュメントを読みました。 を読み、googleの例に従いましたが、私には有用ではありませんでした。

私は、検索を作成しました

<?xml version="1.0" encoding="utf-8"?>

<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/action_search"
          android:title="Search"
          android:icon="@android:drawable/ic_menu_search"
          android:showAsAction="always"
          android:actionViewClass="android.widget.SearchView" />
</menu>`

しかし、文字列の配列のパラメータをどのように設定すればいいのかわかりません。 別のActivityで結果を取得しようとしましたが、うまくいきません。

どのように解決するのですか?

この解決策をまとめるのに時間がかかりましたが、あなたが説明した方法で動作させるには、これが最も簡単な方法であることがわかりました。これを行うにはより良い方法がありますが、アクティビティ コードを投稿していないため、即興で、アクティビティの開始時にこのようなリストを持っていると仮定する必要があります。

private List<String> items = db.getItems();

ExampleActivity.java

private List<String> items;

private Menu menu;

@Override
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public boolean onCreateOptionsMenu(Menu menu) {

    getMenuInflater().inflate(R.menu.example, menu);

    this.menu = menu;

    if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {

        SearchManager manager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);

        SearchView search = (SearchView) menu.findItem(R.id.search).getActionView();

        search.setSearchableInfo(manager.getSearchableInfo(getComponentName()));

        search.setOnQueryTextListener(new OnQueryTextListener() { 

            @Override 
            public boolean onQueryTextChange(String query) {

                loadHistory(query);

                return true; 

            } 

        });

    }

    return true;

}

// History
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
private void loadHistory(String query) {

    if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {

        // Cursor
        String[] columns = new String[] { "_id", "text" };
        Object[] temp = new Object[] { 0, "default" };

        MatrixCursor cursor = new MatrixCursor(columns);

        for(int i = 0; i < items.size(); i++) {

            temp[0] = i;
            temp[1] = items.get(i);

            cursor.addRow(temp);

        }

        // SearchView
        SearchManager manager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);

        final SearchView search = (SearchView) menu.findItem(R.id.search).getActionView();

        search.setSuggestionsAdapter(new ExampleAdapter(this, cursor, items));

    }

}

ここで CursorAdapter :

ExampleAdapter.java

public class ExampleAdapter extends CursorAdapter {

    private List<String> items;

    private TextView text;

    public ExampleAdapter(Context context, Cursor cursor, List<String> items) {

        super(context, cursor, false);

        this.items = items;

    }

    @Override
    public void bindView(View view, Context context, Cursor cursor) {

        text.setText(items.get(cursor.getPosition()));

    }

    @Override
    public View newView(Context context, Cursor cursor, ViewGroup parent) {

        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        View view = inflater.inflate(R.layout.item, parent, false);

        text = (TextView) view.findViewById(R.id.text);

        return view;

    }

}

より良い方法は、リストデータがデータベースからのものである場合、リストデータに Cursor に直接渡すことができます。 ExampleAdapter にカラムテキストを表示し、関連するカラムセレクタを使用します。 TextView に表示します。

注意: インポートする際に CursorAdapter をインポートする場合は、Android サポート版をインポートせず、標準の android.widget.CursorAdapter をインポートしてください。

また、このアダプタはカスタムレイアウトを必要とします。

res/layout/item.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">

    <TextView
        android:id="@+id/item"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</RelativeLayout>

レイアウトにテキストや画像のビューを追加して、アダプタでデータを投入することで、リスト項目をカスタマイズできるようになりました。

これですべてなはずですが、まだやっていない場合はSearchViewメニュー項目が必要です。

res/menu/example.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android">

    <item
        android:id="@+id/search"
        android:title="@string/search"
        android:showAsAction="ifRoom"
        android:actionViewClass="android.widget.SearchView" />

</menu>

次に、検索可能な設定を作成します。

res/xml/searchable.xml

<searchable xmlns:android="http://schemas.android.com/apk/res/android"
    android:label="@string/search"
    android:hint="@string/search" >
</searchable>

最後に、マニフェスト・ファイルの関連するアクティビティ・タグの中にこれを追加します。

AndroidManifest.xml

<intent-filter>
    <action android:name="android.intent.action.SEARCH" />
</intent-filter>

<meta-data
    android:name="android.app.default_searchable"
    android:value="com.example.ExampleActivity" />
<meta-data
    android:name="android.app.searchable"
    android:resource="@xml/searchable" />

注意 @string/search の文字列は 値/文字列.xml への参照を更新することも忘れないでください。 com.example への参照を更新することも忘れないでください。