我目前有一个非常奇怪的行为,与日期选择器和android数据绑定有关。
我简化了很多代码,所以这是我的活动xml:
<ScrollView ...>
<android.support.constraint.ConstraintLayout>
<FrameLayout
android:id="@+id/step1_fragment"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/margin_small"
app:layout_constraintVertical_chainStyle="spread_inside"
app:layout_constraintEnd_toStartOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"/>
</android.support.constraint.ConstraintLayout>
</ScrollView>
<Button android:id="@+id/forward_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="@dimen/margin_normal"
android:enabled="@{viewModel.isAnswered}"
android:maxWidth="100dp"
android:onClick="@{(v)->presenter.onClickForward(v)}"
android:text="@string/common_forward"
android:textAlignment="center"/>
框架布局使用日期选择器保存此编辑文本:
<EditText
android:id="@+id/issue_date_et"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginEnd="@dimen/padding_small"
android:layout_marginStart="@dimen/padding_small"
android:focusable="false"
android:inputType="date"
android:onClick="@{(view) -> presenter.onClickDateEditText(view)}"
android:text="@{viewModel.issuedDate}"
app:layout_constraintEnd_toEndOf="@id/right_guideline"
app:layout_constraintStart_toStartOf="@id/left_guideline"
app:layout_constraintTop_toBottomOf="@+id/issue_date_label_tv"/>
基本上,这是更改按钮状态的观察者:
public void onPropertyChanged(Observable observable, int i) {
if (i != BR.answered) {
mModel.setAnswered(!Utils.checkStringIsNull(mModelID.getIssuedDate())
);
}
}
我非常确定整个过程工作正常,确实,当填充 issuedDate 模型,然后将 answered 模型设置为true时,该函数会正确触发。这将通知视图更改其启用状态。我在DataBindingIml类上进行了一些调试工作,并且看到它调用了 setEnabled 方法,并且按钮上的参数为true。我看到按钮的启用状态在屏幕上闪烁了几毫秒,然后突然返回其禁用状态。
我认为当编辑文本issue_date_et写在选择的日期内时,按钮返回到禁用状态。在片段内的edittext上书写会导致父活动返回先前绘制的状态,这是可能的吗?还是我在数据出价方面做得很烂?