作者:mobiledu2502928897 | 来源:互联网 | 2022-12-02 15:30
我们目前正在通过Android应用程序项目迁移到Androidx命名空间。但是我注意到不仅名称空间似乎已更改。对于DialogPreference,现在也缺少以前使用的一些接口
新界面:https://developer.android.com/reference/androidx/preference/DialogPreference
旧界面:https://developer.android.com/reference/kotlin/android/preference/DialogPreference
例如,似乎缺少以下方法:onBindDialogView,showDialog,onDialogClosed。
由于我们使用其中一些方法来影响对话框的默认行为,因此我不清楚现在应如何实现此功能。例如,我们在关闭对话框之前验证输入,我们将值而不是sharedpreferences保存在数据库中,并向对话框中添加一些动态元素。
其他人是否已经遇到此问题并找到了解决方案?我错过了文档中的任何内容吗?我们可以/应该使用另一个概念吗?
可以使用Fragments而不是DialogPreference,但是对于少量内容(例如,用户可以从中选择的树项目列表)来说,这似乎给我带来了很多开销……
1> Livio..:
从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);
}
}
@little_planet您能同时显示两个自定义类的内容吗?
对于现代AndroidX也几乎100%正确:https://medium.com/@JakobUlbrich/building-a-settings-screen-for-android-part-3-ae9793fd31ec