Как сократить условное выражение с помощью Android Databinding - PullRequest
0 голосов
/ 11 апреля 2020

Я просто хочу сделать следующий фрагмент короче и более читабельным.

<LinearLayout android:visibility="@{ viewModel.prediction.intent == PredictionIntentType.MEETING_FOLLOWUP || (viewModel.prediction.intent == PredictionIntentType.FOLLOWUP &amp;&amp; !viewModel.isMeetingViewGroupShown) || (viewModel.prediction.intent == PredictionIntentType.MEETING &amp;&amp; viewModel.isMeetingViewGroupShown) ? View.VISIBLE : View.GONE }" />

Когда я делаю его многострочным (см. Ниже), он не будет компилироваться

<LinearLayout 
  android:visibility="@{ viewModel.prediction.intent == PredictionIntentType.MEETING_FOLLOWUP 
    || (viewModel.prediction.intent == PredictionIntentType.FOLLOWUP &amp;&amp; !viewModel.isMeetingViewGroupShown) 
    || (viewModel.prediction.intent == PredictionIntentType.MEETING &amp;&amp; viewModel.isMeetingViewGroupShown) 
        ? View.VISIBLE : View.GONE }" />

В конечном итоге, Я просто хочу, чтобы это выглядело примерно так:

<LinearLayout android:visibility="@{ viewModel.someViewVisibility }" />

Я использую Java, а viewModel.prediction имеет тип LiveData<Prediction> и viewmodel.isMeetingViewGroupShown имеет тип LiveData<Boolean>, если это помогает.

Ответы [ 2 ]

0 голосов
/ 12 апреля 2020

В конечном счете, я просто хочу, чтобы это выглядело примерно так:

<LinearLayout android:visibility="@{ viewModel.someViewVisibility }" />

Так что сделайте именно это:

ViewModel:

val someViewVisibility: Int
    @Bindable get() {
        return if (prediction.intent == PredictionIntentType.MEETING_FOLLOWUP || (prediction.intent == PredictionIntentType.FOLLOWUP && !isMeetingViewGroupShown) || (prediction.intent == PredictionIntentType.MEETING && isMeetingViewGroupShown)) View.VISIBLE else View.GONE
    }

Со свойством, определенным в вашей модели представления, ваш упрощенный лог c будет работать. Кроме того, теперь вы можете написать модульный тест для someViewVisibility и доказать, что он работает. :)

Надеюсь, это поможет!

0 голосов
/ 12 апреля 2020

Вы должны иметь все свои логи c в кодовых файлах, а не в xml. Так что вам нужно логическое значение в вашем файле кода, которое выглядит примерно так:

val visible = prediction.intent == PredictionIntentType.MEETING_FOLLOWUP 
    || (prediction.intent == PredictionIntentType.FOLLOWUP && !isMeetingViewGroupShown) 
    || (prediction.intent == PredictionIntentType.MEETING && isMeetingViewGroupShown

В вашем файле кода также добавьте этот метод.

@BindingAdapter("visible")
fun bindVisible(linearLayout: LinearLayout, visible: Boolean) {
   if(visible){
      linearLayout.setVisibility(View.VISIBLE);
   }else{
      linearLayout.setVisibility(View.GONE);   
   }
}

В вашем xml добавьте это к вашему линейному расположению

app:visible="@{viewModel.visible}
...