我正在使用android双向数据绑定,但是数据更改不会更新视图元素。我有一个正确显示在TextInputEditText上的简单字符串,但是当绑定的viewmodel livedata变量更新时,视图未更新。变量info应该在单选按钮单击侦听器上显示“你好,我的朋友”。但是它没有更新ui。
片段:
public class MainFragment extends Fragment {
private MainViewModel mViewModel;
private MainFragmentBinding mDataBinding;
public static MainFragment newInstance() {
return new MainFragment();
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
@Nullable Bundle savedInstanceState) {
mDataBinding = DataBindingUtil.inflate(getLayoutInflater(), R.layout.main_fragment, container, false);
return mDataBinding.getRoot();
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
mViewModel = new ViewModelProvider(this).get(MainViewModel.class);
mViewModel.getInfo().observe(getViewLifecycleOwner(), info -> {
Toast.makeText(getActivity().getApplicationContext(), "First in", Toast.LENGTH_SHORT).show();
});
mDataBinding.radioButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mViewModel.getInfo().setValue("Hello my friend");
}
});
mDataBinding.setViewModel(mViewModel);
}
}
viewmodel:
public class MainViewModel extends ViewModel {
private MutableLiveData<String> info;
public MutableLiveData<String> getInfo() {
if (info == null) {
info = new MutableLiveData<>();
info.setValue("First Info Initialization");
}
return info;
}
public void setInfo(String info) {
this.info.setValue(info);
}
并且视图类似于:
<layout>...
<data>
<variable
name="viewModel"
type="com.example.temp.ui.main.MainViewModel" />
</data>
<com.google.android.material.textfield.TextInputLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/info"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Info"
android:text="@={viewModel.info}" />
</com.google.android.material.textfield.TextInputLayout>
</layout>
绑定生命周期所有者是托管该片段的活动:
MainActivityBinding binding = DataBindingUtil.setContentView(this, R.layout.main_activity);
binding.setLifecycleOwner(this);
然后我必须将其删除,并将Fragment设置为生命周期所有者。