Я пытаюсь изменить рисование, которое находится в виджете Searchview панели действий Android.
На данный момент это выглядит так:
но мне нужно изменить синий фон на красный цвет.
Я пробовал много чего, кроме собственного виджета поиска, но ничего не работает.
Может ли кто-нибудь указать мне правильное направление, чтобы изменить это?
SearchView
фоном, потому что он недоступен черезR.styleable
. В моем ответе ниже описано, как это сделать в коде.Ответы:
вступление
К сожалению, нет способа установить
SearchView
стиль текстового поля с использованием тем, стилей и наследования в XML, как это можно сделать с фоном элементов в раскрывающемся списке ActionBar . Это происходит потому , чтоselectableItemBackground
перечислено как styleable дюймаR.stylable
, в то время какsearchViewTextField
(атрибут темы , что мы заинтересованы в) нет. Таким образом, мы не можем легко получить к нему доступ из ресурсов XML (вы получитеNo resource found that matches the given name: attr 'android:searchViewTextField'
об ошибке).Установка фона текстового поля SearchView из кода
Итак, единственный способ правильно заменить фон
SearchView
текстового поля - это проникнуть внутрь его, получить доступ к представлению, для которого задан фон,searchViewTextField
и установить собственный.ПРИМЕЧАНИЕ. Приведенное ниже решение зависит только от id (
android:id/search_plate
) элемента внутриSearchView
, поэтому оно более не зависит от версии SDK, чем обход дочерних элементов (например, использованиеsearchView.getChildAt(0)
для перехода к нужному виду внутриSearchView
), но оно не является пуленепробиваемым. Особенно, если какой-то производитель решит доработать внутренностиSearchView
а элемент с указанным выше идентификатором отсутствует - код не будет работать.В SDK фон для текстового поля
SearchView
объявлен с помощью девяти патчей , поэтому мы сделаем это так же. Вы можете найти оригинальный PNG изображение в вытяжке-MDPI каталоге репозитория Android мерзавца . Нас интересуют два изображения. Один для состояния, когда выбрано текстовое поле (с именем textfield_search_selected_holo_light.9.png ), а другой для того, где его нет (с именем textfield_search_default_holo_light.9.png ).К сожалению, вам придется создавать локальные копии обоих изображений, даже если вы хотите настроить только сфокусированное состояние. Это потому, что
textfield_search_default_holo_light
его нет в R.drawable . Таким образом, к нему нелегко получить доступ@android:drawable/textfield_search_default_holo_light
, который можно использовать в селекторе, показанном ниже, вместо ссылки на локальный drawable.ПРИМЕЧАНИЕ. Я использовал тему Holo Light в качестве основы, но вы можете сделать то же самое с Holo Dark . Кажется, что нет никакой реальной разницы в выбранных 9-патчах состояния между темами Light и Dark . Однако есть разница в 9 патчах для состояния по умолчанию (см. « Свет против темноты» ). Так что, вероятно, нет необходимости делать локальные копии 9-патчей для выбранного состояния как для темной, так и для светлой тем (при условии, что вы хотите обрабатывать обе темы и сделать их так же, как в голографической теме ). Просто сделайте одну локальную копию и используйте ее вселектор для обеих тем.
Теперь вам нужно отредактировать загруженные девять патчей в соответствии с вашими потребностями (т.е. изменить синий цвет на красный). Вы можете взглянуть на файл с помощью инструмента draw 9-patch, чтобы проверить, правильно ли он определен после вашего редактирования.
Я редактировал файлы с помощью GIMP с помощью однопиксельного карандаша (довольно легко), но вы, вероятно, воспользуетесь своим собственным инструментом. Вот мой настроенный 9-патч для сфокусированного состояния :
ПРИМЕЧАНИЕ. Для простоты я использовал только изображения для плотности mdpi . Вам нужно будет создать 9 патчей для экрана с разной плотностью, если вы хотите добиться наилучшего результата на любом устройстве. Изображения для Holo
SearchView
можно найти в форматах mdpi , hdpi и xhdpi с возможностью рисования .Теперь нам нужно создать настраиваемый селектор, чтобы правильное изображение отображалось в зависимости от состояния просмотра. Создайте файл
res/drawable/texfield_searchview_holo_light.xml
со следующим содержанием:Мы будем использовать созданный выше объект для рисования, чтобы установить фон для
LinearLayout
представления, содержащего текстовое поле внутриSearchView
- его идентификаторandroid:id/search_plate
. Вот как это быстро сделать в коде при создании меню параметров:Окончательный эффект
Вот скриншот окончательного результата:
Как я до этого добрался
Думаю, стоит рассказать, как я к этому пришел, чтобы этот подход можно было использовать при настройке других представлений.
Проверка макета просмотра
Я проверил, как
SearchView
выглядит макет. В конструкторе SearchView можно найти строку, раздувающую макет:Теперь мы знаем, что
SearchView
макет находится в файле с именемres/layout/search_view.xml
. Заглянув в search_view.xml, мы можем найти внутреннийLinearLayout
элемент (с идентификаторомsearch_plate
), который находитсяandroid.widget.SearchView$SearchAutoComplete
внутри него (похоже на наше текстовое поле просмотра поиска):Теперь, когда фон установлен на основе
searchViewTextField
атрибута текущей темы .Изучение атрибута (легко ли его настроить?)
Чтобы проверить, как установлен
searchViewTextField
атрибут, мы исследуем файл res / values / themes.xml . ПоSearchView
умолчанию есть группа атрибутов, связанных сTheme
:Мы видим, что для темы по умолчанию значение равно
@drawable/textfield_searchview_holo_dark
. В этом файле также задаетсяTheme.Light
значение For .Было бы здорово, если бы этот атрибут был доступен через R.styleable , но, к сожалению, это не так. Для сравнения, увидеть другие тематические атрибуты , которые присутствуют как в themes.xml и R.attr как textAppearance или selectableItemBackground . Если бы
searchViewTextField
он присутствовал вR.attr
(иR.stylable
), мы могли бы просто использовать наш настраиваемый селектор при определении темы для всего нашего приложения в XML. Например:Что нужно изменить?
Теперь мы знаем, что нам нужно будет получить доступ
search_plate
через код. Однако мы до сих пор не знаем, как это должно выглядеть. Короче говоря, мы ищем чертежи, используемые в качестве значений в темах по умолчанию: textfield_searchview_holo_dark.xml и textfield_searchview_holo_light.xml . Глядя на контент, мы видим, что drawable - это объект,selector
который ссылается на два других чертежа (которые позже будут иметь 9 патчей) в зависимости от состояния представления. Вы можете найти агрегированные чертежи с 9 патчами (почти) для всех версий Android на androiddrawables.comПользовательская настройка
Мы узнаем синюю линию в одном из 9 участков , поэтому мы создаем ее локальную копию и меняем цвета по желанию.
источник
SearchView
себе). Можно ли объединить ваш ответ (переопределив onCreateOptionsMenu) с моим?onCreate()
метода вonCreateOptionsMenu()
метод, как вы предложили. Проголосовал за ваш ответ.Приведенные выше решения могут не работать, если вы используете библиотеку appcompat. Возможно, вам придется изменить код, чтобы он работал с библиотекой appcompat.
Вот рабочее решение для библиотеки appcompat.
источник
Ваш
onCreateOptionsMenu
метод должен быть:где ваш элемент поиска
menu_search
не в курсеи вот
searchviewredversion
(это версия xhdpi): http://img836.imageshack.us/img836/5964/searchviewredversion.pngисточник
Приведенное выше решение не работает с ActionBarSherlock 4.2 и, следовательно, не имеет обратной совместимости с Android 2.x. Вот рабочий код, который настраивает фон SearchView и текст подсказки на ActionBarSherlock 4.2:
источник
Я тоже устал это делать и использую v7. Приложение вылетело, когда я пытался захватить
searchPlate
переход,getIdentifier()
поэтому я сделал это следующим образом:источник
У меня возникла такая же проблема: я использовал библиотеку appcompat v7 и определил для нее собственный стиль. В папку с возможностью переноса поместите файл bottom_border.xml, который выглядит так:
В папке значений styles_myactionbartheme.xml:
Я определил файл custommenu.xml для отображения меню:
Ваша активность должна расширять ActionBarActivity вместо Activity.
В файле манифеста:
Для получения дополнительной информации смотрите здесь:
Здесь http://www.jayway.com/2014/06/02/android-theming-the-actionbar/
источник
Обновить
Если вы используете AndroidX, вы можете сделать это так
источник
Во-первых, давайте создадим XML-файл с именем search_widget_background.xml, который будет использоваться как файл для рисования, то есть в каталоге для рисования.
Этот объект будет использоваться в качестве фона для нашего виджета поиска. Я установил красный цвет, потому что это то, что вы просили, но вы можете установить любой цвет, определенный тегом @color. Вы даже можете изменить его дальше, используя атрибуты, определенные для тега формы. (сделать закругленные углы, сделать овальный фон и т. Д.).
Следующим шагом будет установка фона нашего виджета поиска на этот. Это можно сделать следующим образом:
источник
SearchView
(названномsearch_plate
), а не наSearchView
самом себе. См. Мой ответ для более подробной информации. Однако должен признать, что я не пробовал использовать ответ @ (baba tenor).SearchView
всегда будет ниже фона для элементов, находящихся внутриSearchView
. Внутри естьLinearLayout
представлениеSearchView
с идентификаторомsearch_plate
, который устанавливает этот синий элемент подчеркивания в качестве фона. Подробности смотрите в моем ответе. Таким образом, с вашим решением результат - синий фон для всего виджета с синим подчеркиванием. Я тестировал Jelly Bean , но не думаю, что целевая версия SDK здесь имеет значение.и это файл searchchablecolor.xml
источник
Я объяснил в конце этого поста изображениями, что это применимо к формам xamarin. Но я думаю, вы можете это понять, потому что он основан на исходном коде searchview Android.
Как изменить изображение кнопки отмены панели поиска в формах xamarin
источник
Если вы раздуваете Searchview, например, "getMenuInflater (). Inflate (R.menu.search_menu, menu);". Затем вы можете настроить этот вид поиска через style.xml, как показано ниже.
источник
Я много копал об этом и, наконец, нашел это решение, и оно работает для меня!
Вы можете использовать это
Если вы используете appcompat, попробуйте следующее:
Если вы используете androidx, попробуйте следующее:
Это изменит значок просмотра по умолчанию.
Надеюсь, поможет!
источник