最近在升级替换使用 androidx DialogPreference 的时候,发现androidx 对DialogPreference进行了解耦,之前的数据持久化和Ui的绑定在DialogPreference中就能实现,而现在需要通过PreferenceDialogFragmentCompat和DialogPreference配合才能使用。
说实话对preference的应用在做这个升级之前我并没有遇见过,所以,只能摸索着去探索。
1.首先分析下这两个类要怎么使用
参考文档:https://medium.com/@JakobUlbrich/building-a-settings-screen-for-android-part-3-ae9793fd31ec
首先看一张图:
这张图是主要的架构图:(以一个设置页面为例子)
1.PreferenceDialogFragmentCompat:点击DialogPrecence的时候展示的 Dialog
2.Preference:显示在设置页面上的item,同时也是数据持久化的容器
3.PreferenceFragmentCompat:展示设置的主要Fragment
4.PreferenceManager:sharePreference(Preference)和PreferenceFragmentCompat的数据管理器,两个类共享这个Manager
主要的流程:
1.preference 点击--> 调用onclick方法
protected void onClick() {
getPreferenceManager().showDialog(this);
}
这时候会通过PrefereceManager去调用 showDialog方法
*/
public void showDialog(Preference preference) {
if (mOnDisplayPreferenceDialogListener != null) {
mOnDisplayPreferenceDialogListener.onDisplayPreferenceDialog(preference);
}
}
2.传递事件到Fragment:
通过listener传递出去,在这边我们很容易猜到 PreferenceFragmentCompat 实现了 DisplayPreferenceDialogListener
到时候事件通过监听传递到PreferenceFragmentCompat
3.PreferenceFragmentCompat 实现 display方法
public void onStart() {
super.onStart();
mPreferenceManager.setOnPreferenceTreeClickListener(this);
mPreferenceManager.setOnDisplayPreferenceDialogListener(this);
}
@Override
public void onDisplayPreferenceDialog(Preference preference) {
boolean handled = false;
if (getCallbackFragment() instanceof OnPreferenceDisplayDialogCallback) {
handled = ((OnPreferenceDisplayDialogCallback) getCallbackFragment())
.onPreferenceDisplayDialog(this, preference);
}
if (!handled && getActivity() instanceof OnPreferenceDisplayDialogCallback) {
handled = ((OnPreferenceDisplayDialogCa