2015-01-14 4 views
8

Я использую appcompat v21.0.3 для своего приложения. Я сделал все, как написано здесь: android-developers.blogspot.com/2014/10/appcompat-v21-material-design-for-pre.htmlВиджет не тонирован на Lollipop

Но на Lollipop (и на старых устройствах, конечно) некоторые виджеты не тонированы цветом моего акцента. Например:

  • SwitchCompat окрашена: switchcompat

  • ListPreference НЕ тонированное enter image description here

  • ProgressDialog НЕ тонированное enter image description here

Вот мой код:

build.gradle

... 
compile 'com.android.support:appcompat-v7:21.0.+' 
... 

AndroidManifest.xml

<application 
     android:allowBackup="true" 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" 
     android:theme="@style/CET" 
     android:hardwareAccelerated="true" 
     tools:replace="label"> 

themes.xml

<resources> 

    <style name="CET" parent="Theme.AppCompat.Light.NoActionBar"> 
     <item name="windowActionBar">false</item> 
     <item name="colorPrimary">@color/primary</item> 
     <item name="colorPrimaryDark">@color/primary_dark</item> 
     <item name="colorAccent">@color/accent</item> 
    </style> 

</resources> 

colors.xml

<resources> 

    <!-- App branding color --> 
    <color name="primary">#a32b30</color> 

    <!-- Darker variant for status bar and contextual app bars --> 
    <color name="primary_dark">#000000</color> 

    <!-- Theme UI constrols like checkboxes and text fields --> 
    <color name="accent">#a32b30</color> 

</resources> 

У кого-то есть идея?

ОБНОВЛЕНИЕ: по состоянию на июнь 2015 года все еще не работает, но я закончил с использованием https://github.com/afollestad/material-dialogs. Работает очень хорошо для диалогов, включая ListPreferences.

ответ

1

Try атрибут colorControlActivated:

themes.xml

<style name="CET" parent="Theme.AppCompat.Light.NoActionBar"> 
    <item name="windowActionBar">false</item> 
    <item name="colorPrimary">@color/primary</item> 
    <item name="colorPrimaryDark">@color/primary_dark</item> 
    <item name="colorAccent">@color/accent</item> 
    <item name="colorControlActivated">#a32b30</item> 
</style> 

+0

Спасибо. Уже пробовал, он все равно не работает. –

28

Следуйте инструкции ниже

Если не указано иное, все ниже тонировки относится к обоим Lollipop и pre-Lollipop с использованием Ap pCompat v21. Чтобы использовать версию поддержки этих атрибутов, удалите пространство имен android. Например, «android: colorControlNormal» становится «colorControlNormal». Эти атрибуты будут распространяться на соответствующие им атрибуты в пространстве имен android для устройств под управлением Lollipop. Любые исключения из этого будут отмечены, включая префикс «android:».

All Clickable Views: 
----------- 
* ripple effect (Lollipop only) -- "colorControlHighlight" 

Status Bar: 
------------ 
* background (Lollipop only) - "colorPrimaryDark" 

Navigation Bar: 
---------------- 
* background (Lollipop only) - "android:navigationBarColor" 

EditText: 
---------- 
* underline (unfocused) -- "colorControlNormal" 
* underline overlay (focus) -- "colorAccent" 
* cursor -- "colorAccent" 
* text color -- "android:textColorPrimary" 

CheckBox: 
---------- 
* box unchecked -- "colorControlNormal" 
* box checked -- "colorAccent" 

RadioButton: 
------------- 
* unselected -- "colorControlNormal" 
* selected -- "colorAccent" 
* ripple effect (Lollipop only) -- "colorControlHighlight" 

SwitchCompat: 
------------- 
* thumb switch off -- "colorSwitchThumbNormal" 
* thumb switch on -- "colorAccent" 
* track overlay (when switched on) -- "colorAccent" 

Spinner: 
--------- 
* indicator (not pressed) -- "colorControlNormal" 
* indicator (pressed) -- "colorAccent" 
* selected entry text color (Lollipop only) -- "android:textColorPrimary" 

ActionBar: 
----------- 
* background -- "colorPrimary" 
* title color -- "android:textColorPrimary" 
* overflow icon -- "android:textColorPrimary" 
* up button -- "android:textColorPrimary" 
* action icons -- "android:textColorPrimary" † 
* overflow menu background -- "android:colorBackground" 
* overflow text color -- "android:textColorPrimary" 

Toolbar (Theme Overlay should be used): 
---------------------------------------- 
* background -- must be set manually in XML. Can do (android:background="?attr/colorPrimary") 
* overflow icon -- "android:textColorPrimary" 
* navigation icon -- "android:textColorPrimary" † 
* action icons -- "android:textColorPrimary" † 
* overflow menu background -- "android:colorBackground" 
* overflow text color -- "android:textColorPrimary" 

P.S. тонирование по умолчанию работает только с иконками действий белого значка (см. исходный код TintManager). Например, значок задней стрелки "abc_ic_ab_back_mtrl_am_alpha" тонирован, но копирование этого точного файла и его переименование приведет к тому, что значок не будет тонирован при случайном изображении и переименование его в "abc_ic_ab_back_mtrl_am_alpha" приведет к его тонированию.Тонирование можно сделать в XML в Lollipop, создав файл <bitmap> xml с возможностью рисования и применив атрибут "android:tint". Этот значок можно использовать как в Lollipop, так и в pre-Lollipop, но он будет только тонироваться в Lollipop. Тонирование значков действий также может выполняться программно с использованием ColorFilter.

Source

+1

Благодарим вас за подробный ответ, но это не помогает: ProgressDialog следует подкрашивать на Lollipop, и это не так, независимо от того, какие значения я использую (я пытался добавить каждое значение (colorControlNormal, ...), он не изменяется : некоторые элементы зеленые. –

+1

Попробуйте сделать это на одном конкретном элементе (кнопке) для теста 'android: buttonTint =" @ color/colorAccent "' 'android: button =" @ drawable/abc_btn_check_material "' –

+0

Я попробую, чтобы проверить , но проблема не в виджетах, которые я использую сам, но в виджетах у меня нет доступа к: стандарту ProgressDialog и ListPreference, используемому в PreferenceFragment. Поэтому я не могу добавить этот элемент в эти ... –

0

Насколько я знаю, все, что в диалоге автоматически не тонированное в Lollipop (пока). Оформить заказ material-dialogs, библиотеку, чтобы сделать это автоматически для вас (но она поддерживает только API 14+).

заказ ответы от подобного вопроса: Android v21 Theme.Appcompat color accent is ignored, no padding on dialogs

+0

чтобы иметь тонированное диалоговое окно на Lollipop, я НЕ должен использовать AppCompat? –

+0

Используйте AppCompat, если вам нужно поддерживать API более низкого уровня, если только Lollipop тогда не нужно. Библиотека, на которую я ссылаюсь, не зависит от AppCompat, я думаю, вы можете использовать их вместе , – hidro

12

Вы обычно должны использовать свой собственный индикатор вместо диалога, а затем вы можете сделать тонированное версию, которая работает на обоих L и до L, как так:

public class TintedProgressBar extends ProgressBar { 
    public TintedProgressBar(Context context) { 
     super(context); 
     init(); 
    } 

    public TintedProgressBar(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     init(); 
    } 

    public TintedProgressBar(Context context, AttributeSet attrs, int defStyleAttr) { 
     super(context, attrs, defStyleAttr); 
     init(); 
    } 

    public void init() { 
     getIndeterminateDrawable().setColorFilter(getResources().getColor(R.color.primary), PorterDuff.Mode.SRC_IN); 
     getProgressDrawable().setColorFilter(getResources().getColor(R.color.primary), PorterDuff.Mode.SRC_IN); 
    } 
} 

Если вы действительно хотите, чтобы изменить цвет в диалоговом окне вы можете найти вложенный прогресс бар, вероятно, в dialog.findViewById(android.R.id.progess)

3

Он только отвечает на часть вашего вопроса, но стиль бара прогресса от Библиотека appcompat не поднимает цвет акцента на леденец, даже вне ProgressDialog.

Вам нужно установить его самостоятельно, например, с этим стилем:

<style name="TintedProgressBar" parent="Widget.AppCompat.ProgressBar"> 
    <item name="android:indeterminate">true</item> 
    <item name="android:indeterminateTint">?attr/colorAccent</item> 
    <item name="android:indeterminateTintMode">src_in</item> 
</style> 

, которые затем можно применить к ProgressBar или ContentLoadingProgressBar. (Обратите внимание, что родительский элемент прогресс бар раздувается в, очевидно, придется применить тему, определяющую атрибут colorAccent, в противном случае использовать прямой цветовой ресурс)

Если вы хотите интегрировать прогресс бар в диалоге, , так как я не думайте, что ProgressDialog поддерживает настройку своего индикатора выполнения за пределами типа и вытягивания, вам может потребоваться установить AlertDialog с индикатором выполнения, использующим указанную выше тему, или просто пойти с настраиваемым диалогом. Я думаю, вы можете обратиться к this answer примените вышеуказанные атрибуты, относящиеся к шагу выполнения, к диалоговому окну.

+1

Спасибо, это работает из всех решений – NyanLH

+0

отлично, работает как шарм –

5

Для изменения цвета Прогресс Диалог Drawable, я использовал следующий обходной путь: Я создал AppCompat оповещения диалоговое базовый стиль

<style name="CustomAppCompatAlertDialogStyle" parent="Theme.AppCompat.Light.Dialog.Alert"> 
      <item name="colorAccent">@color/defaultColor</item> 
      <item name="android:indeterminateTint">?attr/colorAccent</item> 
      <item name="android:indeterminateTintMode">src_in</item> 
    </style> 

А затем применить эти темы в ходе диалога:

mProgressDialog = new ProgressDialog(this, R.style.CustomAppCompatAlertDialogStyle); 
+0

Спасибо, этот работает из всех решений – NyanLH

Смежные вопросы