首届Google暑期大学生博客分享大赛——2010 Andriod篇

自从买了android的手机后,用这一直都挺舒服的,从最早买的G1到现在用的G3,android系统的开发让我爱不释手,但是渐渐的我却发现在上面看代码却不是那么的爽快。基本上只能用txt格式的方法看,但是白底黑字的代码是无法让好“色”的我满足的,于是就萌发了自己DIY一个代码阅读器的想法。
由于这个程序主要是满足我自己的需要,所以就打算写的比较简单一点,支持C/C++/Java的简单高亮就好。所以就写出了CodeReader,先放一些截图吧,然后再慢慢说这个程序诞生的故事。



开发这个代码阅读器基本上就需要解决以下几个问题:
1.文件的读写
2.代码显示容器
3.代码的缩进
4.代码的染色
于是我便开始上网查询了一些资料~我发现文件的读写不是什么大的问题,我有一本关于Android开发的教材中讲到了文件读写的部分,于是便模仿出了下面的代码~

package com.zerob13.Codereader; import java.util.Vector; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.LinearLayout; import android.widget.TextView; public class fileData{ public String name; public int type; } class ExpBaseAdapter extends BaseAdapter { private Context mContext; private Vector mItems = new Vector(); private LinearLayout layout,layout_more; public ExpBaseAdapter(Context context) { mContext = context; } public void addItem(fileData it) { mItems.add(it); } public fileData getItem(int it) { return (fileData)mItems.elementAt(it); } public int getCount() { // TODO Auto-generated method stub return mItems.size(); } public long getItemId(int arg0) { // TODO Auto-generated method stub return arg0; } public int getItemType(int arg0) { // TODO Auto-generated method stub return getItem(arg0).type; } public void clearItems(){ mItems.clear(); } public View getView(int arg0, View arg1, ViewGroup arg2) { // TODO Auto-generated method stub //LinearLayout layout=null ; LayoutInflater inflate = (LayoutInflater) mContext.getSystemService(android.content.Context.LAYOUT_INFLATER_SERVICE); arg1 = (LinearLayout) inflate.inflate(R.layout.listfile,null); TextView fm_text_01= (TextView)arg1.findViewById(R.id.fm_text_01); fm_text_01.setText(getItem(arg0).name); //Log.v("vodone",""+arg0+" name="+getItem(arg0).name); /if (getItem(arg0).equals(".")){ }/ return arg1 ; } }

然后就是选择显示代码的容器了,一开始我的打算是用TextView,但是我发现如果用TextView的话似乎无法让代码高亮起来啊~于是我便先去寻找了一下代码高亮的实现方法。首先是找到了一个windows下的实现,就是利用RichTextView的那种组件来完成。但是似乎android自带的组件里面没有这么一个玩意啊(哈哈,我是初学者,什么都不懂)。后来问了一个朋友被告知,其实所谓的RichTextView就是和浏览器差不多的东西,就是解析了HTML之类的标记性语言然后实现了高亮。这下子就好办了,直接用android自带的webview就可以解决容器的问题了~
最后就是最关键也是最核心的部分了,如何把纯文本的代码转化成为色彩斑谰的网页呢?这里我用了一个很简单的算法,就是关键词替换~
基本上就是对文本进行扫描,遇到关键词就替换为html语句,为之上色。很快我的0.1版本就出来了~
不过问题可不是到这里就结束了,我发现原来文本里面依靠的”\t”(tab)的缩进在html里面就被忽略了,于是代码就变成了一整块黏合在一起的。怎么办呢?我查阅了html的语法,发现似乎没有什么东西是可以在html里面现实tab缩进的,一时之间卡住了。当时可谓是百思不得其解,后来很偶然的想到,为什么不直接用几个空格来代替一个tab呢?于是问题迎刃而解,不由感慨,有时候很简单的问题,但是却卡在了一条道上导致无法解决啊。
这样,基本上这个程序就完成了。测试了几段代码,效果还不错~如果大家喜欢的话可以在这里下载哦
猛击这里下载CodeReader