如何在DialogFragment中使用数据绑定

时间:2019-09-09 22:41:30

标签: java android-databinding

在我的应用中,我有ElementListFragment项由代码对象Element表示。我已将这些元素数据绑定到列表,它们显示正确的信息。 但是,为了继续填写每个项目中的信息,我在每个元素上放置一个按钮,以显示带有附加字段的Dialog。 但是,当Dialog打开时,所有字段均为空白(至少应填充一个字段),而我填写的任何字段都不会保存数据(也不会影响列表中的更改)。

Appart通过未绑定(显示或写入)的值,该应用程序可以正常工作。实际上,我已经尝试过this question中建议的多种变体。这是代码:

public class ElementDialogFragment extends DialogFragment {
        private Element mElement;
        private Dialog dialog;

        @Override
        public Dialog onCreateDialog(Bundle savedInstanceState) {
            // Use the Builder class for convenient dialog construction
            AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());

            LayoutInflater inflater = getActivity().getLayoutInflater();
            View v = inflater.inflate(R.layout.dialog_element, null);

            final DialogSkillelementBinding binding = DialogElementBinding.inflate(LayoutInflater.from(getContext()));

            builder.setView(v)
                    // Add action buttons
                    .setPositiveButton(R.string.save, new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int id) {
                            //this was just an attempt to make it work
                            binding.executePendingBindings();
                            dialog.dismiss();
                        }
                    });

            TextView Title = v.findViewById(R.id.skill_e_dialog_title);
            Title.setText(ResourceLocator.getSkillName(mElement.getSkill()));

            dialog = builder.create();
            dialog.setContentView(binding.getRoot());

            binding.setElement(mElement);
            binding.executePendingBindings();

            return dialog;
        }
    }

在调试时,我已经确认mElement的属性正确,但是它也绑定到对话框下方显示的列表。标题也可以正确显示。

双重绑定对象是否存在问题?

该功能上的某些步骤可能不正确吗?

DialogBu​​ilder是否与数据绑定不兼容?

1 个答案:

答案 0 :(得分:0)

您应为绑定类设置LyfecycleOwner以便更新数据。

binding.setLifecycleOwner(requireActivity())