前言
在app的登录页面,一般都会有用户协议和隐私政策这两个提示,虽然大家在使用的时候基本上没人会看这个,但是这个甩锅声明还是需要存在的。
声明加载
这是声明的截图,使用的是app里面放一个txt文件,这种优点是加载起来比较方便,也不用请求网络,直接在本地就完事了,但是缺点就是修改不容易,如果需要修改某个协议内容的话要更新一下应用版本。但是咱就是说啊,谁没事经常修改这玩意。
实现
主要是需要将txt文件中的数据读取出来
1.创建一个xml显示界面
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#4DE2E3E5"
android:orientation="vertical">
//这是显示用户协议还是隐私政策的标题头
<TextView
android:id="@+id/tv_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:layout_marginBottom="5dp"
android:gravity="center"
android:textColor="@color/black"
android:textSize="15sp" />
// 因为我们的文字数据太多,所以需要做一个滑动,这样才能让文字显示全
<androidx.core.widget.NestedScrollView
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1">
//显示文字主体
<TextView
android:id="@+id/tv_read"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginStart="15dp"
android:layout_marginEnd="15dp"
android:textColor="#666666"
android:textSize="12sp" />
</androidx.core.widget.NestedScrollView>
<TextView
android:id="@+id/tv_ok"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="80dp"
android:layout_marginTop="25dp"
android:layout_marginEnd="80dp"
android:layout_marginBottom="15dp"
android:background="@drawable/login_btn_select_bg"
android:clickable="true"
android:focusable="true"
android:gravity="center"
android:paddingTop="10dp"
android:paddingBottom="10dp"
android:text="确 定"
android:textColor="@drawable/login_btn_text_bg"
android:textSize="16sp" />
</LinearLayout>
2.读取工具类,读取txt文件,输出一个String字符串。
public class ReadTxtUtil {
/**
* 读取本地Txt文本
*
* @return 字符串
*/
public static String readTxt(Context mContext, String txtAddress) {
AssetManager manager = mContext.getAssets();
try {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
InputStream inputStream = manager.open(txtAddress);
int i = inputStream.read();
while (i != -1) {
baos.write(i);
i = inputStream.read();
}
return baos.toString();
} catch (Exception e) {
e.printStackTrace();
return "";
}
}
}
3.准备txt文件。
这里我们将txt文件放在【assets】文件夹下面,要是项目没有的话需要自己创建一个。在【main】目录下面,和【java】目录同级。
4.显示
// isAgreement 判断是否是用户协议
when (isAgreement) {
true -> {
binding.tvTitle.text = "用户协议"
val txt = ReadTxtUtil.readTxt(this, "agreement.txt")
binding.tvRead.text = txt
}
else -> {
binding.tvTitle.text = "隐私政策"
val txt = ReadTxtUtil.readTxt(this, "privacypolicy.txt")
binding.tvRead.text = txt
}
}
当然这里面加载的只是一个单独的文本,如果需要显示一些其他的就不行,我们可以使用一个开源库来解决这个需求
开源库
implementation 'com.zzhoujay.richtext:richtext:3.0.7'
基本使用
//接上面的设定
RichText.fromMarkdown(txt).bind(this).into(binding.tvRead)
注意使用这个之后,需要记得销毁
// 在onDestory时(这个必要)
RichText.clear(context);
//在应用退出时调用(这个一般不用)
RichText.recycle();
扩展
1.设置数据类型
// 设置为Html
RichText.fromHtml(text).into(textView);
// 设置为Markdown
RichText.fromMarkdown(text).into(textView);
2.RichText的使用方式
RichText
.from(text) // 数据源
.type(RichText.TYPE_MARKDOWN) // 数据格式,不设置默认是Html,使用fromMarkdown的默认是Markdown格式
.autoFix(true) // 是否自动修复,默认true
.autoPlay(true) // gif图片是否自动播放
.showBorder(true) // 是否显示图片边框
.borderColor(Color.RED) // 图片边框颜色
.borderSize(10) // 边框尺寸
.borderRadius(50) // 图片边框圆角弧度
.scaleType(ImageHolder.ScaleType.FIT_CENTER) // 图片缩放方式
.size(ImageHolder.MATCH_PARENT, ImageHolder.WRAP_CONTENT) // 图片占位区域的宽高
.fix(imageFixCallback) // 设置自定义修复图片宽高
.fixLink(linkFixCallback) // 设置链接自定义回调
.noImage(true) // 不显示并且不加载图片
.resetSize(false) // 默认false,是否忽略img标签中的宽高尺寸(只在img标签中存在宽高时才有效),true:忽略标签中的尺寸并触发SIZE_READY回调,false:使用img标签中的宽高尺寸,不触发SIZE_READY回调
.clickable(true) // 是否可点击,默认只有设置了点击监听才可点击
.imageClick(onImageClickListener) // 设置图片点击回调
.imageLongClick(onImageLongClickListener) // 设置图片长按回调
.urlClick(onURLClickListener) // 设置链接点击回调
.urlLongClick(onUrlLongClickListener) // 设置链接长按回调
.placeHolder(placeHolder) // 设置加载中显示的占位图
.error(errorImage) // 设置加载失败的错误图
.cache(Cache.ALL) // 缓存类型,默认为Cache.ALL(缓存图片和图片大小信息和文本样式信息)
.imageGetter(yourImageGetter) // 设置图片加载器,默认为DefaultImageGetter,使用okhttp实现
.bind(tag) // 绑定richText对象到某个object上,方便后面的清理
.done(callback) // 解析完成回调
.into(textView); // 设置目标TextView