Изменение цвета значка FAB на основе состояния w / compat libs

Я пытаюсь изменить цвет значка значка в FAB на основе состояния кнопки:

<android.support.design.widget.FloatingActionButton android:id="@+id/search_button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="bottom|end" android:layout_margin="16dp" android:tint="@color/add_button_tint" android:src="@drawable/ic_add_black_24dp" /> 

add_button_tint.xml:

 <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_selected="true" android:color="@color/white" /> <item android:color="@color/black"/> </selector> 

Это отлично работает в API> 23, однако в старых версиях android он генерирует исключение.

Здесь я смущаюсь:

Свойство android: tint живет в поддержке FAB и работает, если его просто цвет, даже в старых версиях Android. IE это работает во всех версиях, которые я тестировал:

 android:tint="@color/black 

Но когда я использую селектор, это не так. Что я делаю не так? Можно ли изменить цвет значка на основе состояния для FAB в старых версиях Android?

ColorStateList в android: оттенок не поддерживался до API 21.

См. https://code.google.com/p/android/issues/detail?id=204671.


Вы можете использовать AppCompatResources AppCompatResources и support-v4 DrawableCompat для поддержки pre-lollipop. Сначала удалите android:tint="@color/add_button_tint" из вашего макета. Затем программно установите ColorStateList :

 FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.search_button); ColorStateList csl = AppCompatResources.getColorStateList(this, R.color.add_button_tint); Drawable drawable = DrawableCompat.wrap(fab.getDrawable()); DrawableCompat.setTintList(drawable, csl); fab.setImageDrawable(drawable); 

См. Как использовать setImageTintList () в Android API <21