Некоторые Android приложения оперируют большим числом данных, поиск которых обычно осуществляется через действие поиска:
В папке layout создайте xml файл для кнопки, которую нужно поместить в SearchView. Я назвал его search_view_custom_button.xml:
<?xml version="1.0" encoding="utf-8"?>
<ImageButton
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/custom_button"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="center_vertical"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:src="@drawable/custom_button_icon"
android:background="?android:attr/selectableItemBackground"
android:focusable="true"/>
Задайте кнопке id и изображение (src).
Атрибуту android:background задано стандартное значение "?android:attr/selectableItemBackground", которое обеспечивает анимацию нажатия на кнопку в строке поиска.
"Надуйте" экземпляр кнопки из только что созданной разметки:
final ImageButton customButton = (ImageButton) getLayoutInflater().inflate(R.layout.search_view_custom_button, null);
Разметка SearchView имеет следующую структуру:
<LinearLayout android:id="@+id/search_bar">
<TextView android:id="@+id/search_badge/> <ImageView android:id="@+id/search_button"/>
<LinearLayout android:id="@+id/search_edit_frame"
<ImageView android:id="@+id/search_mag_icon"/>
<LinearLayout android:id="@+id/search_plate">
<view class="android.widget.SearchView$SearchAutoComplete"
Добавления этой функциональности в приложение хорошо описано в этих статьях:
Однако, добавление собственных кнопок в SearchView не такая уж и простая задача.
Для этого необходимо:
1. Создать экземпляр кнопки;
2. Найти в разметке SearchView элемент, в который можно поместить кнопку;
3. Поместить кнопку в найденный View.
Разметка кнопки
В папке layout создайте xml файл для кнопки, которую нужно поместить в SearchView. Я назвал его search_view_custom_button.xml:
<?xml version="1.0" encoding="utf-8"?>
<ImageButton
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/custom_button"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="center_vertical"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:src="@drawable/custom_button_icon"
android:background="?android:attr/selectableItemBackground"
android:focusable="true"/>
Задайте кнопке id и изображение (src).
Атрибуту android:background задано стандартное значение "?android:attr/selectableItemBackground", которое обеспечивает анимацию нажатия на кнопку в строке поиска.
Создание экземпляра кнопки
"Надуйте" экземпляр кнопки из только что созданной разметки:
final ImageButton customButton = (ImageButton) getLayoutInflater().inflate(R.layout.search_view_custom_button, null);
Добавление кнопки в SearchView
Разметка SearchView имеет следующую структуру:
<LinearLayout android:id="@+id/search_bar">
<TextView android:id="@+id/search_badge/> <ImageView android:id="@+id/search_button"/>
<LinearLayout android:id="@+id/search_edit_frame"
<ImageView android:id="@+id/search_mag_icon"/>
<LinearLayout android:id="@+id/search_plate">
<view class="android.widget.SearchView$SearchAutoComplete"
android:id="@+id/search_src_text"/>
<ImageView android:id="@+id/search_close_btn"/>
</LinearLayout>
<LinearLayout android:id="@+id/submit_area">
<ImageView android:id="@+id/search_go_btn"/>
<ImageView android:id="@+id/search_voice_btn"
</LinearLayout>
</LinearLayout>
</LinearLayout>
search_plate - Элемент со строкой поиска и кнопкой очистки.
submit_area - Элемент с кнопкой голосового поиска.
Добавить кнопку можно в любую часть разметки. В рамках примера добавим кнопку рядом с кнопкой голосового поиска:
SearchView searchView = (SearchView) menu.findItem(R.id.search).getActionView();
LinearLayout searchViewSubmitArea = (LinearLayout) searchView.findViewById(R.id.submit_area);
searchViewSubmitArea.addView(searchViewCustomButton);
Для корректного отображения кнопки настройте параметры разметки:
searchViewCustomButton.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.MATCH_PARENT));
Готово! Кнопка добавлена прямо в строку поиска:
<ImageView android:id="@+id/search_close_btn"/>
</LinearLayout>
<LinearLayout android:id="@+id/submit_area">
<ImageView android:id="@+id/search_go_btn"/>
<ImageView android:id="@+id/search_voice_btn"
</LinearLayout>
</LinearLayout>
</LinearLayout>
search_plate - Элемент со строкой поиска и кнопкой очистки.
submit_area - Элемент с кнопкой голосового поиска.
Добавить кнопку можно в любую часть разметки. В рамках примера добавим кнопку рядом с кнопкой голосового поиска:
SearchView searchView = (SearchView) menu.findItem(R.id.search).getActionView();
LinearLayout searchViewSubmitArea = (LinearLayout) searchView.findViewById(R.id.submit_area);
searchViewSubmitArea.addView(searchViewCustomButton);
Для корректного отображения кнопки настройте параметры разметки:
searchViewCustomButton.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.MATCH_PARENT));
Готово! Кнопка добавлена прямо в строку поиска:
Привет, но эта кнопка видна только когда отображается Submit Button или Voice search. Как решал ситуацию, когда ни та ни другая не нужна?
ОтветитьУдалить