Android文档阅读之Txt文档阅读的方案实现

上两节说到了Office文档的阅读实现方案,通过NoHTTP将文档下载到本地,然后策略阅读,如果还没阅读到Office该篇的小伙伴们,可以先移步到上两节,因为这篇包括后面所写的都会用到这个NoHttp。

Android文档阅读之Office文档阅读的方案实现

首先需要引入第三方的框架,方便快速开发:

    //TXT阅读compile 'com.github.bifan-wei:HwTxtReader:V1.3.9'

需要记得在AndroidManifest.xml加入相应的权限:

    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.INTERNET" /><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

该框架提供了一个TxtReaderView的类让我们免除手动解析的过程,自己感兴趣的小伙伴可以自己去解析处理,难度不大,通过读入流的方式和根据编码格式进行解析,然后draw到相应的View上,这样其实也就可以控制文字的大小、间距、背景等了,本文基于快速实现的原则,直接引用到该框架。

先看看主布局activity_txt.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"android:layout_width="match_parent"android:layout_height="match_parent"><com.bifan.txtreaderlib.main.TxtReaderViewandroid:id="@+id/txt_view"android:layout_width="match_parent"android:layout_height="match_parent" /><includelayout="@layout/layout_data_download"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_marginTop="50dp"android:visibility="gone" /></RelativeLayout>

layout_data_download为一个下载进度条,小伙伴们可以移步到我前篇文章了解,篇幅问题就不加进来这篇了。

TxtReaderActivity如下:


import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.text.format.Formatter;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.RelativeLayout;
import android.widget.TextView;import com.bifan.txtreaderlib.bean.TxtMsg;
import com.bifan.txtreaderlib.interfaces.ILoadListener;
import com.bifan.txtreaderlib.interfaces.IPageChangeListener;
import com.bifan.txtreaderlib.interfaces.IPageEdgeListener;
import com.bifan.txtreaderlib.main.TxtReaderView;
import com.yanzhenjie.nohttp.Headers;
import com.yanzhenjie.nohttp.NoHttp;
import com.yanzhenjie.nohttp.download.DownloadListener;
import com.yanzhenjie.nohttp.download.DownloadRequest;import java.io.File;
import java.text.DecimalFormat;/*** @Description: Txt文本阅读* @Author: zzj* @Date: 2018/9/27 16:43* @Version: 1.0.0*/
public class TxtReaderActivity extends Activity {private TxtReaderView txtReaderView;private static final String ROOT_PATH = "/mnt/sdcard/txt";private String url = "";//TXT文件的URL地址private String fileSize;private DownloadRequest downloadRequest;private RelativeLayout rlDownloadContainer;private TextView tvDlFileName;private TextView tvDlProgress;private ProgressBar pbDownload;private Button btnDownload;@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.act_reader_txt);init();downloadTxt(url, title);}private void init() {txtReaderView = findViewById(R.id.txt_view);}/*** 初始化txt配置,设置背景与文字颜色、大小等*/private void initTxtConfig() {txtReaderView.setPageChangeListener(iPageChangeListener);txtReaderView.setOnPageEdgeListener(iPageEdgeListener);txtReaderView.setStyle(Color.WHITE, Color.BLACK);txtReaderView.setTextSize(DisplayUtil.sp2px(16));}private void setTxt(String path) {txtReaderView.loadTxtFile(path, iLoadListener);}private void downloadTxt(String url, String fileName) {File file = new File(ROOT_PATH + "/" + fileName);//如果文本已经被下载本地,则直接打开,否则下载到本地if (file.exists()) {setTxt(file.getPath());return;}showDownloadView(fileName);}private void showDownloadView(String fileName) {rlDownloadContainer = findViewById(R.id.rl_download_container);tvDlFileName = findViewById(R.id.tv_file_name);tvDlProgress = findViewById(R.id.tv_download_progress);btnDownload = findViewById(R.id.btn_download);pbDownload = findViewById(R.id.pb_download);tvDlFileName.setText(fileName);rlDownloadContainer.setVisibility(View.VISIBLE);//R.string.download为“下载”btnDownload.setText(String.format("%s(%s)", getString(R.string.download), fileSize/*文件大小*/));btnDownload.setOnClickListener(v -> {if (downloadRequest == null) {downloadRequest = NoHttp.createDownloadRequest(url, ROOT_PATH , fileName, true, false);CallServer.getInstance().download(0, downloadRequest, downloadListener);}});}private ILoadListener iLoadListener = new ILoadListener() {@Overridepublic void onSuccess() {if (txtReaderView.getVisibility() == View.GONE) {txtReaderView.setVisibility(View.VISIBLE);}initTxtConfig();}@Overridepublic void onFail(TxtMsg txtMsg) {if (txtReaderView.getVisibility() == View.VISIBLE) {txtReaderView.setVisibility(View.GONE);}if (txtMsg == TxtMsg.FileNoExist) {showToast("文件不存在");} else {showToast("初始化出错");}}@Overridepublic void onMessage(String s) {Log.d("zzj", "onMessage() " + s);}};private DecimalFormat decimalFormat = new DecimalFormat("0.00");private IPageChangeListener iPageChangeListener = new IPageChangeListener() {@Overridepublic void onCurrentPage(float v) {//decimalFormat.format(v * 100) + "%" ,当前的页面百分比,最后一页为100%}};private IPageEdgeListener iPageEdgeListener = new IPageEdgeListener() {@Overridepublic void onCurrentFirstPage() {}@Overridepublic void onCurrentLastPage() {//最后一页}};private DownloadListener downloadListener = new DownloadListener() {@Overridepublic void onDownloadError(int what, Exception exception) {txtReaderView.setVisibility(View.GONE);if (rlDownloadContainer != null) {rlDownloadContainer.setVisibility(View.GONE);}}@Overridepublic void onStart(int what, boolean isResume, long rangeSize, Headers responseHeaders, long allCount) {if (btnDownload != null) {btnDownload.setVisibility(View.GONE);tvDlProgress.setVisibility(View.VISIBLE);pbDownload.setVisibility(View.VISIBLE);}}@Overridepublic void onProgress(int what, int progress, long fileCount, long speed) {pbDownload.setProgress(progress);tvDlProgress.setText(String.format("%s(%s/%s)", getResources().getString(R.string.downloading), Formatter.formatFileSize(TxtReaderActivity.this, fileCount), fileSize));}@Overridepublic void onFinish(int what, String filePath) {setTxt(filePath);if (txtReaderView.getVisibility() != View.VISIBLE) {txtReaderView.setVisibility(View.VISIBLE);}rlDownloadContainer.setVisibility(View.GONE);}@Overridepublic void onCancel(int what) {txtReaderView.setVisibility(View.GONE);}};@Overrideprotected void onDestroy() {super.onDestroy();if (downloadRequest != null) {downloadRequest.cancel();}//退出时需要清除对象,防止内存泄漏txtReaderView.getTxtReaderContext().Clear();txtReaderView = null;}
}

结语

TXT的Android阅读实现方式还是很多的,GitHub上面有一大堆已经实现的,但大多数都需要自己去抽离代码,本文能让你快速实现TXT的阅读。欢迎大家点赞拍砖转发分享。

Android文档阅读之Txt文档阅读的方案实现相关推荐

  1. 修改json文件,保存为txt文档

    诉求:把乱七八糟的json文件,改成规范的.易于阅读的txt文档. 解决方法: 打开文件,加载数据: import jsonpath = r'B:\我的游戏\天涯明月刀\游戏资料(天涯明月刀)\[解压 ...

  2. python遍历目录将txt文档转换为Excel表格

    最近因工作原因需要批量转换txt文档,手工一个个修改太耗时,于是写了个脚本,需要用的自己拿. 脚本流程基本分为3个部分. 1,遍历目录 2,找到目录下的txt文档 3,转换文档并在txt文档存储目录下 ...

  3. 图文教程:如何将电脑TXT文档传到iPhone5并阅读之(无需越狱)

    首先声明,本帖针对iPhone5小白用户的,老鸟勿喷. 相信很多未越狱的iPhone5用户会比较纠结一个问题,那就是iPhone官方阅读软件ibooks不支持TXT文档阅读,不越狱的前提下想传本小说到 ...

  4. Android实现在线预览office文档(Word,Pdf,excel,PPT.txt等格式)

    1.概述 我们都知道,Android原生并没有提供浏览office文档格式的相关Api,在安卓端想要实现在线预览office文档的功能显然很是复杂,我们手机安装QQ浏览器时,在手机打开office文档 ...

  5. java 检索编号输出信息_java,_java 如何解析txt文档,输入检索信息,然后输出,java - phpStudy...

    java 如何解析txt文档,输入检索信息,然后输出 请输入代码需求: 请解析config.txt,文件格式包括段落名称.字段名称和字段值.段落名称的值为:"segment:"右边 ...

  6. 如何用python创建文件_怎么用python建立一个txt文档,并输入内容-百度经验

    这里,我要用python,在电脑桌面上,新建一个文件夹a,并在文件夹a里面,建立一个txt文档--b.txt,写上如下文字: 你好, 世界. 工具/原料 电脑 python 方法/步骤 1 在电脑桌面 ...

  7. 教你快速将多个TXT文档合并成一个多方法 手工方法无需软件

    方法多种多样这里我给大家把我知道的方法进行下总结 方法一: 有文档1.txt.2.txt.3.txt,在demo目录下(目录必须是英文) 进入该目录,按住shift,点击鼠标右键,选择"在此 ...

  8. python借助jieba包对单独test和txt文档进行中文分词

    python借助jieba包对单独test和txt文档进行中文分词 一.单独test分词 import jieba jieba.cut("大连圣亚在大连") *#输出:<ge ...

  9. [扩展阅读] EasyGUI 学习文档【超详细中文版】

    [扩展阅读] EasyGUI 学习文档[超详细中文版] 0. 安装 EasyGUI 官网:https://github.com/robertlugg/easygui python查看内置的所有模块 h ...

最新文章

  1. 聚类算法api初步使用
  2. 【全新打造】思科认证跟踪系统考试注册教程(08.8.30)附word文件下载
  3. oracle每天自增长,oracle的自增长
  4. 玩转oracle 11g(14):命令学习2
  5. Halcon学习笔记(三)---数据类型
  6. jacascript 立即执行函数(IIFE)与闭包
  7. Spring-core-SpringFactoriesLoader类
  8. aes没有密码能解密吗_如果人体基因密码被破译,人类平均寿命能提高到1000岁吗?...
  9. 读Pyqt4教程,带你入门Pyqt4 _007
  10. ad软件画pcb方法总结_PCB各层介绍及AD软件画PCB时的规则
  11. 一篇文章告诉你雅虎这20年经历了什么
  12. 基于java的高速公路收费系统 计算机毕业设计
  13. 2016MDCC移动开发者大会总结
  14. cadence allegro - PCB走线 线宽、线距
  15. 计算机发展史资料简介,计算机发展史简介
  16. CentOS 6.8 数据库安装5.5.32
  17. Blazor开发WEB程序
  18. C++ 开源游戏服务器框架
  19. 计算机内,二进制小数的表示方法
  20. pdf限制打印了怎么办

热门文章

  1. 胡才勇:开源软件受到商业软件专利侵权压力
  2. 深入理解CSRF攻击与防御
  3. 从海底捞无人餐厅到川普的AI新政策, 看2019人工智能新动向
  4. python 套索回归_适用于python的自适应套索
  5. 技嘉主板常见问题解答
  6. 2019修改CSDN博客皮肤教程
  7. 微信公众号注销打款25位账号空格问题
  8. 独立站流量转化终极答案
  9. Java中的File类和IO流
  10. 时间囊咖啡馆免费提供小型活动场地_豆瓣