Другой цвет является обязательным цветом в Cardview? - PullRequest
1 голос
/ 04 июня 2019

Здравствуйте, я пытаюсь установить красный цвет в app:cardBackgroundColor на CardView, для этого у меня есть следующий код:

    <android.support.v7.widget.CardView
                    android:id="@+id/cvPassword"
                    style="@style/card_view.with_elevation.edit_text"
           app:cardBackgroundColor="@{registerViewModel.passwordCvColor}"
                    android:layout_marginTop="24dp"
                    app:layout_constraintBottom_toTopOf="@id/checkBox"
                    app:layout_constraintEnd_toEndOf="@id/guidelineRegisterEnd"
                    app:layout_constraintStart_toStartOf="@id/guidelineRegisterStart"
                    app:layout_constraintTop_toBottomOf="@id/cvRepeatEmail">

В ViewModel у меня есть следующий код:

public final MutableLiveData<Integer> passwordCvColor = new MutableLiveData<>();

А для изменения цвета у меня есть следующий код:

  binding.setPasswordHandler(new Handler(){
            @Override
            public void onFocusLost() {
                String password = registerViewModel.email.getValue();
                if(password == null || password.isEmpty()){
                    registerViewModel.passwordCvColor.setValue(R.color.red);
                }else{
                    registerViewModel.passwordCvColor.setValue(null);
                }
            }
        });

Это «работа», потому что наблюдатель меняет значение на R.color.red. Цвет меняется в представлении, но новый цвет - синий вместо красного.

Я пытаюсь напрямую установить цвет в макете, и эта работа и цвет красный, но с ViewModel этого не происходит.

Есть идеи?

Спасибо

1 Ответ

1 голос
/ 07 июня 2019

Когда вы передаете непосредственно идентификатор в registerViewModel.passwordCvColor.setValue(R.color.red);, цвет будет ссылкой на ресурс цвета в файле R , а не на сам цвет, что-то вроде 0x7f010000, и это вряд ли будь цвета, который вы хотите.

Вам следует вызвать метод, чтобы получить ресурс с использованием этого идентификатора. В более старых версиях вы могли использовать getResources().getColor(), но, поскольку это устарело, вы должны использовать ContextCompat.getColor().

Код будет выглядеть так:

registerViewModel.passwordCvColor.setValue(ContextCompat.getColor(RegisterActivity.this, R.color.red));
...