在安卓手机上用aide(java)开发一个文本文件编辑器(记事本)

2 篇文章 0 订阅
1 篇文章 0 订阅

看了爱上疯人院姑娘大神写的aide教程,忍不住自己动手写了一个表达式计算器小程序,觉得不难。于是决定再做一个简单的文本文件编辑器,类似920文本编辑或quickedit那样的,最起码也要类似windows记事本。感觉似乎不难,开工后才发现根本不是那么回事,困难重重啊!磕磕绊绊的总算弄了个初稿,勉强可以用了。感谢csdn上各位的无私分享,我也发一下过程,给初学借鉴。

先贴几张图片吧。

文本编辑器diy01

文本编辑02

文本编辑03

文本编辑04

首先,要能实现文本文件的读和写。在 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);

大家可以参考网络资料,这里不赘述了。

至于其他文本颜色,字符统计等并不算难,磕磕绊绊总算弄了个文本文件编辑器(试作版).。基本满足自己的需要了。

不足之处:行号显示并随文本滚动;文件夹对话框不能不显示隐藏文件等功能暂时未能搞定。如果大家有办法希望告诉我,谢谢啦!

最后是源代码下载地址:

https://download.csdn.net/download/qq_42030500/10816217

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值