我们目前正在使用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);
}
}