Итак, я начал использовать новую панель закусок в библиотеке поддержки дизайна, но обнаружил, что когда вы определяете "android: textColor" в своей теме, он применяется к цвету текста панели закусок. Очевидно, это проблема, если ваш основной цвет текста темный.
Кто-нибудь знает способ обойти это или есть совет, как мне раскрасить текст?
ИЗМЕНИТЬ Январь 2017: (Пост-ответ)
Несмотря на то, что есть несколько индивидуальных решений для устранения проблемы, указанной ниже, вероятно, было бы хорошо предоставить правильный способ оформления Snackbars.
Во-первых, вам, вероятно, вообще не следует определять android:textColor
в своих темах (если вы действительно не знаете масштаб того, что использует тема). Это устанавливает цвет текста практически для каждого представления, которое связано с вашей темой. Если вы хотите определить цвета текста в ваших представлениях, которые не используются по умолчанию, используйте android:primaryTextColor
этот атрибут и укажите ссылку на него в ваших пользовательских представлениях.
Однако для применения тем Snackbar
обратитесь к этому руководству по качеству из стороннего материала: http://www.materialdoc.com/snackbar/ (следуйте программной реализации темы, чтобы она не полагалась на стиль xml)
Для справки:
// create instance
Snackbar snackbar = Snackbar.make(view, text, duration);
// set action button color
snackbar.setActionTextColor(getResources().getColor(R.color.indigo));
// get snackbar view
View snackbarView = snackbar.getView();
// change snackbar text color
int snackbarTextId = android.support.design.R.id.snackbar_text;
TextView textView = (TextView)snackbarView.findViewById(snackbarTextId);
textView.setTextColor(getResources().getColor(R.color.indigo));
// change snackbar background
snackbarView.setBackgroundColor(Color.MAGENTA);
(Вы также можете создавать свои собственные Snackbar
макеты, см. Ссылку выше. Сделайте это, если этот метод кажется слишком хакерским и вам нужен надежный способ продлить срок службы пользовательской панели Snackbar с помощью возможных обновлений библиотеки поддержки).
Или посмотрите ответы ниже, чтобы найти похожие и, возможно, более быстрые ответы для решения вашей проблемы.
android:textColorPrimary
Ответы:
Я знаю, что на это уже был дан ответ, но самый простой способ, который я нашел, был непосредственно в make с использованием
Html.fromHtml
метода иfont
тегаисточник
Я нашел это на странице Какие новые функции библиотеки поддержки дизайна Android и как использовать ее Snackbar?
Это сработало для меня при изменении цвета текста в Snackbar.
ОБНОВЛЕНИЕ: ANDROIDX: как указывает dblackker в комментариях, с новой библиотекой поддержки AndroidX код для поиска идентификатора Snackbar TextView изменяется на:
источник
snackbar_action
вместоsnackbar_text
. См. Этот ответ для примера: stackoverflow.com/a/36800101/293280snack.view.findViewById(com.google.android.material.R.id.snackbar_text) as TextView
Взлом
android.support.design.R.id.snackbar_text
- дело хрупкое, лучший или менее хакерский способ сделать это:источник
Создал эту функцию расширения kotlin, которую я использую в своих проектах:
Использование, как и следовало ожидать:
источник
com.google.android.material.R.id.snackbar_text
если вы переходите на AndroidX.Хорошо, поэтому я исправил это, в основном реорганизовав цвет текста.
В моей светлой теме, я поставил
android:textColorPrimary
на чтоnormal dark text
я хотел, и я поставилandroid:textColor
вwhite
.Я обновил все свои текстовые представления и кнопки, чтобы
android:textColor="?android:attr/textColorPrimary".
Итак, поскольку снэкбар извлекается из
textColor
, я просто установил для всего остального текста значениеtextColorPrimary
.ИЗМЕНИТЬ ЯНВАРЬ 2017: ---------------------------------------------- ------
Итак, как говорится в комментариях и как указано в отредактированном исходном вопросе выше, вам, вероятно, не следует определять
android:textColor
в своих темах, поскольку это меняет цвет текста каждого представления внутри темы.источник
android:textColor
в своей теме. Это стиль атрибутTextView
. Если вы определяете его в своей теме, вы переопределяете цвет текста каждогоTextView
илиButton
не указываете цвет текста в XML. Это также сообщение закусочной, которое обычно берет цвет из наложения темной темы .Один из подходов - использовать промежутки:
С помощью промежутков вы также можете добавить несколько цветов и стилей внутри одной Snackbar. Вот хорошее руководство:
https://androidbycode.wordpress.com/2015/06/06/material-design-snackbar-using-the-design-support-library/
источник
Если вы перешли на androidX, используйте
com.google.android.material.R.id.snackbar_text
вместоandroid.support.design.R.id.snackbar_text
изменения цвета текста на панели закусок .источник
Единственный способ, который я вижу, - это использовать
getView()
и циклически перемещаться по его дочернему элементу. Не знаю, сработает ли это, как бы плохо это ни выглядело. Я надеюсь, что они скоро добавят API по этой проблеме.источник
Если вы перенесете свой код на AndroidX, свойство TextView теперь будет:
источник
Это то, что я использую, когда мне нужны нестандартные цвета
И потребляется как:
источник
Я изменил свою тему
к
Это сработало. Попробуйте использовать простую тему вместо светлой или другой темы.
источник
Если вы решили использовать грязное и хакерское решение с поиском TextView в Snackbar по идентификатору, и вы уже перешли на androidx, то вот код:
источник
Вы можете использовать эту библиотеку: https://github.com/SandroMachado/restaurant
Отказ от ответственности: я сделал библиотеку.
источник
Поиск по идентификатору у меня не сработал, поэтому я нашел другое решение:
источник
Используйте то, что
Snackbar
входит в библиотеку компонентов материала, и применитеsetTextColor
определить цвет текстаsetActionTextColor
для определения цвета текста, используемого действием. Вы можете использовать цвет или селектор цветаsetBackgroundTint
для определения цвета фона SnackbarЧто-то вроде:
источник
В настоящее время (январь 2020 г.) с
com.google.android.material:material:1.2.0
и, вероятно, также1.1.0
Определенно лучший способ сделать это, переопределив эти стили:
Если вы используете тему материала с
.Bridge
в конце, по какой-то причине ни один из этих стилей не определен. Таким образом, Snackar будет использовать устаревший макет без этих стилей.Я обнаружил в исходном коде, что оба
snackbarButtonStyle
иsnackbarTextViewStyle
должны быть определены, иначе он не будет использоваться.источник
У меня есть простой код, который поможет получить экземпляр как текстового представления Snackbar, так и после этого вы можете вызывать все методы, применимые к текстовому представлению.
источник
Чтобы сэкономить ваше драгоценное время на разработку, я использую статический метод:
Вот как это выглядит:
источник
Если вы находитесь в Котлине , вы можете создать расширение:
Использование :
источник
Согласно новым компонентам AndroidX Jitpack
Используйте это расширение, которое я создал
Используйте это так
источник
Это мой обходной путь для решения этой проблемы при
androidx
использованииkotlin
Вам нужно инициализировать
mContent
внутреннийonViewCreated
метод, как показано нижеисточник
Я тоже заметил ту же проблему. Благодаря ответам здесь я создал небольшой класс, который может помочь решить эту проблему более легко, просто заменив это:
с этим:
Вот мой класс:
}
источник