Попытка выполнить двустороннее связывание приводит к ошибке «невозможно инвертировать» - PullRequest
1 голос
/ 19 марта 2020

Привет, я пытаюсь сделать двустороннюю привязку. Свойство, которое я пытаюсь связать в XML файле.

android:visibility="@={chart.ShowProgress ? View.VISIBLE : View.GONE}"

В файле ChartViewModel:

private int mShowProgress = View.GONE;

public int getShowProgress() {
    if (mColor.colorId == mColorId) {
        return mShowProgress;
    }
    mShowProgress = View.GONE;
    return mShowProgress;
}

public void setShowProgress(@NonNull int isProgressVisible) {
    this.mShowProgress = isProgressVisible;
}

Однако, когда я пытаюсь построить, я получаю ошибку

The expression '((chartShowProgress) ? (android.view.View.VISIBLE) : 
(android.view.View.GONE))' cannot be inverted, so it cannot be used in a two-way binding

Details: The condition of a ternary operator must be constant: 
android.databinding.tool.writer.KCode@18e15570

Пожалуйста, кто-то может указать, что я я делаю не так? Спасибо!

1 Ответ

1 голос
/ 21 марта 2020

Я попытался воспроизвести проблему, и причина, по которой вы получили эту ошибку, заключается в том, что вы пытаетесь использовать двустороннюю привязку данных с троичным выражением.

android:visibility="@={chart.ShowProgress ? View.VISIBLE : View.GONE}"

И это нормальное поведение, чтобы увидеть эту ошибку, потому что двустороннее связывание данных предназначено не только для отображения значений из java в XML макеты, но также и для их сопоставления с XML вернуться в свои магазины в java. Таким образом, согласно вашему выражению вы хотите отобразить значение логического chart.ShowProgress на видимость некоторого виджета; но как сделать обратное с отображением XML обратно на java (как сопоставить видимость виджета с java, используя это троичное выражение chart.ShowProgress ? View.VISIBLE : View.GONE .. ответ, который вы не можете сделать, используя два связывание данных, и именно поэтому возникает это исключение.

Итак, чтобы решить вашу проблему, вам нужно удалить знак равенства из выражения, поэтому оно должно быть:

android:visibility="@{chart.ShowProgress ? View.VISIBLE : View.GONE}"
...