Значение по умолчанию для видимости макета с привязкой данных не работает - PullRequest
0 голосов
/ 23 апреля 2019

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

<RelativeLayout
            android:id="@+id/error_layout"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:visibility="@{homeViewModel.comfortErrorVisibility, default=invisible}"/>

Модель вида выглядит следующим образом

public class HomeViewModel extends BaseObservable {

    private ObservableField<String> comfortErrorMessage = new ObservableField<>();

    public HomeViewModel(){
        validateSpace();
    }


    @Bindable
    public int getComfortErrorVisibility(){
        // change the visibility based on error message
        return TextUtils.isEmpty(comfortErrorMessage.get()) ? View.VISIBLE : View.INVISIBLE;
    }

    private void validateSpace(){
        //some business logic to set the comfrotErrorMessage
    }
}

Я что-то здесь упускаю?По умолчанию я хочу установить видимость как невидимую для размещения ошибок.Но это показано по умолчанию.

Ответы [ 4 ]

0 голосов
/ 24 апреля 2019
public class HomeViewModel extends BaseObservable {

private ObservableField<String> comfortErrorMessage = new ObservableField<>();

public HomeViewModel(){
    validateSpace();
}

}

импорт текстовых утилит в вашем <data> теге привязки и ...

<RelativeLayout
        android:id="@+id/error_layout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:visibility="@{TextUtils.isEmpty(viewmodel.comfortErrorMessage) ? View.VISIBLE : View.INVISIBLE"/>
0 голосов
/ 24 апреля 2019

Afaik, default только для предварительного просмотра на студии Android и не будет ничего делать во время выполнения.Больше не могу найти официальную документацию, но есть немало сообщений SO об этом.

Из того, что я могу сказать, когда вы устанавливаете привязку, структура привязки данных вызовет getComfortErrorVisibility, чтобы получить видимостьсообщения об ошибке.Ваше условие установлено так, что когда сообщение об ошибке пусто или null видимость видна:

TextUtils.isEmpty(comfortErrorMessage.get()) ? View.VISIBLE : View.INVISIBLE;

Поскольку ваш comfortErrorMessage инициализируется как ObservableField(), его начальное значение будет нулевым и, следовательно,первое, что вы видите, это видимое поле ошибки.

Может быть, вам следует изменить условие для видимости?

0 голосов
/ 24 апреля 2019

это потому, что вы ошиблись в методе getComfortErrorVisibility.При запуске ваш comfortErrorMessage пуст, поэтому ваш метод возвращает visible a и будет отображаться текстовое представление, попробуйте изменить ваш метод на:

@Bindable
    public int getComfortErrorVisibility(){
        return TextUtils.isEmpty(comfortErrorMessage.get()) ? View.INVISIBLE: View.VISIBLE;
    }
0 голосов
/ 23 апреля 2019

используйте visibility = invisible или ушли:

        <RelativeLayout
        android:id="@+id/error_layout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:visibility="invisible"/>

и затем программно измените видимость там, где вам это нужно

 if(TextUtils.isEmpty(some_error))
  {  
 findViewbyId(R.id.error_layout).setVisibilty(View.VISIBILE)}
 }
...