アクションバーでSearchViewを使用しています。検索ビューでオートコンプリート機能を使用して、データベースから結果を取得したい。
これは可能ですか?または、カスタムテキストボックスを使用してからオートコンプリートを追加する必要がありますか?
カスタムAutoCompleteTextViewを使用し、ActionBarに追加しました。
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 役に立つかもしれません。コードはこちらです。
そのため、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);
}
}
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
はい、可能です。提案用のテーブル(SQLiteDatabaseなど)を構築し、必要な列でテーブルをフォーマットします。
また、オートコンプリート検索ビューでこの問題に直面し、余分なレイアウトとオートコンプリートテキストビューを使用せずに修正しました。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();
}
});
SearchAutoComplete searchAutoComplete = mSearchView.findViewById(androidx.appcompat.R.id.search_src_text);
androidxバージョン用
次のような方法でCursorAdapterでこれを行うことができます。
MenuItem searchItem = menu.findItem(R.id.action_search);
SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchItem);
searchView.setSuggestionsAdapter(adapter);