Панель действий Android SearchView как автозаполнение?
Я использую SearchView в панели действий. Я хочу использовать функцию автозаполнения в окне поиска для получения результатов из базы данных.
Возможно ли это? Или мне нужно использовать настраиваемое текстовое поле, а затем добавить к нему автозаполнение?
Ответы
Ответ 1
У меня есть пользовательский 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>
Отредактировано:
Пожалуйста, проверьте этот, а ссылка здесь.
Ответ 2
Поэтому мне просто нужно было сделать это для версии v7, и я с ужасом обнаружил, что не могу просто установить адаптер с ArrayAdapter.
Я не хотел использовать стандартный AutoCompleteTextView (как это делает верхний комментарий), потому что тогда вы упускаете ряд привлекательных функций SearchView, таких как маленький значок поиска и кнопка x.
Поэтому я расширил 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);
}
}
Вы можете использовать это в своем меню xml для ActionBar следующим образом:
<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);
}
}
Ответ 3
Здесь альтернативный метод с использованием 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
.
Адаптеру также потребуется настраиваемый макет:
Рез/макет/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:
Рез/меню/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>
Затем создайте настраиваемую для поиска конфигурацию:
Рез/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
, используемая в примерах, должна быть определена в значениях /strings.xml, также не забудьте обновить ссылку на com.example
для вашего проекта.
Здесь исходный учебник для справки:
http://tpbapp.com/android-development/android-action-bar-searchview-tutorial
Ответ 4
Да, это возможно. Создайте таблицу (например, в SQLiteDatabase) для своих предложений и отформатируйте таблицу с необходимыми столбцами.
См. ссылку
Ответ 5
Я также столкнулся с этой проблемой для автоматического полного поиска и исправил его без использования дополнительного макета и автоматического завершения текстового представления, есть класс под названием 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;
}
Нажав на предлагаемый элемент, элемент должен появиться в представлении поиска, поэтому добавьте нижеприведенный код сразу после того, как вы установили адаптер в searchAutoComplete внутри метода onCreateOptionmenu (...)
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();
}
});
Ответ 6
Вы можете сделать это с помощью CursorAdapter через что-то вроде:
MenuItem searchItem = menu.findItem(R.id.action_search);
SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchItem);
searchView.setSuggestionsAdapter(adapter);
Ответ 7
SearchAutoComplete searchAutoComplete = mSearchView.findViewById(androidx.appcompat.R.id.search_src_text);
для версии androidx