#android #android-actionbar #searchview
#Android #android-панель действий #searchview
Вопрос:
Я внедряю SearchView. Я успешно добавил вид поиска и все его функциональные возможности. Теперь я хочу, чтобы это выглядело великолепно.
Мне нужны два изменения, я пробовал все, но у меня ничего не получалось :
- Я хочу изменить значок поиска.
- Я хочу удалить дополнительный интервал в левой части SearchView.
Вот как в настоящее время выглядит мой SearchView:
И вот что я хочу сделать
menu/menu_search_action.xml
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
tools:context=".MainActivity">
<item
android:id="@ id/action_search"
android:icon="@drawable/location_icon"
android:orderInCategory="100"
android:title="@string/action_search"
app:actionViewClass="android.support.v7.widget.SearchView"
app:showAsAction="always|collapseActionView" />
SearchCategoriesActivity.java
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.menu_search_action, menu);
MenuItem searchItem = menu.findItem(R.id.action_search);
searchItem.expandActionView();
MenuItemCompat.setOnActionExpandListener(searchItem, new MenuItemCompat.OnActionExpandListener() {
@Override
public boolean onMenuItemActionExpand(MenuItem item) {
return true;
}
@Override
public boolean onMenuItemActionCollapse(MenuItem item) {
//DO SOMETHING WHEN THE SEARCHVIEW IS CLOSING
back();
return false;
}
});
SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
searchView = (SearchView) MenuItemCompat
.getActionView(searchItem);
if (searchView != null) {
searchView.setSearchableInfo(searchManager
.getSearchableInfo(getComponentName()));
searchView.setIconifiedByDefault(false);
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
callSearch(query);
return true;
}
@Override
public boolean onQueryTextChange(String newText) {
callSearch(newText);
return true;
}
});
}
for (TextView textView : findChildrenByClass(searchView, TextView.class)) {
textView.setTextColor(Color.WHITE);
}
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
back();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
@Override
public void onBackPressed() {
back();
}
private void back() {
finish();
}
public static <V extends View> Collection<V> findChildrenByClass(
ViewGroup viewGroup, Class<V> clazz) {
return gatherChildrenByClass(viewGroup, clazz, new ArrayList<V>());
}
private static <V extends View> Collection<V> gatherChildrenByClass(
ViewGroup viewGroup, Class<V> clazz, Collection<V> childrenFound) {
for (int i = 0; i < viewGroup.getChildCount(); i ) {
final View child = viewGroup.getChildAt(i);
if (clazz.isAssignableFrom(child.getClass())) {
childrenFound.add((V) child);
}
if (child instanceof ViewGroup) {
gatherChildrenByClass((ViewGroup) child, clazz, childrenFound);
}
}
return childrenFound;
}
Ответ №1:
Добавьте отдельный Theme
, как показано ниже, для изменения значка поиска.
<style name="AppTheme.SearchView" parent="Widget.AppCompat.SearchView">
<item name="searchIcon">@mipmap/ic_search_white</item>
<item name="closeIcon">@mipmap/ic_clear_white</item>
</style>
Внутри вашего Base Theme
<!-- Base application theme. -->
<style name="MyMaterialTheme.Base" parent="Theme.AppCompat.Light.DarkActionBar">
<item name="searchViewStyle">@style/AppTheme.SearchView</item>
</style>
Комментарии:
1. Это отлично работает! спасибо за это. как насчет полей? Если у вас есть что-нибудь для решения этой проблемы с полями, это будет здорово.
2. Полезно знать. Я посмотрю, что я могу сделать.
Ответ №2:
Дополнительное пространство между navigationBackButton и SearchView можно удалить, добавив app:contentInsetStartWithNavigation="0dp"
на панель инструментов.
<androidx.appcompat.widget.Toolbar
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
app:contentInsetStartWithNavigation="0dp" />
Ответ №3:
программно установите максимальную ширину для SearchView в onCreateOptionsMenu()
@override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.menu_search, menu);
SearchView searchView = (SearchView)menu.findItem(R.id.menu_search).getActionView();
searchView.setMaxWidth(Integer.MAX_VALUE);
Для людей, использующих Kotlin
searchview.maxWidth = Integer.MAX_VALUE