gpt4 book ai didi

android - AndroidX前后DialogPreference的区别

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:32:24 25 4
gpt4 key购买 nike

我们目前正在将我们的 Android 应用项目迁移到 Androidx 命名空间。但是我注意到不仅 namespace 似乎发生了变化。对于 DialogPreference,现在还缺少一些以前使用的接口(interface)

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

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

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

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

最佳答案

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

第一步

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

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

第二步

在基于PreferenceFragmentCompat 的主要 fragment 处理首选项中,应该覆盖onDisplayPreferenceDialog 方法以显示自定义对话框,例如:

    private static final String DIALOG_FRAGMENT_TAG = "CustomPreference";

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

if (preference instanceof CustomPreference) {
final DialogFragment f = CustomDialog.newInstance(preference.getKey());
f.setTargetFragment(this, 0);
f.show(getParentFragmentManager(), DIALOG_FRAGMENT_TAG);
} else {
super.onDisplayPreferenceDialog(preference);
}
}

关于android - AndroidX前后DialogPreference的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52754655/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com