Nano Hash - криптовалюты, майнинг, программирование

Стиль SnackBar в тематическом приложении

Мне нужна помощь. Как я могу изменить дизайн текста на панели закусок в приложении стилей? Изменение кода меня не интересует. Я нашел следующий код. Но у меня это не работает. Это почему? Моя тема является производной от @ style / Theme.AppCompat.Light.DarkActionBar ". Буду очень благодарен за помощь.

<style name="TextAppearance.Design.Snackbar.Message" parent="android:TextAppearance">
        <item name="android:textSize">10sp</item>
        <item name="android:textColor">#FEFEFE</item>
    </style>
    <style name="TextAppearance.Design.Snackbar.Action" parent="android:TextAppearance">
        <item name="android:textSize">16sp</item>
        <item name="android:textColor">#FEFEFE</item>
    </style>


Ответы:


1

С помощью библиотеки компонентов материалов вы можете глобально изменить стиль закусочной в теме приложения:

<style name="AppTheme" parent="Theme.MaterialComponents.*">
    <!-- Style to use for Snackbars in this theme. -->
    <item name="snackbarStyle">@style/Widget.MaterialComponents.Snackbar</item>
    <!-- Style to use for action button within a Snackbar in this theme. -->
    <item name="snackbarButtonStyle">@style/Widget.MaterialComponents.Button.TextButton.Snackbar</item>
    <!-- Style to use for message text within a Snackbar in this theme. -->
    <item name="snackbarTextViewStyle">@style/Widget.MaterialComponents.Snackbar.TextView</item>
    ....
</style>

Примечание:

  • snackbarStyle и snackbarButtonStyle требуется версия 1.1.0
  • snackbarTextViewStyle требуется версия 1.2.0.

Например:

  <style name="snackbar_style" parent="@style/Widget.MaterialComponents.Snackbar">
    <item name="android:layout_margin">32dp</item>
  </style>

  <style name="snackbar_button" parent="@style/Widget.MaterialComponents.Button.TextButton.Snackbar">
      <item name="backgroundTint">@color/secondaryLightColor</item>
      <item name="android:textColor">@color/primaryDarkColor</item>
  </style>

  <style name="snackbar_text" parent="@style/Widget.MaterialComponents.Snackbar.TextView">
    <item name="android:textColor">@color/secondaryLightColor</item>
  </style>

введите описание изображения здесь

Это просто пример того, как изменить родительский стиль для кнопки действия. Вы можете использовать, например, стандартный Widget.MaterialComponents.Button:

  <style name="snackbar_button" parent="@style/Widget.MaterialComponents.Button">
      <item name="backgroundTint">@color/secondaryLightColor</item>
      <item name="android:textColor">@color/primaryDarkColor</item>
  </style>

Чтобы изменить цвет фона SnackBar, вы можете использовать:

<style name="snackbar_style" parent="@style/Widget.MaterialComponents.Snackbar">
    <!-- using backgroundTint the alpha layer is ignored -->
    <item name="backgroundTint">@color/....</item>
</style>

Или, если хотите:

   <style name="MySnackbar" parent="@style/Widget.MaterialComponents.Snackbar">
        <item name="materialThemeOverlay">@style/snackbar_overlay</item>
        <!-- If you want to avoid the alpha level for the color that is overlaid on top of the background color-->
        <item name="backgroundOverlayColorAlpha">1.0</item>
    </style>
    <style name="snackbar_overlay">
        <item name="colorOnSurface">....</item>
    </style>
29.10.2019
  • Чудесно!!. Наконец, полностью стилизуем закусочную на уровне темы. Играя с предложенным выше предложением, я обнаружил, что мы можем указать произвольную форму / цвет фона в стиле закусочной. ‹Имя стиля = snackbar_style parent=@style/Widget.MaterialComponents.Snackbar» ›‹ имя элемента = android: layout_margin ›32dp ‹/item› ‹ имя элемента = android: background ›@ drawable / bg_snackbar ‹/item›‹ имя элемента = backgroundTint »› @ color / snackbarBackgroundColor ‹/item› ‹имя элемента = animationMode› слайд ‹/item› ‹/style› 31.10.2019
  • при применении snackbar_button цвет действительно меняется. Но цвет немного ярче, и проверка его с помощью палитры цветов показывает, что цвет не совсем соответствует выбранному цвету. 17.04.2020
  • Спасибо за супер подробный пост, чувак. Спасатель жизни 03.09.2020

  • 2

    вам нужно это: tools:override="true"

    <resources xmlns:tools="http://schemas.android.com/tools">
        <style name="TextAppearance.Design.Snackbar.Message" parent="android:TextAppearance" tools:override="true">
            <item name="android:textColor">@color/text</item>
            <item name="android:textSize">50sp</item>
        </style>
    </resources>
    
    23.09.2016
  • На данный момент это единственный способ стилизовать его в XML. Есть отчет об ошибке, позволяющий правильно оформить его. 02.11.2016

  • 3

    См. Эту ссылку для дополнительной информации:

    // создаем экземпляр

    Snackbar snackbar = Snackbar.make(view, text, duration);
    

    // устанавливаем цвет кнопки действия

    snackbar.setActionTextColor(getResources().getColor(R.color.indigo));
    

    // получаем представление закусочной

    View snackbarView = snackbar.getView();
    

    // изменить цвет текста закусочной

    int snackbarTextId = android.support.design.R.id.snackbar_text;
    TextView textView = (TextView)snackbarView.findViewById(snackbarTextId);
    textView.setTextColor(getResources().getColor(R.color.indigo));
    

    // изменить фон закусочной

    snackbarView.setBackgroundColor(Color.MAGENTA);
    
    09.08.2018
  • Если вы используете новые компоненты материалов, используйте com.google.android.material.R.id.snackbar_text вместо android.support.design.R.id.snackbar_text. 02.03.2019

  • 4

    Благодаря shadowsheep я написал эти стили с помощью Material Components. Я также удалил поля. Вы можете скомпилировать его приложение для исследования Snackbar.

    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.MaterialComponents.Light.DarkActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
    
        <!-- Snackbar -->
        <item name="snackbarStyle">@style/MaterialSnackbarTheme</item>
        <item name="snackbarButtonStyle">@style/MaterialSnackbarTextButtonTheme</item>
        <item name="snackbarTextViewStyle">@style/MaterialSnackbarTextViewTheme</item>
    </style>
    
    <style name="MaterialSnackbarTheme" parent="@style/Widget.MaterialComponents.Snackbar">
        <!-- <item name="backgroundTint">#00cc77</item>-->
        <!-- <item name="android:background">@drawable/snackbar_background</item>-->
        <item name="android:background">#00cc77</item>
        <item name="cornerRadius">0dp</item>
        <item name="android:layout_margin">0dp</item>
        <item name="actionTextColorAlpha">1.0</item>
    </style>
    
    <style name="MaterialSnackbarTextButtonTheme" parent="@style/Widget.MaterialComponents.Button.TextButton.Snackbar">
        <item name="backgroundTint">#7777ff</item>
        <item name="android:textColor">#ffffff</item>
    </style>
    
    <style name="MaterialSnackbarTextViewTheme" parent="@style/Widget.MaterialComponents.Snackbar.TextView">
        <item name="android:textColor">#ffffff</item>
        <item name="android:alpha">1.0</item>
    </style>
    

    Где drawable / snackbar_background.xml:

    <?xml version="1.0" encoding="utf-8"?>
    <shape xmlns:android="http://schemas.android.com/apk/res/android"
        android:shape="rectangle"
        >
        <solid android:color="#00cc77" />
    </shape>
    

    Не забудьте удалить из Snackbar.make(), если вы добавили:

    view.setBackgroundColor(ContextCompat.getColor(context, R.color.bg_color))
    setActionTextColor(ContextCompat.getColor(context, R.color.button_color))
    

    В отличие от AlertDialog, Snackbar содержит настройки snackbarButtonStyle и snackbarTextViewStyle внутри AppTheme (что странно, потому что вчера они хорошо работали внутри MaterialSnackbarTheme).

    Как сказал @StayCool в комментариях, Snackbar в настоящее время использует прозрачность для фона и цвета текста (альфа = 0,5 - 0,6). Также добавили закругленные углы и поля. Чтобы удалить прозрачность фона, используйте <item name="actionTextColorAlpha">1.0</item> или drawable / snackbar_background.xml. Вы можете увидеть его вариант.

    введите описание изображения здесь

    25.05.2020
  • Как я могу переопределить основные / акцентные цвета только для закусочной? Я использую ваше решение, но ‹item name = android: textColor› @ color / white ‹/item› просто не работает для кнопки textColor. Может быть ThemeOverlay? 04.06.2020
  • @StayCool, я только что проверил свой пример, эти два цвета не влияют на SnackBar. Я их поменял и ничего не изменилось. Можете задать вопрос в ТАК? 04.06.2020
  • @StayCool, это странно. Я изменил цвет кнопки в ‹item name = android: textColor› и применил. 04.06.2020
  • @StayCool, вы установили <item name="snackbarButtonStyle">@style/MaterialSnackbarTextButtonTheme</item> в AppTheme? 04.06.2020
  • да. мои стили закусочной теперь содержат множество атрибутов, потому что их родительские стили содержали селекторы, которые использовали альфа-версию 0.6 и некоторые другие вещи. это было неочевидно. то есть, когда я установил для кнопки закусочной панели textColor сплошной красный цвет, я получил 0,6 красного. Это было так запутанно. Теперь я успешно изменил фон закусочной с помощью этого: android: background, я установил его на градиент с возможностью рисования =) Кроме того, я использую наложение темы материала, чтобы переопределить пользователя colorPrimary для цвета обводки кнопки. 05.06.2020
  • @StayCool, да, фон MDC Snackbar частично прозрачен, поэтому я установил drawable / snackbar_background.xml. Хорошо, что вы разобрались со всеми этими ошибками и особенностями MDC. :) 05.06.2020
  • хммм ... если это было запланировано материальным дизайном, может быть, мы не хотим менять прозрачность? ^^ Меня просто сбило с толку, потому что текст кнопки был непрозрачным, а текст закусочной - нет. 05.06.2020
  • @StayCool, ты прав! Прозрачность часто не нужна, по крайней мере, если мы этого не хотели. Они изменили это поведение. Я протестирую ваше решение. Спасибо! 05.06.2020
  • @StayCool Насчет цвета фона это не правильно. Цвет фона основан на colorOnSurface. Вы можете переопределить цвет, используя <item name="materialThemeOverlay">@style/...</item> в своем стиле (вы можете проверить мой ответ выше). При использовании backgroundTint альфа-слой игнорируется. В любом случае вы можете переопределить его, используя attr backgroundOverlayColorAlpha. Наконец, вам следует избегать использования android:background. 10.06.2020
  • @GabrieleMariotti, но я не могу использовать градиентный фон для закусочной с backgroundOverlayColorAlpha или переопределить colorOnSurface для своего snackBarStyle? 11.06.2020
  • @StayCool С backgroundOverlayColorAlpha и backgroundTint вы не можете использовать градиент (как и все другие компоненты в библиотеке компонентов материалов). 11.06.2020
  • @GabrieleMariotti да, и, как я вижу, нет другого способа установить градиент для закуски, кроме android: background 11.06.2020
  • @StayCool в настоящее время единственный способ. 11.06.2020

  • 5

    Я покопался в источниках Snackbar и обнаружил, что фон Snackbar состоит из двух слоев: основы и наложения, цвета которых смешиваются.

    Чтобы указать эти цвета, просто добавьте к своей теме 2 параметры:

    colorSurface - цвет фона, по умолчанию = 0xFFFFFFFF

    colorOnSurface - оверлей, по умолчанию = 0xFF000000

    Таким образом, в случае по умолчанию с примененным по умолчанию значением альфа 0,8, мы получаем цвет 0xFF333333, который находится посередине между белым и черным.

    Получайте удовольствие от смешивания и стилизации своей Snackbar :)

    22.05.2019
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..