web-dev-qa-db-ja.com

Android Action Bar SearchView as Autocomplete?

アクションバーでSearchViewを使用しています。検索ビューでオートコンプリート機能を使用して、データベースから結果を取得したい。

これは可能ですか?または、カスタムテキストボックスを使用してからオートコンプリートを追加する必要がありますか?

38
Harsha M V

カスタムAutoCompleteTextViewを使用し、ActionBarに追加しました。

enter image description here

public class MainActivity extends Activity {

    private static final String[] COUNTRIES = new String[] { "Belgium",
            "France", "France_", "Italy", "Germany", "Spain" };

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ActionBar actionBar = getActionBar();
        actionBar.setDisplayHomeAsUpEnabled(true);
        actionBar.setDisplayShowCustomEnabled(true);
        // actionBar.setDisplayShowTitleEnabled(false);
        // actionBar.setIcon(R.drawable.ic_action_search);

        LayoutInflater inflator = (LayoutInflater) this
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View v = inflator.inflate(R.layout.actionbar, null);

        actionBar.setCustomView(v);

        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
                Android.R.layout.simple_dropdown_item_1line, COUNTRIES);
        AutoCompleteTextView textView = (AutoCompleteTextView) v
                .findViewById(R.id.editText1);
        textView.setAdapter(adapter);

    }

}

とあなたのレイアウト:

<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="fill_parent"
    Android:layout_height="fill_parent"
    Android:gravity="center" >

    <TextView
        Android:id="@+id/textView1"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:text="Action Bar:"
        Android:textAppearance="?android:attr/textAppearanceMedium"
        Android:textColor="#FFFFFF" />

    <AutoCompleteTextView
        Android:id="@+id/editText1"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:ems="10"
        Android:imeOptions="actionSearch"
        Android:inputType="textAutoComplete|textAutoCorrect"
        Android:textColor="#FFFFFF" >

        <requestFocus />
    </AutoCompleteTextView>

</LinearLayout>

編集済み:

this とこれを確認してください link 役に立つかもしれません。コードはこちらです。

34
Dhaval Parmar

そのため、v7バージョンではこれを行う必要があり、ArrayAdapterを使用してアダプターを単純に設定することができないことに失望しました。

在庫のAutoCompleteTextViewを使用したくありませんでした(ここのトップコメンターが使用しているように)。これは、小さな検索アイコンやxボタンなど、SearchViewの洗練された機能の多くを見逃しているためです。

だから私はSearchViewを拡張し、これを得た:

public class ArrayAdapterSearchView extends SearchView {

private SearchView.SearchAutoComplete mSearchAutoComplete;

public ArrayAdapterSearchView(Context context) {
    super(context);
    initialize();
}

public ArrayAdapterSearchView(Context context, AttributeSet attrs) {
    super(context, attrs);
    initialize();
}

public void initialize() {
    mSearchAutoComplete = (SearchAutoComplete) findViewById(Android.support.v7.appcompat.R.id.search_src_text);
    this.setAdapter(null);
    this.setOnItemClickListener(null);
}

@Override
public void setSuggestionsAdapter(CursorAdapter adapter) {
    // don't let anyone touch this
}

public void setOnItemClickListener(OnItemClickListener listener) {
    mSearchAutoComplete.setOnItemClickListener(listener);
}

public void setAdapter(ArrayAdapter<?> adapter) {
    mSearchAutoComplete.setAdapter(adapter);
}

public void setText(String text) {
    mSearchAutoComplete.setText(text);
}

}

次のように、ActionBarのメニューxmlでこれを使用できます。

<menu xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:app="http://schemas.Android.com/apk/res-auto" >

<item
    Android:id="@+id/action_search"
    Android:icon="@Android:drawable/ic_menu_add"
    Android:title="TITLE"
    app:actionViewClass="com.yourpackage.ArrayAdapterSearchView"
    app:showAsAction="ifRoom|collapseActionView"/>

</menu>

オートコンプリートリストにクリック機能を追加することもできます(たとえば、テキストをEditTextに設定する)。

MenuItem searchItem = menu.findItem(R.id.action_search);
final ArrayAdapterSearchView searchView = (ArrayAdapterSearchView)searchItem.getActionView();
searchView.setOnItemClickListener(new OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

        searchView.setText(adapter.getItem(position).toString());

    }
});

そして、これは通常の古いAndroid.widget.SearchViewの同様のバージョンです。

public class ArrayAdapterSearchView extends SearchView {

private AutoCompleteTextView mSearchAutoComplete;

public ArrayAdapterSearchView(Context context) {
    super(context);
    initialize();
}

public ArrayAdapterSearchView(Context context, AttributeSet attrs) {
    super(context, attrs);
    initialize();
}

public void initialize() {
    mSearchAutoComplete = (AutoCompleteTextView) findViewById(getResources().getIdentifier("Android:id/search_src_text", null, null));
    setAutoCompleSuggestionsAdapter(null);
    setOnItemClickListener(null);
}

@Override
public void setSuggestionsAdapter(CursorAdapter adapter) {
    throw new UnsupportedOperationException("Please use setAutoCompleSuggestionsAdapter(ArrayAdapter<?> adapter) instead");
}

public void setOnItemClickListener(AdapterView.OnItemClickListener listener) {
    mSearchAutoComplete.setOnItemClickListener(listener);
}

public void setAutoCompleSuggestionsAdapter(ArrayAdapter<?> adapter) {
    mSearchAutoComplete.setAdapter(adapter);
}

public void setText(String text) {
    mSearchAutoComplete.setText(text);
}

}
39
user901309

CursorAdapterを使用する代替方法は次のとおりです。

ExampleActivity.Java

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 cursor = db.rawQuery("SELECT * FROM items", null); // Example database query

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

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

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

        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(cursor.getString(cursor.getColumnIndex("text"))); // Example column index

    }

    @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;

    }

}

注意: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文字列は、values/strings.xmlで定義する必要があります。また、プロジェクトのcom.exampleへの参照。

参照用の元のチュートリアルは次のとおりです。

http://tpbapp.com/Android-development/Android-action-bar-searchview-tutorial

8
tpbapp

はい、可能です。提案用のテーブル(SQLiteDatabaseなど)を構築し、必要な列でテーブルをフォーマットします。

このリンクを参照

6
Arun C

また、オートコンプリート検索ビューでこの問題に直面し、余分なレイアウトとオートコンプリートテキストビューを使用せずに修正しました。SearchAutoCompleteというクラスがあります。これを使用してオートコンプリート機能を実現し、検索ビューで提案する項目のArrayListを含む単純なリストアダプターを配置しました。アダプタをSearchAutoCompleteに設定すると、自動補完機能が動作します。これが私のコードです。カスタムレイアウトを追加する必要はありません。 onCreateOptionsMenu(...)メソッドを私のコードに置き換えるだけです:

    @Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);

MenuItem searchItem = menu.findItem(R.id.search);
SearchView mSearchView = (SearchView) MenuItemCompat.getActionView(searchItem);

SearchAutoComplete searchAutoComplete = (SearchAutoComplete)     mSearchView.findViewById(Android.support.v7.appcompat.R.id.search_src_text);

ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
Android.R.layout.simple_dropdown_item_1line, itemArrayList);
searchAutoComplete.setAdapter(adapter);

SearchManager searchManager =
(SearchManager) getSystemService(this.SEARCH_SERVICE);
mSearchView.setSearchableInfo(
searchManager.getSearchableInfo(getComponentName()));
return true;
}

提案されたアイテムをクリックすると、アイテムが検索ビューに表示されるので、onCreateOptionmenu(...)メソッド内でsearchAutoCompleteにアダプターを設定した直後に以下のコードを追加します。

  searchAutoComplete.setOnItemClickListener(new OnItemClickListener() {

    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position,
    long id) {
    // TODO Auto-generated method stub

    String searchString=(String)parent.getItemAtPosition(position);
    searchAutoComplete.setText(""+searchString);
    Toast.makeText(MainActivity.this, "you clicked "+searchString, Toast.LENGTH_LONG).show();

    }
    });
5
HAXM
    SearchAutoComplete searchAutoComplete = mSearchView.findViewById(androidx.appcompat.R.id.search_src_text);

androidxバージョン用

1
Akgun Studio

次のような方法でCursorAdapterでこれを行うことができます。

MenuItem searchItem = menu.findItem(R.id.action_search);
SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchItem);

searchView.setSuggestionsAdapter(adapter);
1
user901309