Android双向数据绑定-数据更改不会更新UI视图

问题描述 投票:0回答:1

我正在使用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>
android data-binding android-databinding android-architecture-components 2-way-object-databinding
1个回答
0
投票

绑定生命周期所有者是托管该片段的活动:

MainActivityBinding binding = DataBindingUtil.setContentView(this, R.layout.main_activity);
binding.setLifecycleOwner(this);

然后我必须将其删除,并将Fragment设置为生命周期所有者。

© www.soinside.com 2019 - 2024. All rights reserved.