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

lit*_*net 13 android androidx

我们目前正在通过Android应用程序项目迁移到Androidx命名空间。但是我注意到不仅名称空间似乎已更改。对于DialogPreference,现在也缺少以前使用的一些接口

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

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

其他人是否已经遇到此问题并找到了解决方案?我错过了文档中的任何内容吗?我们可以/应该使用另一个概念吗?

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

Liv*_*vio 12

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

步骤1

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

  1. 一个类(例如CustomPreference)应该扩展androidx.preference.DialogPreference,并且将仅包含与首选项处理(数据管理)相关的代码。
  2. 另一个类(例如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);
        }
    }
Run Code Online (Sandbox Code Playgroud)

  • @little_planet您能同时显示两个自定义类的内容吗? (8认同)
  • 对于现代AndroidX也几乎100%正确:https://medium.com/@JakobUlbrich/building-a-settings-screen-for-android-part-3-ae9793fd31ec (2认同)
  • @Androidz 我成功地遵循了这个答案并迁移到 AndroidX ColorPicker 首选项,嵌入到我的“待办事项议程”中。现在可以了。请参阅此提交:https://github.com/andstatus/todoagenda/commit/27cce2c0a0fcddfe22ce71efd86b88d04020c7b2 (2认同)