Android: односторонняя привязка заставляет Switch OnCheckedChangeListener не работать

Попробуйте заменить

.populate('tags').where('tags.tagName').in(['funny', 'politics']) 

на

.populate( 'tags', null, { tagName: { $in: ['funny', 'politics'] } } )
0
задан user2558303 27 February 2019 в 03:56
поделиться

1 ответ

Вы можете подключить ObservableBoolean с помощью двусторонней привязки.

XML

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">

    <data>
        <variable
            name="activity"
            type="someActivity"/>
    </data>

    <LinearLayout
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:clickable="true"
            android:focusable="true"
            android:textColor="@{activity.languageChecked ? @color/term_condition_gray_1 : @color/term_condition_green_1}"
            android:textSize="@dimen/_10ssp" />

        <Switch
            android:id="@+id/swLanguage"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="@dimen/_8sdp"
            android:layout_marginRight="@dimen/_8sdp"
            android:checked="@={activity.languageChecked}"
            android:thumb="@drawable/term_condition_switch_thumb"
            android:track="@drawable/term_condition_switch_track" />


        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:clickable="true"
            android:focusable="true"
            android:textColor="@{activity.languageChecked ? @color/term_condition_green_1 : @color/term_condition_gray_1}"
            android:textSize="@dimen/_10ssp" />
    </LinearLayout>
</layout>

Деятельность

public ObservableBoolean languageChecked = new ObservableBoolean(false)

Как это работает?

[ 1120]
  • Если состояние переключателя было изменено, переменная languageChecked изменится.
  • Если переменная languageChecked была изменена, внутренний процесс DataBinding будет отражать изменения languageChecked во всех объектах привязки (в данном случае, Два textview)
    1. Вы можете изменить ' languageChecked 'переменная в коде Java, а также наблюдать изменения этой переменной с помощью addOnPropertyChangedCallback

      --- Edit ---

      Если вы не используете Two- При связывании с использованием ObservableBoolean и свойства checked самого коммутатора DataBinding будет использовать InverseBinding для достижения этой цели.

      Когда сборка завершится успешно, вы можете посмотреть написанный код в Binding Object. (в этом случае мое имя макета - test_layout, поэтому имя класса - TestLayoutBindingImpl, поскольку я использовал DataBindingV2)

      // Inverse Binding Event Handlers
      private androidx.databinding.InverseBindingListener swLanguageandroidCheckedAttrChanged = new androidx.databinding.InverseBindingListener() {
       @Override
       public void onChange() {
        synchronized(TestLayoutBindingImpl.this) {
         mDirtyFlags |= 0x2 L;
        }
        requestRebind();
       }
      };
      
      if ((dirtyFlags & 0x6 L) != 0) {
      
       // read swLanguage.checked
       swLanguageChecked = swLanguage.isChecked();
       if ((dirtyFlags & 0x6 L) != 0) {
        if (swLanguageChecked) {
         dirtyFlags |= 0x10 L;
         dirtyFlags |= 0x40 L;
        } else {
         dirtyFlags |= 0x8 L;
         dirtyFlags |= 0x20 L;
        }
       }
      
      
       // read swLanguage.checked ? @android:color/term_condition_gray_1 : @android:color/term_condition_green_1
       swLanguageCheckedMboundView1AndroidColorTermConditionGray1MboundView1AndroidColorTermConditionGreen1 = ((swLanguageChecked) ? (getColorFromResource(mboundView1, R.color.term_condition_gray_1)) : (getColorFromResource(mboundView1, R.color.term_condition_green_1)));
       // read swLanguage.checked ? @android:color/term_condition_green_1 : @android:color/term_condition_gray_1
       swLanguageCheckedMboundView2AndroidColorTermConditionGreen1MboundView2AndroidColorTermConditionGray1 = ((swLanguageChecked) ? (getColorFromResource(mboundView2, R.color.term_condition_green_1)) : (getColorFromResource(mboundView2, R.color.term_condition_gray_1)));
      }
      // batch finished
      if ((dirtyFlags & 0x6 L) != 0) {
       // api target 1
      
       this.mboundView1.setTextColor(swLanguageCheckedMboundView1AndroidColorTermConditionGray1MboundView1AndroidColorTermConditionGreen1);
       this.mboundView2.setTextColor(swLanguageCheckedMboundView2AndroidColorTermConditionGreen1MboundView2AndroidColorTermConditionGray1);
      }
      if ((dirtyFlags & 0x4 L) != 0) {
       // api target 1
      
       androidx.databinding.adapters.CompoundButtonBindingAdapter.setListeners(this.swLanguage, (android.widget.CompoundButton.OnCheckedChangeListener) null, swLanguageandroidCheckedAttrChanged);
      }
      

      В последнем утверждении они используют методы setListeners() для регистрации OnCheckedChangeListener () с swLanguageandroidCheckedAttrChanged. swLanguageandroidCheckedAttrChanged используя InverseBindingAdapter для наблюдения за изменениями.

      Так как setListener() использует методы setOnCheckedChangeListener для установки слушателя, вы не можете использовать два setOnCheckedChangeListener в коде между Binding Object и Java-кодом.

      Итак, если вы хотите использовать setOnCheckedChangeListener в своем Java-коде (активности), используйте ObservableBoolean и наблюдайте за изменениями по addOnPropertyChangedCallback.

      Если вы хотите сравнить результат двух решений, см. Gist

    0
    ответ дан WindSekirun 27 February 2019 в 03:56
    поделиться
    Другие вопросы по тегам:

    Похожие вопросы: