在好例子网,分享、交流、成长!
您当前所在位置:首页Java 开发实例Android平台开发 → 读书类的APP,简单的DEMO

读书类的APP,简单的DEMO

Android平台开发

下载此实例
  • 开发语言:Java
  • 实例大小:0.15M
  • 下载次数:28
  • 浏览次数:368
  • 发布时间:2015-01-21
  • 实例类别:Android平台开发
  • 发 布 人:lxg99527
  • 文件格式:.zip
  • 所需积分:4
 相关标签: txt阅读器 Android

实例介绍

【实例简介】简单的txt浏览器,感觉还算好用吧。喜欢的下载吧

【实例截图】


【核心代码】

// 观看Txt文件的Activity
// Leo @ 2010/09/23

package cn.com.nd.PandaReaderLight;

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnDismissListener;
import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.Color;
import android.net.Uri;
import android.os.Bundle;
import android.os.Message;
import android.telephony.PhoneNumberUtils;
import android.text.Layout;
import android.text.method.ScrollingMovementMethod;
import android.text.style.ForegroundColorSpan;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import android.os.Handler;
import android.text.*;

public class ReadBookActivity extends Activity implements OnClickListener {

final int REQUST_CODE_GOTO_BOOKMARK = 1;

CustomTxtView tvMain; // 主看书控件,自定义
SearchTxtDlg searchDlg; // 搜索对话框,自定义
String strSelection = ""; // 用户选择的字符串
String strTxt = ""; // 用于显示的文本字符串
String strPath = ""; // 完整的文件路径
int position = 0; // 当前阅读位置,取一行的行首
int markPos = 0; // 书签位置

final int BUFFER_SIZE = 1024 * 3; // 没时间了,暂时先不做大文件处理了-_-||

final int SCROLL_STEP = 1; // 自动滚动的步长
final int BEGIN_SCROLL = 1; // 开始滚屏
final int END_SCROLL = 2; // 终止滚屏
final int STOP_SCROLL = 3; // 结束滚屏

final int MENU_BOOKMARK = Menu.FIRST;
final int MENU_SEARCH = Menu.FIRST 1;

final int DIALOG_AFTER_SELECTION = 4;
final int DIALOG_GET_SEARCH_KEY_WORD = 5;

boolean isAutoScrolling = false;
boolean isInSearching = false;
boolean hasBookMark = false;

Button BtnAutoScroll;

Handler autoScrollHandle = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
/* 判断消息 */
switch (msg.what) {
case BEGIN_SCROLL:
if (tvMain.getScrollY() >= tvMain.getLineCount()
* tvMain.getLineHeight() - tvMain.getHeight()) {
tvMain.scrollTo(0,
tvMain.getLineCount() * tvMain.getLineHeight()
- tvMain.getHeight());
autoScrollHandle.sendEmptyMessage(END_SCROLL);
} else {
// 按步长滚动
tvMain.scrollTo(0, tvMain.getScrollY() SCROLL_STEP);
autoScrollHandle.sendEmptyMessageDelayed(BEGIN_SCROLL, 100);
}
break;
case END_SCROLL:
// 已经滚动到底部
// tv.scrollTo(0, tv.getLineCount() * tv.getLineHeight() -
// tv.getHeight());
autoScrollHandle.removeMessages(STOP_SCROLL);
autoScrollHandle.removeMessages(BEGIN_SCROLL);
break;
case STOP_SCROLL:
// 用户中断滚屏
autoScrollHandle.removeMessages(END_SCROLL);
autoScrollHandle.removeMessages(BEGIN_SCROLL);
break;
default:
break;
}
}
};

public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.readbook);

tvMain = (CustomTxtView) this.findViewById(R.id.viewtxt_main_view);
BtnAutoScroll = (Button) this
.findViewById(R.id.viewtxt_auto_scroll_button);

// registerForContextMenu(tv); // 注册成上下文菜单的载体

searchDlg = new SearchTxtDlg(this);
searchDlg.setOnDismissListener(new OnDismissListener() {

public void onDismiss(DialogInterface dialog) {
// TODO Auto-generated method stub
String keywords = searchDlg.getSearchKeyword();
if (keywords.length() > 0) {
isInSearching = true;
SpannableStringBuilder style = new SpannableStringBuilder(
strTxt);
int beginFlag = 0;
while (strTxt.indexOf(keywords, beginFlag) != -1) {
int markStart = strTxt.indexOf(keywords, beginFlag);
int markEnd = strTxt.indexOf(keywords, beginFlag)
keywords.length();
style.setSpan(new ForegroundColorSpan(Color.GRAY),
markStart, markEnd,
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
beginFlag = markEnd;
}
tvMain.setText(style);
} else {
Toast.makeText(ReadBookActivity.this, "没有找到关键字",
Toast.LENGTH_LONG).show();
}
}
});

// 设置一个触摸事件侦听器,拦截选择结束事件
CustomTxtView.OnTouchListener viewTouch = new TextView.OnTouchListener() {

public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub
if (tvMain.getSelectionEnd() - tvMain.getSelectionStart() != 0
&& tvMain.isInSelectMode()
&& event.getAction() == MotionEvent.ACTION_UP) {

char[] bufTmp = new char[128]; // 需做文字长度是否超出短信范围判断
tvMain.getText().getChars(tvMain.getSelectionStart(),
tvMain.getSelectionEnd(), bufTmp, 0);

// strSelection = String.copyValueOf(bufTmp);
strSelection = String.copyValueOf(
bufTmp,
0,
tvMain.getSelectionEnd()
- tvMain.getSelectionStart());
showDialog(DIALOG_AFTER_SELECTION);
}

return false;
}
};
tvMain.setOnTouchListener(viewTouch);

// 读文件
try {
Bundle b = getIntent().getExtras();
String str = b.getString("FILE_PATH");
strPath = str; // 保存一份副本

// FileReader fr = new FileReader((new String("/sdcard/111.txt")));
FileReader fr = new FileReader(str);
String DecType = fr.getEncoding();

char[] buf = new char[BUFFER_SIZE];
try {
fr.read(buf);
} catch (IOException e) {
}

// byte[] bytes = new byte[buf.length];
// String strDst = new String(bytes, 0, buf.length, DecType);
strTxt = new String(buf);
tvMain.setText(strTxt);

SharedPreferences spSetting = getSharedPreferences(
SettingActivity.PANDA_READER_PREF, 0);
String fontColor = spSetting.getString(
SettingActivity.PREF_TAG_FONT_COLOR, "白色");
String bgColor = spSetting.getString(
SettingActivity.PREF_TAG_BACKGROUND_COLOR, "黑色");
float fontSize = spSetting.getFloat(
SettingActivity.PREF_TAG_FONT_SIZE, 25.0f);
float scrBrightness = spSetting.getFloat(
SettingActivity.PREF_TAG_SCREEN_BRIGHTNESS, 1.0f);

// 有点别扭,应该有更好的解决方案
if (bgColor == "白色")
tvMain.setBackgroundColor(Color.WHITE);
else if (bgColor == "黑色")
tvMain.setBackgroundColor(Color.BLACK);
else if (bgColor == "红色")
tvMain.setBackgroundColor(Color.RED);
else if (bgColor == "绿色")
tvMain.setBackgroundColor(Color.GREEN);
else if (bgColor == "蓝色")
tvMain.setBackgroundColor(Color.BLUE);

if (fontColor == "白色")
tvMain.setTextColor(Color.WHITE);
else if (fontColor == "黑色")
tvMain.setTextColor(Color.BLACK);
else if (fontColor == "红色")
tvMain.setTextColor(Color.RED);
else if (fontColor == "绿色")
tvMain.setTextColor(Color.GREEN);
else if (fontColor == "蓝色")
tvMain.setTextColor(Color.BLUE);

tvMain.setTextSize(fontSize);

WindowManager.LayoutParams lp = getWindow().getAttributes();
lp.screenBrightness = scrBrightness;
getWindow().setAttributes(lp);

tvMain.setCursorVisible(false);
tvMain.setMovementMethod(ScrollingMovementMethod.getInstance());
} catch (FileNotFoundException e) {

}

// 设置按钮事件监听器
Button BtnPrePage = (Button) this.findViewById(R.id.viewtxt_pre_button);
BtnPrePage.setOnClickListener(this);
Button BtnNextPage = (Button) this
.findViewById(R.id.viewtxt_next_button);
BtnNextPage.setOnClickListener(this);
Button BtnAutoScroll = (Button) this
.findViewById(R.id.viewtxt_auto_scroll_button);
BtnAutoScroll.setOnClickListener(this);
}

// 重新回到看书界面
@Override
public void onResume() {
super.onResume();
Layout l = tvMain.getLayout();
if (null != l) {
// 回到上次观看的位置
if (hasBookMark) {
hasBookMark = false;
position = markPos;
} else {
int line = l.getLineForOffset(position);
float sy = l.getLineBottom(line);
tvMain.scrollTo(0, (int) sy);
}
Log.e("REALPOS_RESUME", "REAL_POS " position);
}
}

public void onClick(View v) {
// TODO Auto-generated method stub
switch (v.getId()) {
case R.id.viewtxt_pre_button:
if (tvMain.getScrollY() <= tvMain.getHeight())
tvMain.scrollTo(0, 0);
else
tvMain.scrollTo(0, tvMain.getScrollY() - tvMain.getHeight());

Log.e("", "LINEHEIGHT = " tvMain.getLineHeight());
break;
case R.id.viewtxt_next_button:
if (tvMain.getScrollY() >= tvMain.getLineCount()
* tvMain.getLineHeight() - tvMain.getHeight() * 2)
tvMain.scrollTo(
0,
tvMain.getLineCount() * tvMain.getLineHeight()
- tvMain.getHeight());
else
tvMain.scrollTo(0, tvMain.getScrollY() tvMain.getHeight());

Log.e("",
"LINECOUNT*LINEHEIGHT = "
(tvMain.getLineCount() * tvMain.getLineHeight() - tvMain
.getHeight()));
Log.e("", "SCROLLY = " tvMain.getScrollY());
Log.e("", "TVHEIGHT = " tvMain.getHeight());
break;
case R.id.viewtxt_auto_scroll_button:
isAutoScrolling = !isAutoScrolling;
if (isAutoScrolling) {
autoScrollHandle.sendEmptyMessage(BEGIN_SCROLL);
// BtnAutoScroll.setText("停止滚屏");
} else {
autoScrollHandle.sendEmptyMessage(STOP_SCROLL);
// BtnAutoScroll.setText("自动滚屏");
}
break;

default:
break;
}
}

// 主菜单
@Override
public boolean onCreateOptionsMenu(Menu menu) {
menu.add(0, MENU_BOOKMARK, 0, "书签");
menu.add(0, MENU_SEARCH, 0, "搜索");

return true;
}

// 主菜单点击事件
@Override
public boolean onOptionsItemSelected(MenuItem item) {
super.onOptionsItemSelected(item);
switch (item.getItemId()) {
case MENU_BOOKMARK:
// 去往书签管理Activity
Intent i = new Intent(this, BookMarkActivity.class);
Bundle b = new Bundle();
b.putString("BOOKNAME", strPath);
Layout l = tvMain.getLayout();
int line = l.getLineForVertical(tvMain.getScrollY());
int off = l.getOffsetForHorizontal(line, 0);
position = off;
b.putInt("POSITION", position);
Log.e("REALPOS_BEFORE_GO", "REAL_POS " position);
i.putExtras(b);
startActivityForResult(i, REQUST_CODE_GOTO_BOOKMARK);
break;

case MENU_SEARCH:
if (isInSearching) {
tvMain.setText(strTxt);
isInSearching = false;
} else {
searchDlg.setDisplay();
}
break;
default:
break;
}

return false;
}

@Override
protected Dialog onCreateDialog(int id) {
switch (id) {
// 短信电话对话框
case DIALOG_AFTER_SELECTION:
return new AlertDialog.Builder(ReadBookActivity.this)
.setIcon(android.R.drawable.ic_dialog_info)
// .setTitle("欢迎")
.setMessage("您想用选定的文本:")
.setPositiveButton(
"发送短信",
new android.content.DialogInterface.OnClickListener() {
public void onClick(DialogInterface a0, int a1) {
Uri smsToUri = Uri.parse("smsto://");
Intent mIntent = new Intent(
Intent.ACTION_SENDTO, smsToUri);

// 复制到剪贴板,然后调用系统的短信程序
ClipboardManager clipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
clipboard.setText(strSelection);
startActivity(mIntent);

Toast.makeText(ReadBookActivity.this,
"短信内容已复制到剪贴板", Toast.LENGTH_LONG)
.show();
// SmsManager manager =
// SmsManager.getDefault();
// manager.sendTextMessage("10086",null,"hi,this is sms",null,null);

tvMain.clearSelection();
}
})
.setNeutralButton(
"拨打电话",
new android.content.DialogInterface.OnClickListener() {
public void onClick(DialogInterface a0, int a1) {
// 是否合法号码?
if (PhoneNumberUtils
.isGlobalPhoneNumber(strSelection)) {
Intent i = new Intent(
Intent.ACTION_CALL, Uri
.parse("tel://"
strSelection));
startActivity(i);
} else {
Toast.makeText(ReadBookActivity.this,
"非法的电话号码", Toast.LENGTH_LONG)
.show();
}
Log.e("", "NUM = " strSelection);
tvMain.clearSelection();
}
})
.setNegativeButton(
"取消选择",
new android.content.DialogInterface.OnClickListener() {
public void onClick(DialogInterface a0, int a1) {
tvMain.clearSelection();
}
}).create();

default:
return null;
}
}

public void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (resultCode) {
case RESULT_OK:
if (requestCode == REQUST_CODE_GOTO_BOOKMARK) {
Bundle b = data.getExtras();
int mark = b.getInt("POSITION");
Layout l = tvMain.getLayout();
if (null != l) {
// 去往书签位置
int line = l.getLineForOffset(mark);
float sy = l.getLineBottom(line);
tvMain.scrollTo(0, (int) sy);
markPos = mark;
hasBookMark = true;
Log.e("REALPOS_RES", "REAL_POS " mark);
}
}
break;
}
}
}


标签: txt阅读器 Android

实例下载地址

读书类的APP,简单的DEMO

不能下载?内容有错? 点击这里报错 + 投诉 + 提问

好例子网口号:伸出你的我的手 — 分享

网友评论

第 1 楼 star008 发表于: 2018-06-13 09:33 19
下载了打不开啊

支持(0) 盖楼(回复)

发表评论

(您的评论需要经过审核才能显示)

查看所有1条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警