你的位置:首页 > 软件开发 > 操作系统 > Android简单的编写一个txt阅读器(没有处理字符编码),适用于新手学习

Android简单的编写一个txt阅读器(没有处理字符编码),适用于新手学习

发布时间:2017-09-01 03:00:12
本程序只是使用了一些基本的知识点编写了一个比较简单粗陋的txt文本阅读器,效率不高,只适合新手练习。所以大神勿喷。  其实想到编写这种程序源自本人之前喜欢看小说,而很多小说更新太慢,所以本人就只能找一个完本的.txt小说下载下来,有没有网络都可以看,当然现在不看那玩意了。  废话 ...

Android简单的编写一个txt阅读器(没有处理字符编码),适用于新手学习

  本程序只是使用了一些基本的知识点编写了一个比较简单粗陋的txt文本阅读器,效率不高,只适合新手练习。所以大神勿喷。

  其实想到编写这种程序源自本人之前喜欢看小说,而很多小说更新太慢,所以本人就只能找一个完本的.txt小说下载下来,有没有网络都可以看,当然现在不看那玩意了。

  废话就不说了,程序中使用到的有4个类,5个

  先看效果图吧(虽然很丑):

  Android简单的编写一个txt阅读器(没有处理字符编码),适用于新手学习  Android简单的编写一个txt阅读器(没有处理字符编码),适用于新手学习 Android简单的编写一个txt阅读器(没有处理字符编码),适用于新手学习

  下面就上代码吧,本人都注释好了,由于本人技术还不行,注释不对的,望指正,谢谢>~<

  MainActivity.java:

 

package cn.hmxin.readbookproject;import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileReader;import java.io.FileWriter;import java.io.IOException;import java.io.InputStream;import java.util.ArrayList;import java.util.List;import android.content.Intent;import android.os.Bundle;import android.os.Environment;import android.support.v7.app.ActionBarActivity;import android.util.Log;import android.view.ContextMenu;import android.view.ContextMenu.ContextMenuInfo;import android.view.Menu;import android.view.MenuItem;import android.view.View;import android.widget.AdapterView;import android.widget.ArrayAdapter;import android.widget.Button;import android.widget.ListView;import android.widget.Toast;public class MainActivity extends ActionBarActivity { private ListView bookList = null ;//显示图书(txt)列表组件 private Button btnAdd = null ;//追加书按钮组件 private ArrayAdapter<String> adapter = null ;//适配器 private List<String> data = null ; //用于存储数据,加载到适配器中 private List<String> pathData = null ;//记录路径 private static final int REMOVE_BOOK = Menu.FIRST;//移除书上下文菜单标识 //程序中要使用到的路径 public static final String MYPATH = Environment.getExternalStorageDirectory().getPath() + File.separator + "myBook"; private int longClickPosition = 0 ;  @Override protected void onCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState);  setContentView(R.layout.activity_main);    bookList = (ListView)findViewById(R.id.book_list);//绑定组件  btnAdd = (Button)findViewById(R.id.btn_add);//绑定组件    createOrRead();//创建或读取文件方法,顺带显示数据    registerForContextMenu(bookList);//为txt列表组件注册上下文菜单    btnAdd.setOnClickListener(new OnClick());//添加图书按钮的单击监听处理  bookList.setOnItemClickListener(new OnItemClick());//图书列表的子项单击监听处理  bookList.setOnItemLongClickListener(new OnItemLongClick());//图书列表的子项单击监听处理   }  //文件的创建和读取 public void createOrRead(){  File dirFile = new File(MYPATH);//声明并实例化一个File类,路径为MYPATH(路径详细看上面)  if(!dirFile.exists()){//如果文件夹不存在   dirFile.mkdirs();//创建文件夹  }  File file = new File(dirFile,"bookPath.txt");//声明并实例化一个File类,父路径为dirFile,文件名为bookPath.txt  if(!file.exists()){//如果文件不存在   try {    file.createNewFile();//创建文件   } catch (IOException e) {    e.printStackTrace();   }  }else{//如果文件已经存在   try {    FileReader fr = new FileReader(file);//声明并实例化FileReader类,路径为file    BufferedReader br = new BufferedReader(fr);//声明并实例化BufferedFile类,缓冲读取数据    data = new ArrayList<String>();//实例化List类,用于添加数据,加载在适配器中    pathData = new ArrayList<String>();//记录路径    String line = "" ;//用于存储读取到的数据        while((line = br.readLine()) != null){//如果还有下一行数据     int sub = line.lastIndexOf(File.separator);//截取文件名使用     String strName = line.substring(sub+1, line.length());//截取到文件名     data.add(strName);//添加文件名     pathData.add(line);//添加整个文件路径    }    br.close();//关闭BufferedReader类    fr.close();//关闭FileReader类    //加载数据在适配器    adapter = new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_list_item_1, data);    bookList.setAdapter(adapter);//设置适配器   } catch (FileNotFoundException e) {//抛出异常    e.printStackTrace();   } catch (IOException e) {//抛出异常    e.printStackTrace();   }  } }  //用来监听图书列表的选项单击事件 private class OnItemClick implements AdapterView.OnItemClickListener{  @Override  public void onItemClick(AdapterView<?> parent, View view, int position, long id) {   Intent intent = new Intent(MainActivity.this, ReadBookActivity.class);//用于跳转Activity使用,此处跳转到读取图书界面   intent.putExtra("txtFilePath", pathData.get(position));//传送要打开的txt文件路径   startActivity(intent);//跳转界面  }   } //用来监听图书列表的选项长按事件 private class OnItemLongClick implements AdapterView.OnItemLongClickListener{  @Override  public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {   longClickPosition = position;//记录长按了列表哪个子项   return false;  } }  //用来监听添加图书按钮的单击事件 private class OnClick implements View.OnClickListener{  @Override  public void onClick(View v) {   Intent intent = new Intent(MainActivity.this, FileBrowserActivity.class);//跳转到文件浏览选择界面   startActivity(intent);//跳转界面  }   }  //创建上下文菜单 @Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {  menu.add(0, REMOVE_BOOK, 0, "移除读书");//添加菜单子项  super.onCreateContextMenu(menu, v, menuInfo); }  @Override public boolean onContextItemSelected(MenuItem item) {  if(item.getItemId() == REMOVE_BOOK){//移除图书处理   removeBook();  }  return super.onContextItemSelected(item); }  //移除图书处理 public void removeBook(){  try {   data.remove(longClickPosition);//移除该项   pathData.remove(longClickPosition);//移除该项   FileWriter fw = new FileWriter(new File(MYPATH + File.separator + "bookPath.txt"));//设置读取文件   BufferedWriter bw = new BufferedWriter(fw);//用BufferedWriter类写入数据   for(String str : pathData){//遍历pathData对象    bw.write(str);//写入数据    bw.newLine();//新的一行   }   bw.close();   //加载数据在适配器   adapter = new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_list_item_1, data);   bookList.setAdapter(adapter);//设置适配器  } catch (IOException e) {//抛出异常   e.printStackTrace();  } }}

 

activity_mai.

<LinearLayout ="http://schemas.android.com/apk/res/android" ="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="cn.hmxin.readbookproject.MainActivity" > <LinearLayout   android:layout_width="match_parent"  android:layout_height="wrap_content"  android:orientation="horizontal">   <TextView  android:layout_width="wrap_content"  android:layout_height="wrap_content"  android:textSize="18dip"  android:textStyle="bold"  android:layout_weight="1"  android:text="@string/list_title" />  <Button   android:id="@+id/btn_add"  android:layout_width="wrap_content"  android:layout_height="wrap_content"  android:text="@string/add"/> </LinearLayout>  <ListView   android:id="@+id/book_list"  android:layout_width="match_parent"  android:layout_height="wrap_content">   </ListView></LinearLayout>

SubFile.java

package cn.hmxin.readbookproject;import java.io.File;public class SubFile {  private File file =null ;//封装一个File类,用于接收传进构造方法中的File类  public SubFile(File file) {//构造方法  this.file = file ;//本类中的file赋值为传进来的file }  public File getFile() {//getter方法,返回File类  return this.file;//返回本类中的file对象 }  @Override public String toString() {  String str = null; //声明一个字符串用来返回值  if(file.isDirectory()) {//是文件夹   str = "[文件夹]" + file.getName();  }else {//是文件   if(file.getName().lastIndexOf(".txt")>-1) {//这里是过滤掉别的文件,做文件浏览器,可以去掉    str = "[文件]" + file.getName();//赋值"[文件]"+文件名字   }  }  return str;//返回该字符串 }}

 

FileBrowserActivity.java

package cn.hmxin.readbookproject;import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.File;import java.io.FileNotFoundException;import java.io.FileReader;import java.io.FileWriter;import java.io.IOException;import java.io.OutputStream;import java.util.ArrayList;import java.util.List;import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.os.Environment;import android.view.View;import android.widget.AdapterView;import android.widget.ArrayAdapter;import android.widget.ListView;import android.widget.Toast;public class FileBrowserActivity extends Activity {  private ListView fileList = null ;//显示文件的列表 private ArrayAdapter adapter = null ;//适配器   @Override protected void onCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState);  setContentView(R.layout.file_browser_layout);  setTitle("选择您的文件名");//更改标题  fileList = (ListView)findViewById(R.id.file_list);//绑定组件  openFile(adapter, fileList);//打开文件和配置适配器,显示在列表上    fileList.setOnItemClickListener(new OnItemClick());//文件列表的子项单击监听处理   }  /**  * 此方法用于装载数据  * @param adapter ArrayAdapter适配器  * @param list 要显示的ListView  */ public void openFile(ArrayAdapter adapter, ListView list){  List<SubFile> ndata = new ArrayList<SubFile>();//用于存放文件名,加载到适配器中  String strPath = getIntent().getStringExtra("filename");//获取上个界面传来的值  if(strPath == null){//没有有数据   strPath = Environment.getExternalStorageDirectory().getPath();//根目录  }  File pathFile = new File(strPath);//要显示的目录  if(pathFile != null){//有这个目录   File[] files = pathFile.listFiles();//获取目录下的所有文件夹与文件   for(File file : files){//全部遍历    if(new SubFile(file).toString()!=null){//如果不是筛选掉的文件     ndata.add(new SubFile(file));//添加到mdata对象中    }   }   //配置适配器   adapter = new ArrayAdapter(FileBrowserActivity.this, android.R.layout.simple_list_item_1, ndata);   list.setAdapter(adapter);//设置列表的适配去  }else{//空文件处理   Toast.makeText(FileBrowserActivity.this , "查找文件为空!", Toast.LENGTH_SHORT).show();  } }  //文件列表子项的单击监听处理 private class OnItemClick implements AdapterView.OnItemClickListener{  @Override  public void onItemClick(AdapterView<?> parent, View view, int position, long id) {   SubFile subFile = (SubFile) parent.getAdapter().getItem(position);//获取子项存储的SubFile类,该类可以获取到子项所在路径   String filename = subFile.getFile().getPath();//filename赋值为subFile对象中的路径   Intent intent = null;//声明Intent类,用于跳转界面   if(subFile.getFile().isDirectory()){//如果路径为文件夹    intent = new Intent(FileBrowserActivity.this, FileBrowserActivity.class);//还是跳转到改Activity    intent.putExtra("filename", filename);//传入路径   }else{//文件的话    intent = new Intent(FileBrowserActivity.this, MainActivity.class);//跳转到主界面    writeData(filename);//调用writeData方法,该方法用于写入数据   }   startActivity(intent);//跳转界面   finish();//清除界面  }   }  /**  * 该方法用于写入数据  * @param str 要写入的值  */  public void writeData(String str){   File file = new File(MainActivity.MYPATH+File.separator+"bookPath.txt");//要操作的文件   try {    BufferedWriter bw = new BufferedWriter(new FileWriter(file,true));//用BufferedWriter类追加写入数据    bw.append(str);//追加数据    bw.newLine();//新的一行    bw.close();//关闭BufferedWrite类   } catch (IOException e) {//抛出异常    e.printStackTrace();   } } }

file_browser_layout.

<??><LinearLayout ="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_margin="10dp" android:orientation="vertical" >   <TextView  android:layout_width="wrap_content"  android:layout_height="wrap_content"  android:textSize="18dip"  android:textStyle="bold"  android:text="@string/file_select_title" />  <ListView   android:id="@+id/file_list"  android:layout_width="match_parent"  android:layout_height="wrap_content"> </ListView></LinearLayout>

ReadBookActivity.java

package cn.hmxin.readbookproject;import java.io.BufferedReader;import java.io.File;import java.io.FileInputStream;import java.io.FileReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import android.app.Activity;import android.os.Bundle;import android.text.method.ScrollingMovementMethod;import android.util.Log;import android.widget.TextView;import android.widget.Toast;public class ReadBookActivity extends Activity {  private TextView bookContent = null ;//显示文本的组件  @Override protected void onCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState);  setContentView(R.layout.read_book_layout);    bookContent = (TextView)findViewById(R.id.book_content);//绑定文本组件  bookContent.setMovementMethod(ScrollingMovementMethod.getInstance());//给文本组件加入滚动条    String txtFilePath = getIntent().getStringExtra("txtFilePath");//获取传进来的文本路径  if(txtFilePath != null){//如果有传进数据   int index = txtFilePath.lastIndexOf(File.separator);//用来截取文本的名字的第一个参数   String name = txtFilePath.substring(index+1, txtFilePath.length());//截取文本名字   setTitle(name);//设置标题为文本名字   try {    FileInputStream fr = new FileInputStream(txtFilePath);//文件输出流    BufferedReader br = new BufferedReader(new InputStreamReader(fr, "utf-8"));//缓冲读取文件数据    String line = "" ;//记录每一行数据    String content = "" ;    while((line = br.readLine()) != null){//如果还有下一行数据     content += line + "\n" ;    }    bookContent.setText(content);;//追加显示数据    br.close();//关闭文件输出流    fr.close();//关闭缓冲区   } catch (IOException e) {//抛出异常    Toast.makeText(ReadBookActivity.this, "没有此文件!", Toast.LENGTH_SHORT).show();//提示异常    finish();//直接关闭界面   }  } }}

read_book_layout.

<??><LinearLayout ="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <TextView   android:id="@+id/book_content"  android:layout_width="match_parent"  android:layout_height="match_parent"  android:textSize="14dip"/></LinearLayout>

strings.

<??><resources> <string name="app_name">图书阅读程序(txt)</string> <string name="list_title">图书列表:</string> <string name="add">添加图书</string> <string name="file_select_title">请选择.txt文件:</string></resources>

AndroidManifest.

<??><manifest ="http://schemas.android.com/apk/res/android" package="cn.hmxin.readbookproject" android:versionCode="1" android:versionName="1.0" > <uses-sdk  android:minSdkVersion="8"  android:targetSdkVersion="21" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <application  android:allowBackup="true"  android:icon="@drawable/ic_launcher"  android:label="@string/app_name"  android:theme="@style/AppTheme" >  <activity   android:name=".MainActivity"   android:label="@string/app_name" >   <intent-filter>    <action android:name="android.intent.action.MAIN" />    <category android:name="android.intent.category.LAUNCHER" />   </intent-filter>  </activity>  <activity android:name=".ReadBookActivity">     </activity>  <activity android:name=".FileBrowserActivity">     </activity> </application></manifest>

 

  最后想说的是,新手们可以着重看SubFile.java和FileBrowserActivity.java这两个文件,这两个文件实现的是一个文件浏览器,方法简单至极,是本人在看教程中学到的。到最后你要是想做界面漂亮的浏览器,也可以借鉴借鉴。要源码的话,可以联系下本人。

《黑幕下的人》

 

原标题:Android简单的编写一个txt阅读器(没有处理字符编码),适用于新手学习

关键词:Android

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。

可能感兴趣文章

我的浏览记录