Я пытаюсь изменить цвет по умолчанию для меню параметров, который является белым: мне нужен черный фон для каждого элемента в меню параметров.
Я пробовал снимки вроде android: itemBackground = "# 000000" в элементе item в элементе меню, но это не сработало.
Как я могу этого добиться?
android
user-interface
layout-inflater
Feragusper
источник
источник
Ответы:
Потратив значительное количество времени на опробование всех параметров, я смог получить приложение, использующее AppCompat v7 для изменения фона меню переполнения, только с помощью атрибута itemBackground:
Проверено с API 4.2 до 5.0.
источник
Это явно проблема, с которой сталкиваются многие программисты и для которой Google еще не предоставил удовлетворительное поддерживаемое решение.
В сообщениях по этой теме есть много противоречивых намерений и недопониманий, поэтому, пожалуйста, прочтите весь ответ, прежде чем отвечать.
Ниже я привожу более «усовершенствованную» и хорошо прокомментированную версию взлома из других ответов на этой странице, также включающую идеи из этих очень тесно связанных вопросов:
Изменить цвет фона меню Android
Как изменить цвет фона меню параметров?
Android: настроить меню приложения (например, цвет фона)
http://www.macadamian.com/blog/post/android_-_theming_the_unthemable/
Кнопка переключения Android MenuItem
Можно ли сделать фон меню параметров Android непрозрачным?
http://www.codeproject.com/KB/android/AndroidMenusMyWay.aspx
Установка непрозрачного фона меню
Я тестировал этот хак на 2.1 (симулятор), 2.2 (2 реальных устройства) и 2.3 (2 реальных устройства). У меня пока нет планшетов 3.X для тестирования, но я опубликую здесь все необходимые изменения, когда / если они появятся. Учитывая, что планшеты 3.X используют панели действий вместо меню параметров, как описано здесь:
http://developer.android.com/guide/topics/ui/menus.html#options-menu
этот хак почти наверняка ничего не сделает (ни вреда, ни пользы) на планшетах 3.X.
ИЗЛОЖЕНИЕ ПРОБЛЕМЫ (прочтите это, прежде чем инициировать ответ с отрицательным комментарием):
Меню параметров имеет совершенно разные стили на разных устройствах. Чисто черный с белым текстом на некоторых, чисто белый с черным текстом на некоторых. Я и многие другие разработчики хотят контролировать цвет фона ячеек меню параметров, а также цвет текста меню параметров .
Некоторым разработчикам приложений необходимо установить только цвет фона ячейки (а не цвет текста), и они могут сделать это более чистым способом, используя стиль android: panelFullBackground, описанный в другом ответе. Однако в настоящее время нет возможности управлять цветом текста в меню «Параметры» с помощью стилей, поэтому можно использовать этот метод только для изменения фона на другой цвет, который не заставит текст «исчезнуть».
Мы хотели бы сделать это с помощью задокументированного, перспективного решения, но оно просто недоступно в Android <= 2.3. Таким образом, мы должны использовать решение, которое работает в текущих версиях и предназначено для минимизации шансов сбоя / поломки в будущих версиях. Нам нужно решение, которое в случае неудачи корректно вернется к поведению по умолчанию.
Существует множество законных причин, по которым может потребоваться контролировать внешний вид меню параметров (обычно для соответствия визуальному стилю остальной части приложения), поэтому я не буду останавливаться на этом.
По этому поводу опубликована ошибка Google Android: добавьте свою поддержку, отметив эту ошибку звездой (обратите внимание, что Google не одобряет комментарии типа "я тоже": достаточно звезды):
http://code.google.com/p/android/issues/detail?id=4441
РЕЗЮМЕ НАСТОЯЩИХ РЕШЕНИЙ:
Несколько плакатов предлагали взломать LayoutInflater.Factory. Предложенный взлом работал для Android <= 2.2 и не удался для Android 2.3, потому что взлом сделал недокументированное предположение: можно было вызвать LayoutInflater.getView () напрямую, не находясь в данный момент внутри вызова LayoutInflater.inflate () в том же экземпляре LayoutInflater. Новый код в Android 2.3 нарушил это предположение и привел к исключению NullPointerException.
Мой слегка доработанный прием ниже не основывается на этом предположении.
Кроме того, хаки также полагаются на использование внутреннего недокументированного имени класса «com.android.internal.view.menu.IconMenuItemView» в виде строки (не как типа Java). Я не вижу возможности избежать этого и все же достигну поставленной цели. Тем не менее, можно выполнить взлом осторожным способом, который откатится, если com.android.internal.view.menu.IconMenuItemView не появится в текущей системе.
Опять же, поймите, что это взлом, и я ни в коем случае не утверждаю, что он будет работать на всех платформах. Но мы, разработчики, живем не в фантастическом академическом мире, где все должно быть по правилам: у нас есть проблема, которую нужно решить, и мы должны решить ее как можно лучше. Например, кажется маловероятным, что "com.android.internal.view.menu.IconMenuItemView" будет существовать на планшетах 3.X, поскольку они используют панели действий вместо меню параметров.
Наконец, некоторые разработчики решили эту проблему, полностью исключив меню параметров Android и написав свой собственный класс меню (см. Некоторые ссылки выше). Я не пробовал этого, но если у вас есть время, чтобы написать свой собственный View и выяснить, как заменить представление Android (я уверен, что дьявол в деталях здесь), тогда это может быть хорошее решение, которое не требует никаких недокументированные взломы.
ВЗЛОМ:
Вот код.
Чтобы использовать этот код, вызовите addOptionsMenuHackerInflaterFactory () ОДИН РАЗ из вашей активности onCreate () или вашей активности onCreateOptionsMenu (). Он устанавливает фабрику по умолчанию, которая повлияет на последующее создание любого меню параметров. Это не влияет на меню параметров, которые уже были созданы (предыдущие хаки использовали имя функции setMenuBackground (), что вводит в заблуждение, поскольку функция не устанавливает никаких свойств меню перед возвратом).
Спасибо за чтение и наслаждайтесь!
источник
Атрибут стиля для фона меню -
android:panelFullBackground
.Несмотря на то, что говорится в документации, это должен быть ресурс (например,
@android:color/black
или@drawable/my_drawable
), он выйдет из строя, если вы напрямую используете значение цвета.Это также избавит от границ элементов, которые я не смог изменить или удалить с помощью решения primalpop.
Что касается цвета текста, я не нашел способа установить его с помощью стилей в 2.2, и я уверен, что перепробовал все (именно так я обнаружил атрибут фона меню). Для этого вам нужно будет использовать решение primalpop.
источник
Для Android 2.3 это можно сделать с помощью очень тяжелого взлома:
Основная причина проблем с Android 2.3 заключается в том, что в LayoutInflater mConstructorArgs [0] = mContext устанавливается только во время выполнения вызовов к
http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/2.3.3_r1/android/view/LayoutInflater.java/#352
Я тестировал его на работу на Android 2.3 и на более ранние версии. Если что-то снова сломается в более поздних версиях Android, вы просто увидите стиль меню по умолчанию.
источник
Просто столкнулся с этой проблемой в приложении, которое должно было быть совместимо с Gingerbread и при этом сохранять как можно большую часть стиля от устройств с поддержкой Holo.
Я нашел относительно чистое решение, которое сработало для меня.
В теме я использую рисованный фон с 9 патчами, чтобы получить собственный цвет фона:
Я отказался от попыток стилизовать цвет текста и просто использовал Spannable, чтобы установить цвет текста для моего элемента в коде:
источник
Вот как я решил свою. Я просто указал цвет фона и цвет текста в стилях. т.е. res> values> файл styles.xml.
источник
Следует отметить, что вы, ребята, слишком усложняете проблему, как и многие другие сообщения! Все, что вам нужно сделать, это создать настраиваемые селекторы с любым нужным вам фоном и установить их на реальные элементы. Я просто провожу два часа, пробуя ваши решения (все предложенные на этой странице), и ни одно из них не сработало. Не говоря уже о том, что существует множество ошибок, которые существенно замедляют вашу производительность в тех блоках try / catch, которые у вас есть.
В любом случае вот XML-файл меню:
Теперь в вашем item1_selector:
В следующий раз, когда вы решите пойти в супермаркет через Канаду, попробуйте карты Google!
источник
это отлично работает для меня
источник
источник
Спасибо, Маркус! Он работает на 2.3 плавно, исправляя некоторые синтаксические ошибки, вот исправленный код
источник
это файл XML
источник
Если вы хотите установить произвольный цвет, это сработает довольно хорошо
androidx
. Проверено на KitKat и Pie. Поместите это в свойAppCompatActivity
:Это устанавливает цвет
android.widget.PopupWindow$PopupBackgroundView
, который, как вы могли догадаться, отрисовывает цвет фона. Здесь нет перерисовки, вы также можете использовать полупрозрачные цвета.источник