Изменить цвет в МВВМ - PullRequest
       1

Изменить цвет в МВВМ

0 голосов
/ 25 сентября 2018

В моем приложении я использую шаблон "mvvm".В моем классе viewModel я получил метод с плавающей точкой:

@Bindable
    public String getOneHourPercentChange(){
        float percent = mCurrency.getQuotes().get(mRate.name()).getPercentChange1h();
        String result;

        if(percent>0)
            result = "+" + percent;
        else
            result = "" + percent;

        return result;
    }

Как изменить цвет текста в зависимости от значения переменной "процент"?если процент меньше нуля, то красный, в противном случае зеленый.

Вот мой код xml, где я использую процент:

<TextView
            android:id="@+id/one_hours_value"
            android:layout_width="40dp"
            android:layout_height="19dp"
            android:layout_marginEnd="8dp"
            android:layout_marginTop="16dp"
            android:text="@{viewModel.oneHourPercentChange}"
            app:layout_constraintEnd_toStartOf="@+id/one_hours_label"
            app:layout_constraintTop_toTopOf="parent" />

Ответы [ 2 ]

0 голосов
/ 25 сентября 2018

Создайте MutableLiveData<Float> percent во ViewModel, а затем подпишитесь на изменение активности (или фрагмента) простым цветом настройки цвета.В представлении:

@BindView(R.id.one_hours_value) //ButterKnife
TextView hoursValue;
private MainViewModel mainViewModel;

@Override
onCreateView(/..../){
...
initLiveData();
initViewModel();
 ...
}
//setting ViewModel
private void initViewModel() {
    mainViewModel = ViewModelProviders.of(getActivity()).get(MainViewModel.class);
}

private void initLiveData(){
mainViewModel.getPercent().observe(this, () -> {
           // set color here with if/case statement
        });

В представлении модели:

private MutableLiveData<Float> percent = new MutableLiveData<>();
...
private void setPercent(Float percent){
    this.percent.setValue(percent);
}

public MutableLiveData<Float> getPercent(){
    return percent;
}
//here some method setting percent or maybe in construcor
0 голосов
/ 25 сентября 2018

Я бы создал отдельную BindingAdapter

@BindingAdapter("myColorAttr")
    public static void bindColorAttr(View view, float value) {
        if(valeue >= 0) view.setBackgroundColor(...green...);
        else view.setBackgroundColor(...red...);
}

Так что у вас будет значение с плавающей точкой внутри вашей viewModel, и ваш xml будет ссылаться на него так:

app:myColorAttr="@{viewModel.someFloatValue}"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...