看了爱上疯人院姑娘大神写的aide教程,忍不住自己动手写了一个表达式计算器小程序,觉得不难。于是决定再做一个简单的文本文件编辑器,类似920文本编辑或quickedit那样的,最起码也要类似windows记事本。感觉似乎不难,开工后才发现根本不是那么回事,困难重重啊!磕磕绊绊的总算弄了个初稿,勉强可以用了。感谢csdn上各位的无私分享,我也发一下过程,给初学借鉴。
先贴几张图片吧。
首先,要能实现文本文件的读和写。在 AndroidManifest.xml文件加入
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
在MainActivity.java里要加上读、写文件的函数。
读:
//读文件的函数 throws Exception扔掉异常处理,需要用try了。
public static String fileRead(String path)throws Exception{
//获得文件编码,解决文本文件编码乱码问题
String fileEncode=EncodingDetect.getJavaEncode(path);
File file=new File(path);
if(!file.isFile())return null;
String line="";
BufferedReader br=new BufferedReader(new InputStreamReader(new FileInputStream(file),fileEncode));
StringBuffer sb=new StringBuffer();
/*while( br.read()!= -1){
String s = br.readLine();
}*/
while((line=br.readLine())!=null){
sb.append(line);
sb.append("\n");
}
br.close();
String str=sb.toString();
return str.substring(0,str.length()-1);
}
写文件:
//写文件的函数,需要在AndroidMainifest.xml中加入<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
public void fileWrite(String path,String data){
File file=new File(path);
try{
file.getParentFile().mkdirs();//创建目录
FileWriter wre=new FileWriter(file);
wre.write(data);
wre.close();
}
catch (IOException e)
{
e.printStackTrace();
Toast.makeText(MainActivity.this,"error, io. ",Toast.LENGTH_LONG).show();
}
catch (Exception e){
e.printStackTrace();
Toast.makeText(MainActivity.this,"error, try write ",Toast.LENGTH_LONG).show();
}
}
然后,不能总是手动输入文件路径和名字吧。参考网络资料,建好打开、另存对话框。
这个对于初学者有点复杂,要有图形界面,要有文件操作,基本算是个小型的文件管理器了。费了好几天才搞定。还是要感谢csdn的大神分享才行:)
代码太长不全贴了。基本就是调用、接受对话框过程。
//接受对话框返回结果
@Override
protected void onActivityResult(int requstCode, int resultCode, Intent data){
if (requestCode == MainActivity.REQUEST_CODE)
{
if (resultCode == SaveFileDialogActivity.RESULT_CODE)
{
//获取写入文件名
FilePathName = data.getStringExtra("FilePathName");
//Toast.makeText(MainActivity.this,"SaveFile"+FilePathName,Toast.LENGTH_LONG).show();
tvShow.setText("另存为"+OpenFileDialogActivity.RESULT_CODE);
etFileName.setText(FilePathName);
//写入文件
String str1,str2;
str1=etFileName.getText().toString();
str2=etRead.getText().toString();
tvShow.setText("Write…"+str1);
etFileName.setText(str1);
fileWrite(str1,str2);//调用,已经try了。
}
else if (resultCode == OpenFileDialogActivity.RESULT_CODE){
//获取打开文件名
FilePathName = data.getStringExtra("FilePathName");
//当前的目录
NowFilePath=data.getStringExtra("NowFilePath");
//tvShow.setText("打开"+OpenFileDialogActivity.RESULT_CODE);
etFileName.setText(FilePathName);
//存入最近打开文件记录序号,下次打开还有。
spF1.edit().putString("spn1",""+recentN).commit();
//存入刚打开的文件夹位置
spF1.edit().putString("spnowpath",NowFilePath).commit();
//最近打开文件顺次下移,留出第一个
String StrTemp;
int IntTemp;
for(int i=recentC;i>0;i--){
IntTemp=i-1;
StrTemp=spFileName.getString("expstr"+IntTemp,"");
spFileName.edit().putString("expstr"+i,StrTemp).commit();
}
//存入第一个为最新
spFileName.edit().putString("expstr1",FilePathName).commit();
try{
//StrRead=fileRead(etFileName.getText().toString());
StrRead=fileRead(FilePathName);
etRead.setText(StrRead);
tvShow.setText("文件"+FilePathName+"有:"+StrRead.length()+"个字符,"+"目录:"+NowFilePath);
//Toast.makeText(MainActivity.this,"OK,read.",Toast.LENGTH_LONG).show();
}
catch (IOException e)
{
e.printStackTrace();
Toast.makeText(MainActivity.this,"error, io.Read ",Toast.LENGTH_LONG).show();
}
catch (Exception e){
e.printStackTrace();
Toast.makeText(MainActivity.this,"error, try Read ",Toast.LENGTH_LONG).show();
}
}
}
}
调用对话框,以读为例:
requestCode=1;
resultCode=5;//指定读对话框
Intent intent = new Intent(MainActivity.this, OpenFileDialogActivity.class);
intent.putExtra("DefaultFilePath", Environment.getExternalStorageDirectory().getPath());
intent.putExtra("NowFilePath", NowFilePath);
intent.putExtra("DefaultFileName", "default.txt");
intent.putExtra("Ext", ".txt");
startActivityForResult(intent,MainActivity.REQUEST_CODE);
//Toast.makeText(this, "你点击了“打开对话框”按键!", Toast.LENGTH_SHORT).show();
etRead.requestFocus();
etRead.setSelection(0);
接着怎么也得有查找\替换功能吧。唉继续查资料,硬着头皮试。
查找的函数:
//查找
public void FunFind(){
//String str3;
if (StrFind!=""){
etRead.requestFocus();
StrRead=etRead.getText().toString();
tvShow.setText(StrFind);
FindN=StrRead.indexOf(StrFind);
if(FindN!=-1)//能找到的话
{
SpannableString ssb = new SpannableString(StrRead);
ssb.setSpan(new UnderlineSpan(),FindN, StrFind.length()+FindN, Spanned.SPAN_INCLUSIVE_INCLUSIVE);
etRead.setText(ssb);
etRead.setSelection(FindN);
}
else{
tvShow.setText("找不到!");
if (ad_nofind==null){
ad_nofind_init();
}
ad_nofind.show();
}
}
else{
Toast.makeText(MainActivity.this, "请输入查找字符", Toast.LENGTH_SHORT).show();
}
}
替换的函数
//替换
public void FunReplace(){
if (StrFind!=""){
etRead.requestFocus();
StrRead=etRead.getText().toString();
tvShow.setText("Replace…"+StrFind+"to"+StrReplace);
FindN=StrRead.indexOf(StrFind);
if(FindN!=-1)//能找到的话
{
StrRead=StrRead.replaceFirst(StrFind,StrReplace);
SpannableString ssb = new SpannableString(StrRead);
ssb.setSpan(new UnderlineSpan(),FindN, StrReplace.length()+FindN, Spanned.SPAN_INCLUSIVE_INCLUSIVE);
etRead.setText(ssb);
etRead.setSelection(FindN);
}
else{
tvShow.setText("找不到!");
if (ad_nofind==null){
ad_nofind_init();
}
ad_nofind.show();
}
}
else{
Toast.makeText(MainActivity.this, "请输入查找字符", Toast.LENGTH_SHORT).show();
}
}
基本好了,但是为方便使用,最好能记住最近曾经打开的文件。看了些资料,还是用SharedPreferences比较简单。
//声明存储单元
SharedPreferences spFileName,spF1,spF2,spF3;
//建立存储
spFileName=getSharedPreferences("SAVE",MODE_PRIVATE);
strSpFileName=spFileName.getString("expstr1","");
spF1=getSharedPreferences("SAVE",MODE_PRIVATE);
大家可以参考网络资料,这里不赘述了。
至于其他文本颜色,字符统计等并不算难,磕磕绊绊总算弄了个文本文件编辑器(试作版).。基本满足自己的需要了。
不足之处:行号显示并随文本滚动;文件夹对话框不能不显示隐藏文件等功能暂时未能搞定。如果大家有办法希望告诉我,谢谢啦!
最后是源代码下载地址: