要点总结

  1. 整体实现思路
  2. 封装DialogFragment基类
  3. 实现隐私协议对话框的布局
  4. 对协议内容中的链接设置可点击
  5. 同意和拒绝按钮点击事件的实现

整体实现思路

当启动页出现的时候,隐私协议需要作为启动页关联的fragment出现。

  • 类的位置:隐私协议是启动页的一部分,应该存放在启动页对应的fragment包下
  • 实现思路:在启动页初始化数据的时候,调用下fragment展示,并且设置一个按钮view的监听
  • 步骤一:封装一个DialogFragment基类,类似activity的封装
  • 步骤二:实现fragment的布局
  • 步骤三:在子类中实现对应的数据处理、颜色设置、点击事件,拒绝直接退出app,同意,则回调到启动页继续接下来的逻辑

封装DialogFragment基类

DialogFragment是Android系统提供的一种特殊的Fragment,用于创建对话框式的交互界面,它可以将对话框和Fragment的生命周期进行关联。

初始化操作

这里在onViewCreated方法中进行数据的初始化操作,该方法在onCreateView方法后面调用,表示该Fragment视图已经被创建完成并添加到Activity的视图层次结构中,对应fragment的生命周期是onActivityCreated方法。

注:在DialogFragment中,onActivityCreated()方法可能在视图创建之前就被调用,因此如果在该方法中需要使用到视图对象,则需要进行非空判断。此外,如果使用了setRetainInstance(true)保留实例状态,那么onViewCreated()方法只会被调用一次。

/*** View创建了** @param view* @param savedInstanceState*/@Overridepublic void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {super.onViewCreated(view, savedInstanceState);initViews();initDatum();initListeners();}

返回对话框界面

onCreateView()是DialogFragment生命周期中的一个回调方法,用于创建该DialogFragment的用户界面。在该方法中,需要返回一个View对象,作为当前DialogFragment的用户界面。第三个参数root表示是否添加该视图到container中。在DialogFragment中,这个参数通常为false,因为DialogFragment自己会管理并显示该视图。

注:如果你想要自定义DialogFragment的样式,可以重写其onCreateDialog()方法而非onCreateView()方法。

@Nullable@Overridepublic View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {//获取viewView view = getLayoutView(inflater,container,savedInstanceState);//返回viewreturn view;}/*** 获取view** @param container* @param savedInstanceState* @return*/protected abstract View getLayoutView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState);//获取视图的实现@Overrideprotected View getLayoutView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {return inflater.inflate(R.layout.fragment_dialog_term_service, container, false);}

封装一个findViewById方法

 /*** 给fragment增加findViewById** IdRes表示只能传 R.id这种类型的int类型数据*/public <T extends View> T findViewById(@IdRes int id) {return getView().findViewById(id);}

实现隐私协议对话框的布局

主要组成:标题,滚动文本,按钮
“?attr/” 是一个资源类型前缀,表示要引用主题中的属性值。

<!--#000000-->
android:textColor="?attr/colorOnSurface"
<!--行间距-->
android:lineSpacingMultiplier="@dimen/line_space"
<!--圆角弧度-->
app:cornerRadius="@dimen/d27_5"
<!--设置无边框透明-->
style="?android:attr/borderlessButtonStyle"

调整布局的宽高:

        //修改宽度,默认比AlertDialog.Builder显示对话框宽度窄,看着不好看//参考:https://stackoverflow.com/questions/12478520/how-to-set-dialogfragments-width-and-heightViewGroup.LayoutParams params = getDialog().getWindow().getAttributes();params.width = (int) (ScreenUtil.getScreenWith(getContext()) * 0.9);params.height = ViewGroup.LayoutParams.WRAP_CONTENT;getDialog().getWindow().setAttributes((android.view.WindowManager.LayoutParams) params);

对协议内容中的链接设置可点击

防止弹窗外依旧可以点击:

//点击弹窗外边就不会关闭setCancelable(false);

将协议文本设置为富文本,设置富文本才可以点击,并且设置颜色:

//设置富文本
view.setMovementMethod(LinkMovementMethod.getInstance());
//链接的颜色
view.setLinkTextColor(color);

对Html文本进行格式化处理(此文本已经被设置成富文本),然后调用工具类,获取url的spans,遍历该spans,设置监听,回调到result即可得到点击事件:

  Spanned content = Html.fromHtml(getString(R.string.term_service_privacy_content));SpannableStringBuilder result = SuperTextUtil.setHtmlLinkClick(content, new SuperTextUtil.OnLinkClickListener() {@Overridepublic void onLinkClick(String data) {Log.d(TAG, "onLinkClick: " + data);}});/*** 设置文本点击** @param data* @param listener* @return*/public static SpannableStringBuilder setHtmlLinkClick(Spanned data, OnLinkClickListener listener) {SpannableStringBuilder sb = new SpannableStringBuilder(data);//URLSpan[] spans = sb.getSpans(0, sb.length(), URLSpan.class);for (URLSpan span : spans) {int start = sb.getSpanStart(span);int end = sb.getSpanEnd(span);int flags = sb.getSpanFlags(span);sb.setSpan(new SuperClickableSpan() {@Overridepublic void onClick(@NonNull View widget) {listener.onLinkClick(span.getURL());}}, start, end, flags);}return sb;}

同意和拒绝按钮点击事件的实现

拒绝按钮点击,直接杀掉进程完成退出:

/*** 杀死当前应用*/public static void killApp() {Process.killProcess(Process.myPid());}

同意按钮点击,则回调到启动页的调用,具体实现是,在启动页调用隐私弹窗的时候,去透传一个view的点击监听器,设置为全局变量,然后在同意按钮的点击事件里面嵌套:

 primaryView.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {onAgreementClickListener.onClick(view);}});

云音乐_实现隐私协议对话框(三)相关推荐

  1. 局域网arp攻击_图解ARP协议(三)ARP防御篇-如何揪出“内鬼”并“优雅的还手”...

    一.ARP防御概述 通过之前的文章,我们已经了解了ARP攻击的危害,黑客采用ARP软件进行扫描并发送欺骗应答,同处一个局域网的普通用户就可能遭受断网攻击.流量被限.账号被窃的危险.由于攻击门槛非常低, ...

  2. sla的三个服务等级_你知道吗?阿里云最新发布的服务等级协议SLA已领先全球水平...

    看到这个标题,懵吗?其实我也懵,但是我搜刮了大量的资料,发现这小数点的背后,实在是不简单.请听我一一道来.事情是这样的,据了解: 2019年12月1日,阿里云ECS发布最新的服务等级协议SLA,单实例 ...

  3. 案例分享:某品牌音响系列协议调试工具(搜寻主机,查询通道,基本控制API,云音乐API,语言节目API等,可增删改指令)

    若该文为原创文章,转载请注明原文出处 本文章博客地址:https://blog.csdn.net/qq21497936/article/details/115920854 长期持续带来更多项目与技术分 ...

  4. 为什么tcp不采用停等协议_为什么TCP建立连接协议是三次握手,而关闭连接却是四次握手呢?...

    看到了一道面试题:"为什么TCP建立连接协议是三次握手,而关闭连接却是四次握手呢?为什么不能用两次握手进行连接?",想想最近也到金三银四了,所以就查阅了相关资料,整理出来了这篇文章 ...

  5. Chrome插件:云音乐听歌识曲

    当你用网页在视频网站刷视频的时候,有没有碰到过一个 BGM 激起你内心的波澜,而你却不知道它的名字.此时只能打开手机进行听歌识曲,而通过一个浏览器的插件却更容易解决这个问题.不需要繁琐的掏出手机,也不 ...

  6. 【爬虫+多线程+MySQL】网抑云音乐评论爬取

    提示:本文仅作学习交流使用,下面案例可供参考. 文章目录 前言 一.爬取所有华语男歌手姓名及ID 1.网页分析 2.代码实现 3.部分运行结果 附:url详解 二.爬取所有华语男歌手专辑ID 1.网页 ...

  7. 隐私协议授权访问的实现

    目录 交互逻辑 隐私协议的实现 初始化隐私协议 隐私协议确认弹窗 再次确认弹窗 隐私政策&用户协议界面 用户协议界面 隐私政策界面 隐私协议的文档 授权访问的实现 初始化授权访问 授权访问工具 ...

  8. 安全隐私协议合规的那些事

    背景 2020年7月24日,工信部发布了<关于开展纵深推进APP侵害用户权益专项整治行动的通知>(工信部信管函[2020]164号),从发文之日起至2020年12月10日开展APP侵害用户 ...

  9. 纳斯达克2021科技趋势报告、字节与美国用户达成9200万美元隐私协议、2020 最受欢迎APP|Decode the Week...

     Decode the Week ≠音视频技术周刊  Pic from Glasgow Film Festival 2021,More Together. /News Briefing.  Roblo ...

最新文章

  1. php传输数组给axios
  2. Robot Framework Webdriver For Firefox FQA
  3. java程序 构建mycircle类_Java语言程序设计(十九)对象和类的应用实例
  4. 快手 算法工程师 0825 笔试题
  5. SonarLint黄线警告python:S125
  6. ztree 右键菜单功能
  7. python爬虫入门——爬取淘宝商品评论信息
  8. O365(世纪互联)SharePoint 之使用列表库发布新闻
  9. 什么是配置文件,以及如何编辑它们?
  10. JAVA 中大于等于小于的写法
  11. QQ的常用快捷键大全
  12. SQL Server 创建学生管理系统
  13. Jointly Embedding Knowledge Graphs and Logical Rules
  14. 简洁的旅行青蛙个人主页纯静态HTML
  15. 导航栏 下拉菜单的制作
  16. User must be authenticated with Spring Security before authorization can be completed.解决方法
  17. 大学学习的期望与目标
  18. 【编译原理】 实验三 LL(1)分析法(LL1分析表的自动生成)
  19. Hive性能优化(全面)解决数据倾斜等问题
  20. search engin学习笔记1

热门文章

  1. matlab常用转义字符表,Matlab字体转义字符
  2. 学习笔记——PCB 棕化和黑化
  3. VNWare+MAC+J2Objc+Eclipse 环境配置和搭建---(J2Objc的使用)
  4. 天然奥兹克蜡的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  5. VirtualBox 启动虚拟机失败 - NtCreateFile(\Device\VBoxDrvStub)
  6. 缓存的设计 缓存的例子
  7. 【FIFO】异步 FIFO 设计
  8. Linux中打开文件显示行号相关命令
  9. log4j2 自定义日志级别
  10. 五大税种,你知道多少?