Android FAB setBackgroundTintList с ColorStateList не работает

Я хочу изменить цвет FAB сканирования NFC, когда NFC не включен. Мне удалось успешно изменить цвет при запуске приложения, но если пользователь коснется FAB и включит NFC, цвет не изменится на основной цвет. В логах написано, что да, но изменений не происходит.

My minSdkVersion = 15

XML:

<android.support.design.widget.FloatingActionButton
     android:id="@+id/fab_scan_nfc"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:layout_marginLeft="10dp"
     app:backgroundTint="@color/colorPrimary"
     app:borderWidth="0dp"
     app:elevation="6dp"
     app:fabSize="mini"
     app:fab_colorNormal="@color/colorPrimary"
     app:fab_colorPressed="@color/colorPrimaryDark"
     app:fab_colorRipple="@color/colorAccent"
     app:srcCompat="@drawable/ic_nfc_n" />

Котлин:

if (!isNFCEnabled) {
    Log.d(TAG, "Change NFC fab colour to disabled.")
    fab_scan_nfc.backgroundTintList = ColorStateList.valueOf(R.color.colorDisabled)
} else {
    Log.d(TAG, "Change NFC fab colour to primary.")
    fab_scan_nfc.backgroundTintList = ColorStateList.valueOf(R.color.colorPrimary)
}

Это то же самое, что и Java:

if (!isNFCEnabled) {
    Log.d(TAG, "Change NFC fab colour to disabled.")
    fab_scan_nfc.setBackgroundTintList = ColorStateList.valueOf(R.color.colorDisabled);
} else {
    Log.d(TAG, "Change NFC fab colour to primary.")
    fab_scan_nfc.setBackgroundTintList = ColorStateList.valueOf(R.color.colorPrimary);
}

В качестве побочного эффекта — когда код применяет отключенный цветовой оттенок фона, на FAB есть этот меньший кружок, который выглядит как сенсорный индикатор. Это как-то связано с использованием списка состояний цвета list?


person marienke    schedule 22.05.2017    source источник
comment
Этот сенсорный индикатор представляет собой небольшую тень. Здесь определенно что-то не так.   -  person Eugen Pechanec    schedule 22.05.2017
comment
ColorStateList.valueOf() принимает фактическое значение цвета в качестве аргумента. R.color — это идентификатор ресурса для цвета в ресурсах вашего приложения, а не значение цвета. Используйте ContextCompat.getColor(), чтобы получить фактическое значение.   -  person Mike M.    schedule 22.05.2017
comment
Я не вижу, чтобы вы правильно использовали ColorStateList (поместите несколько цветов для разных состояний в один CSL). Вместо этого вы просто вручную назначаете другой цвет после ручного наблюдения за включенным состоянием. Вы можете определить CSL в XML.   -  person Eugen Pechanec    schedule 22.05.2017
comment
Итак, я неправильно использую состояния цвета. У меня должен быть отдельный XML-файл, определяющий состояния и связанные цвета, а затем программно выполнять setEnabled(isNfcEnabled), когда я его проверяю. НО, тогда я не могу показать диалоговое окно, когда пользователь нажимает NFC FAB для сканирования тега NFC, чтобы помочь им с настройками NFC.   -  person marienke    schedule 22.05.2017