前言

第一次制作app协议(我简称霸王条款 O(∩_∩)O哈哈~),坑感觉有很多,但是一一解决了,这个就很开心了。小白使用的android版本是8.1,总共有两种实现实现方式。下面一一记录:

实现方式一: app端使用ScrollView+ AlertDialog实现

直接上代码:

String str = "这个可以做特殊字体的操作";
ScrollView sc=new ScrollView(this);
sc.setBackgroundColor(getResources().getColor(R.color.white));
TextView tv = new TextView(this);
tv.setTextSize(20);
tv.setText("这里面是协议内容");
//SpannableStringBuilder这个类我没有很多研究  可以理解它是一个类似stringbuffer这样一个类
//主要操作内容样式 如果需要详解可以参考链接:[link](https://www.jianshu.com/p/a157cd9297b5).
SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder(tv.getText());
ClickableSpan clickableSpan = new ClickableSpan() {@Overridepublic void onClick(View widget) {Log.e(TAG, "onClick: " );}@Overridepublic void updateDrawState(TextPaint ds) {super.updateDrawState(ds);ds.setColor(getResources().getColor(android.R.color.holo_red_dark));ds.setUnderlineText(false);ds.clearShadowLayer();}};
spannableStringBuilder.setSpan(clickableSpan, 0, str.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
tv.setText(spannableStringBuilder );
sc.addView(tv);

注意:tv协议内容,可能是一连串,不是我们想要的word文档格式,解决方法是:使用Notepad++ 打开
1.点击视图
2.显示符号
3.显示行尾符,显示缩进参考线,显示换行符
然后复制到
别急 还有最后一步 先上代码

 AlertDialog.Builder builder = new  AlertDialog.Builder(this);builder .setTitle("注册协议");builder.setView(sc);builder.setPositiveButton("我已阅读该协议", (dialog, which) -> ivLoginHoldPwdEd.setVisibility(View.VISIBLE));builder.show();

效果图
这是第一套方法 当然字体样式 包括标题 以及按钮样式 这个就需要自己去调试了 (协议红色部分)就是我在测试SpannableStringBuilder的作用

实现方式二:WebView+ScrollView+H5文档

第一步 :协议内容实现(作为一个曾经使用H5写过某商城的首页,自信感觉这个不在话下,打开HBuilder,写好了上中下,发现学了android之后,不会写了~~~)哈哈,不过还是有解决的方案的。由于人手不够,我直接在网上将word文档转html文档了,方便快捷效率高。
第二步 scrollview.xml 布局
注意 我第一次使用的布局是直接和当前页面放在同一个布局里面,但最好不要这样做,因为有很多意外。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="horizontal"><ScrollViewandroid:id="@+id/sv"android:layout_width="match_parent"android:layout_height="match_parent"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"android:descendantFocusability="blocksDescendants"/><WebViewandroid:id="@+id/wv"android:layout_width="match_parent"android:layout_marginRight="10dp"android:layout_marginLeft="10dp"android:layout_height="wrap_content"/></LinearLayout></ScrollView>
</LinearLayout>

第三步: 核心代码

AlertDialog.Builder builder = new  AlertDialog.Builder(this);View view = getLayoutInflater().inflate(R.layout.scrollview, null);ScrollView sc =view. findViewById(R.id.sv);sc.setBackgroundColor(getResources().getColor(R.color.white));String url = "http://192.168.10.4:8080/agreement.html";WebView wv = view.findViewById(R.id.wv);//设置WebView属性,能够执行Javascript脚本wv.getSettings().setJavaScriptEnabled(true);wv.loadUrl(url);//此方法可以在webview中打开链接而不会跳转到外部浏览器//用于控制WebView本身的行为,通过此类对象,可以获取网页相关事件,例如,想在用户单击网页中的超链接,网页加载的开始/结束等时机进行控制;wv.setWebViewClient(new WebViewClient() {@Overridepublic void onPageStarted(WebView view, String url, Bitmap favicon) {super.onPageStarted(view, url, favicon);}@SuppressWarnings("deprecation")@Overridepublic boolean shouldOverrideUrlLoading(WebView view, String url) {return false;}@TargetApi(Build.VERSION_CODES.N)@Overridepublic boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {view.loadUrl(request.getUrl().toString());return true;}});builder .setTitle("注册协议");builder.setView(view);builder.setPositiveButton("我已阅读该协议", (dialog, which) -> ivLoginHoldPwdEd.setVisibility(View.VISIBLE));builder.show();

注意事项:
webView的加载要在alert前,在后加载会出现空白现象
webView和scrollView都有聚焦事件,会冲突。
所以需要加载xml中的 LinearLayoutandroid:descendantFocusability=“blocksDescendants”

效果图如下 :

总结

第二种方案样式操作方便。可以灵活的调整样式。(webView有缓存机制,很牛皮!)
第一种比较难受吧,但是加载速度肯定要强过第二种的。各有各的好处。

结语

如果有更好的方案欢迎大家留言,一起学习进步。
一入android深似海,从此web是路人。

app注册协议做法和注意事项相关推荐

  1. app注册协议通用模版

    隐私政策 本应用尊重并保护所有使用服务用户的个人隐私权.为了给您提供更准确.更有个性化的服务,本应用会按照本隐私权政策的规定使用和披露您的个人信息.但本应用将以高度的勤勉.审慎义务对待这些信息.除本隐 ...

  2. java list 遍历 删除元素_java中List遍历删除元素相关做法和注意事项

    首先,使用简单的for循环时,list.remove()肯定是没问题的,只要注意一下下标别越界就行. 示例代码: List ll = new ArrayList(); ll.add("1&q ...

  3. 租房N年,整理了这份租房指南,包含租房靠谱APP租房网站和租房注意事项,第一次租房必看租房攻略。

    第一次租房注意事项,第一次租房小白必看租房攻略! 第一次租房注意事项,第一次租房小白必看租房攻略! 第一次租房注意事项,第一次租房小白必看租房攻略! 文章略长鹅 ! 以下几种人都建议你看完全文: [第 ...

  4. Axure教程:一个通用的app注册/登录页

    今天给大家分享一套APP注册/登录界面模板,其中包括本机登录页面,短信验证登录页面,密码登录页面,人脸登录页面,微博.微信.QQ.支付宝登录页面,注册页面,用户协议和隐私条款.该原型使用简单,交互完善 ...

  5. IOS开发高手课第二篇 App 启动速度怎么做优化与监控?

    02 | App 启动速度怎么做优化与监控? 我已经在专栏的第一篇文章中,和你梳理了一份 iOS 开发的知识体系框架图.今天,我们就正式从基础出发,开始自己的 iOS 开发知识体系构建之路吧.接下来, ...

  6. User Agreement(APP用户协议)

    User Agreement(APP用户协议) Privacy policy This application respects and protects the privacy of all use ...

  7. iOS中Mach异常和signal信号介绍,以及当APP崩溃时做线程保活弹出程序异常提示框

    我们经常会遇到APP闪退和崩溃的问题,那么我们应该通过什么变量去监听APP的异常呢?如何在程序崩溃时,保证程序不闪退,并给用户弹出一个提示框呢? 这是本文将要讲述的内容. 先介绍2个概念,Mach异常 ...

  8. 关于动态内存分配malloc的初级用法和注意事项

    #include <stdio.h> #include <stdlib.h> int main(int argc, const char *argv[]) { /*your c ...

  9. 某app登录协议逆向分析

    某app登录协议逆向分析 设备 iphone 5s Mac Os app:神奇的字符串57qm5Y2V 本文主要通过frida-trace.fridaHook.lldb动态调试完成破解相应的登录算法, ...

最新文章

  1. Oracle10g 管理系统全局区(SGA)
  2. How to enable coredump on centos 7.6
  3. mongoose框架示例代码解析(一)
  4. 深入理解分布式技术 - 漫谈分布式事务及解决方案
  5. 1044 拦截导弹——http://codevs.cn/problem/1044/
  6. [Python图像处理] 三十八.OpenCV图像增强和图像去雾万字详解(直方图均衡化、局部直方图均衡化、自动色彩均衡化)
  7. 服务器运行jar包日志怎么清理,docker 启动jar包,并将日志文件进行挂载
  8. 控制usb扫码枪_无线也可以很牢靠-世达SATA热熔胶枪评测
  9. vfp 界面_VFP之老树新花
  10. Web API-document
  11. Java中synchronized与Lock的区别
  12. Python进阶之八皇后算法
  13. pdf批量添加图章_还没找到适合自己的PDF阅读器吗,它来了
  14. dex2jar源码解析----smail转dex
  15. 2021-2027全球及中国数控钻机行业研究及十四五规划分析报告
  16. L1-087 机工士姆斯塔迪奥-PAT 团体程序设计天梯赛 GPLT
  17. ac6005直连ap 如何配置_邀请实测搭档 完成AC+瘦AP经典组网_华为 AC6005_网络设备-中关村在线...
  18. Python自学笔记系列一——认识python
  19. 华为云开发者学堂——学习笔记
  20. Bat(批处理)文件编写手册(一)

热门文章

  1. TPC-C 、TPC-H、TPC-DS和SSB测试基准(Benchmark)介绍
  2. 深度学习:view size is not compatible with input tensor‘s size and stride (at least one dimension spans a
  3. Java工程师简历范文大学生,最全Java知识总结
  4. 内网DNS报错:** server can‘t find ns1.aaa.com: SERVFAIL
  5. Elasticsearch搜索引擎(一)——基础使用
  6. 华为P30 后摄像头打不开(C1904失效)维修案例
  7. 激荡20年,芯片产能从零起步到反超美国,中国制造的又一大成就
  8. 盒子装载图片时出现的盒子比图片实际偏高的问题
  9. 如何从抖音引流至微信小程序?
  10. 174. 地下城游戏;剑指 Offer 40. 最小的k个数;378. 有序矩阵中第K小的元素;703. 数据流中的第K大元素