前言
第一次制作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() { @Override public void onClick(View widget) { Log.e(TAG, "onClick: " ); } @Override public 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"> <ScrollView android:id="@+id/sv" android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:descendantFocusability="blocksDescendants"/> <WebView android: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() { @Override public void onPageStarted(WebView view, String url, Bitmap favicon) { super.onPageStarted(view, url, favicon); } @SuppressWarnings("deprecation") @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { return false; } @TargetApi(Build.VERSION_CODES.N) @Override public 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是路人。