app注册协议做法和注意事项
前言
第一次制作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注册协议做法和注意事项相关推荐
- app注册协议通用模版
隐私政策 本应用尊重并保护所有使用服务用户的个人隐私权.为了给您提供更准确.更有个性化的服务,本应用会按照本隐私权政策的规定使用和披露您的个人信息.但本应用将以高度的勤勉.审慎义务对待这些信息.除本隐 ...
- java list 遍历 删除元素_java中List遍历删除元素相关做法和注意事项
首先,使用简单的for循环时,list.remove()肯定是没问题的,只要注意一下下标别越界就行. 示例代码: List ll = new ArrayList(); ll.add("1&q ...
- 租房N年,整理了这份租房指南,包含租房靠谱APP租房网站和租房注意事项,第一次租房必看租房攻略。
第一次租房注意事项,第一次租房小白必看租房攻略! 第一次租房注意事项,第一次租房小白必看租房攻略! 第一次租房注意事项,第一次租房小白必看租房攻略! 文章略长鹅 ! 以下几种人都建议你看完全文: [第 ...
- Axure教程:一个通用的app注册/登录页
今天给大家分享一套APP注册/登录界面模板,其中包括本机登录页面,短信验证登录页面,密码登录页面,人脸登录页面,微博.微信.QQ.支付宝登录页面,注册页面,用户协议和隐私条款.该原型使用简单,交互完善 ...
- IOS开发高手课第二篇 App 启动速度怎么做优化与监控?
02 | App 启动速度怎么做优化与监控? 我已经在专栏的第一篇文章中,和你梳理了一份 iOS 开发的知识体系框架图.今天,我们就正式从基础出发,开始自己的 iOS 开发知识体系构建之路吧.接下来, ...
- User Agreement(APP用户协议)
User Agreement(APP用户协议) Privacy policy This application respects and protects the privacy of all use ...
- iOS中Mach异常和signal信号介绍,以及当APP崩溃时做线程保活弹出程序异常提示框
我们经常会遇到APP闪退和崩溃的问题,那么我们应该通过什么变量去监听APP的异常呢?如何在程序崩溃时,保证程序不闪退,并给用户弹出一个提示框呢? 这是本文将要讲述的内容. 先介绍2个概念,Mach异常 ...
- 关于动态内存分配malloc的初级用法和注意事项
#include <stdio.h> #include <stdlib.h> int main(int argc, const char *argv[]) { /*your c ...
- 某app登录协议逆向分析
某app登录协议逆向分析 设备 iphone 5s Mac Os app:神奇的字符串57qm5Y2V 本文主要通过frida-trace.fridaHook.lldb动态调试完成破解相应的登录算法, ...
最新文章
- Oracle10g 管理系统全局区(SGA)
- How to enable coredump on centos 7.6
- mongoose框架示例代码解析(一)
- 深入理解分布式技术 - 漫谈分布式事务及解决方案
- 1044 拦截导弹——http://codevs.cn/problem/1044/
- [Python图像处理] 三十八.OpenCV图像增强和图像去雾万字详解(直方图均衡化、局部直方图均衡化、自动色彩均衡化)
- 服务器运行jar包日志怎么清理,docker 启动jar包,并将日志文件进行挂载
- 控制usb扫码枪_无线也可以很牢靠-世达SATA热熔胶枪评测
- vfp 界面_VFP之老树新花
- Web API-document
- Java中synchronized与Lock的区别
- Python进阶之八皇后算法
- pdf批量添加图章_还没找到适合自己的PDF阅读器吗,它来了
- dex2jar源码解析----smail转dex
- 2021-2027全球及中国数控钻机行业研究及十四五规划分析报告
- L1-087 机工士姆斯塔迪奥-PAT 团体程序设计天梯赛 GPLT
- ac6005直连ap 如何配置_邀请实测搭档 完成AC+瘦AP经典组网_华为 AC6005_网络设备-中关村在线...
- Python自学笔记系列一——认识python
- 华为云开发者学堂——学习笔记
- Bat(批处理)文件编写手册(一)
热门文章
- TPC-C 、TPC-H、TPC-DS和SSB测试基准(Benchmark)介绍
- 深度学习:view size is not compatible with input tensor‘s size and stride (at least one dimension spans a
- Java工程师简历范文大学生,最全Java知识总结
- 内网DNS报错:** server can‘t find ns1.aaa.com: SERVFAIL
- Elasticsearch搜索引擎(一)——基础使用
- 华为P30 后摄像头打不开(C1904失效)维修案例
- 激荡20年,芯片产能从零起步到反超美国,中国制造的又一大成就
- 盒子装载图片时出现的盒子比图片实际偏高的问题
- 如何从抖音引流至微信小程序?
- 174. 地下城游戏;剑指 Offer 40. 最小的k个数;378. 有序矩阵中第K小的元素;703. 数据流中的第K大元素