AndroidX之前和之后的DialogPreference之间的区别

我们目前正在使用Android应用项目迁移到Androidx命名空间.但是我注意到不仅命名空间似乎已经改变了.对于DialogPreference,现在也缺少一些之前使用的接口

>新界面:https://developer.android.com/reference/androidx/preference/DialogPreference
>旧接口:https://developer.android.com/reference/kotlin/android/preference/DialogPreference

例如,似乎缺少以下方法:onBindDialogView,showDialog,onDialogClosed.

由于我们使用其中一些方法来影响对话框的默认行为,因此我不清楚我现在应该如何实现此功能.例如,我们在关闭对话框之前验证输入,我们将值保存在数据库中而不是共享偏好中,并向对话框添加一些动态元素.

有没有其他人已经遇到过这个问题并找到了解决方案?我在文档中遗漏了什么吗?我们可以/应该使用另一个概念吗?

可以使用Fragments而不是DialogPreference,但是对于少量内容(例如,用户可以选择的树项目列表),这对我来说似乎是一个很大的开销……

解决方法:

从androidx源文件开始,我已经使用以下过程将基于旧DialogPreference的自定义类迁移到新的androidx.preference.DialogPreference:

第1步

基于旧版DialogPreference的旧自定义对话框类(例如CustomDialogPreference)应拆分为两个单独的类:

>一个类(例如CustomPreference)应该扩展androidx.preference.DialogPreference,并且只包含与首选项处理(数据管理)相关的代码.
>另一个类(例如CustomDialog)应该扩展androidx.preference.PreferenceDialogFragmentCompat,并且只包含与对话框处理(用户界面)相关的代码,包括onDialogClosed.此类应公开静态方法newInstance以返回此类的实例.

第2步

在基于PreferenceFragmentCompat的主片段处理首选项中,应重写onDisplayPreferenceDialog方法以显示自定义对话框,例如:

    private static final String DIALOG_FRAGMENT_TAG = "CustomPreference";

    @Override
    public void onDisplayPreferenceDialog(Preference preference) {
        if (getFragmentManager().findFragmentByTag(DIALOG_FRAGMENT_TAG) != null) {
            return;
        }

        if (preference instanceof CustomPreference) {
            final DialogFragment f = CustomDialog.newInstance(preference.getKey());
            f.setTargetFragment(this, 0);
            f.show(getFragmentManager(), DIALOG_FRAGMENT_TAG);
        } else {
            super.onDisplayPreferenceDialog(preference);
        }
    }
上一篇:书签书签


下一篇:java – Android X:工具:替换为line:for属性,但没有指定新值