Попробуйте заменить
.populate('tags').where('tags.tagName').in(['funny', 'politics'])
на
.populate( 'tags', null, { tagName: { $in: ['funny', 'politics'] } } )
Вы можете подключить 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
) Вы можете изменить ' 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