大乘篇:设置界面的开发利器Preference Library,设置项刷新机制浅析~

1,103 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第24天,点击查看活动详情

接下来会对Preference Library官方库进行一个系列讲解,本篇文章是Preference Library系列的第九篇,主要是介绍Preference Library的消息摘要的刷新机制。

练气篇:设置界面的开发利器Preference Library,了解一下~

筑基篇:设置界面的开发利器Preference Library,了解一下~

金丹篇:设置界面的开发利器Preference Library,了解一下~

元婴篇:设置界面的开发利器Preference Library,了解一下~

化神篇:设置界面的开发利器Preference Library,了解一下~

炼虚篇:设置界面的开发利器Preference Library,了解一下~

合体篇:设置界面的开发利器Preference Library,源码浅析一下

渡劫篇:设置界面的开发利器Preference Library,触摸事件浅析走起~

EditTextPreference作为入口分析

EditTextPreference这个设置项前面有讲过,就是点击会弹出一个编辑弹窗,dismiss时默认会将编辑弹窗中输入的文本刷新到EditTextPreference的摘要中。

之前有讲过Preference Library就是基于RecyclerView实现的多布局设置项,所以RecyclerView适配器的刷新逻辑肯定是发生在OnBindViewHolder()方法中,接下来我们就从这个方法中开始分析消息摘要的刷新逻辑。

这个方法OnBindViewHolder()很长,我们一段一段开始分析:

1. 刷新摘要summary

final TextView summaryView = (TextView) holder.findViewById(android.R.id.summary);
if (summaryView != null) {
    final CharSequence summary = getSummary();
    if (!TextUtils.isEmpty(summary)) {
        summaryView.setText(summary);
        summaryView.setVisibility(View.VISIBLE);
        summaryTextColor = summaryView.getCurrentTextColor();
    } else {
        summaryView.setVisibility(View.GONE);
    }
}

首先获取摘要对应的View视图组件,接下来调用getSummary()方法获取消息摘要内容:

public CharSequence getSummary() {
    if (getSummaryProvider() != null) {
        return getSummaryProvider().provideSummary(this);
    }
    return mSummary;
}

getSummaryProvider()返回的就是一个SummaryProvider对象,这个对象我们之前有提到过,可以自定义摘要具体显示内容,这里就是其背后的实现原理:获取摘要时会优先尝试获取SummaryProvider对象的方法provideSummary()返回的内容,如果对象不等于空就直接返回,否则就默认返回mSummary属性字段。

拿到具体的消息摘要内容后,就会将该内容设置到摘要对应的View视图组件中。

2. 刷新标题和图标

接下来就是刷新消息标题title和消息左边的图标icon,实现很简单这里就不做过多的阐述,直接跳过了,感兴趣的自行查看源码。

3. 刷新设置项选中状态

image.png

4. 自定义设置项文本长点击系统菜单

final boolean copyingEnabled = isCopyingEnabled();

if (copyingEnabled && mOnCopyListener == null) {
    mOnCopyListener = new OnPreferenceCopyListener(this);
}
itemView.setOnCreateContextMenuListener(copyingEnabled ? mOnCopyListener : null);
itemView.setLongClickable(copyingEnabled);
  • 首先判断设置项能否支持复制,支持的情况下就设置设置项能够触发长点击事件;

  • 允许设置项复制后,然后创建一个OnPreferenceCopyListener对象,这个对象会实现iew.OnCreateContextMenuListener, MenuItem.OnMenuItemClickListener两个接口:

    image.png

其中方法onCreateContextMenu()决定着长点击后弹出的文本菜单中只能显示一个复制选项;

另一个方法onMenuItemClick()就自定义复制选项的点击行为,它会默认将设置项的摘要summary复制到粘贴板上;

  • View.setOnCreateContextMenuListener()完成自定义系统菜单弹窗的设置;

总结

以上就是Preference设置项这个ViewHolder触发刷新后主要执行的代码逻辑,核心就是刷新摘要的显示、标题显示、图标显示等等,除此之外还自定义了设置项的长点击文本弹窗菜单替换系统默认的菜单弹窗,大体的逻辑就是这些,希望能对你有所帮助。