BY:Mercury@阿肆
欢迎转载,请署名出处即可!
接下来,我们要进入修改code的阶段,一下的步骤笔者已经全部走过一边,由于我们使用的例子来自早期的Android的sdk版本,所以其中有部分的使用方法已经不适合当前的SDK,再次强调一下,本文档使用的sdk版本为android sdk1.0版本,此文章撰写时已经有1.1版本release了,所以如果有出现由于版本不匹配导致的问题,您完全可以参照本例子修改的方法来修改问题。好了,我们开始修改code!
首先,我们按照上一节中的目录树的顺序来修改我们的code,以下我们以每个.java文档为标题来分析下code。
这个事例很有意思,两个小球撞,然后交叉的一瞬间发出一声“噗”的声音。这个事例的价值在于以下几点:
1. 图片的调用
2. 图片的移动
3. MP3音频文件的调用
这三个应用,我相信在大多数的软件开发中,或多或少都会用到,下面我们来分析下代码中一些比较重要的地方,由于篇幅有限,我们只分析主要功能部分和可能出现问题的部分。
这里穿插个小诀窍,Eclipse是个非常好的IDE软件。不但能编写c/c++、java等等,而且能写网页程式、应用程式等等,我们现在读写的代码量不是很大,但是一旦大起来行数就估计是上千行的代码,如果我们想看我们的代码倒地有多少行呢?很简单了,在程式编辑区,我们点击鼠标右键,接下来我们能看到如下图10所示的一个菜单,
图10 显示菜单
如图所示,我们选择“Preference”,接下来,大家会看到一个形如图11所示的对话框,
图11 属性对话框
不用我多说大家一定能找到一行熟悉的功能选择项:“Show Line Numbers”,好了,点击OK,我们进入CanvasExample的修改和阅读。
问题1,import 中的错误:
我们第一个遇到的问题就是import的一个小红叉,具体形如下图12所示:
图12 import 问题
我们遇到小红叉,首先可以在小红叉上点击下左键,eclipse会弹出来一个提示,提示您可以解决这个错误的方法,这里我们选择屏蔽该句语句来排除错误,这是因为,您可以到http://developer.android.com/reference/packages.html下去查找一下这个包,很遗憾的是,这个包已经不复存在,具体消失的原因不明,可能是有bug或者占用系统资源过多,这个不用我们去细究,我们屏蔽它,一个小红叉子就这样解决了。
问题2 程式中的函数:
接下来的错误发生在48行左右,具体情况如图13所示,
图13 函数问题
函数名在不同的版本中有相应的修订,比如我们这个问题中出现的小红叉,就是因为不通版本的sdk导致的,但是不用担心,我们依然按照上述的方法,点击下小红叉,我们知道了错误的愿意,系统提示我们修改canvas.getBitmapWidth()和canvas.getBitmapHeight()两个函数的函数名,这是,大家完全可以再回到我们的http://developer.android.com/reference/packages.html来查查,依然很不幸,找不到这两个东东,但是我们看看他们的类对象canvas,大家可以在http://developer.android.com/reference/android/graphics/Canvas.html下看到对它的详细描述,这里我们节约时间,修改好这两个函数就好了,大家可以仔细参阅下以上的网站来学习。
这时候我们会发现,这个CanvasExample中的错误都没有了,这里我们暂时放下,进入下一个程式文档的调试,先埋一个伏笔,这个程式有一个bug会让我们很无奈。等跑到了我们再回来改改。
接下来,我们快速的把整个程式文档中的功能来过一遍,我们只看具体的函数名来分析功能,内部的实现只说比较主要的,其他由于篇幅限制不提及。
首先,我们看到import了很多的包,一共13个。如果大家有兴趣的话可以去http://developer.android.com/reference/packages.html具体了解下包的用法,接下来,我们进入主要程式部分,java的特点这里稍微提下大家应该都是知道的,java是一个纯的面向对象的语言,好了,所有的东西我们看成类来处理就好了,这里我们建立了一个名曰CanvasExample的基于Activity的类作为整个功能的主类,接下去是一些对象和变量的定义,这里我们看到了一个CustomView,这个是一个什么来的呢?
我们往下看能看到它的本尊,其实他是一个View类的扩展类,这里我们把他作为CanvasExample的一个保护类来实现,它的里面可谓是五脏俱全了,我们主要的功能实现都在它的实现中,起始当然是一些变量和对象的定义,接下来是这个类的成员函数实现,我们一次列出来给大家通过注释的方式解释下功能,具体如下文所描述:
l CustomView //构造函数,准备画小球放音乐;
l drawSprint //画小球(保护成员函数);
l onDraw //画画函数,放音乐函数(公共成员函数);
好了,其中的实现部分大家自己好好研究下,接下来的一些函数是一些必备的公共函数,我们也按照上面的方法来简单描述下,具体实现大家自己研究下:
l onCreate //创建此功能;
l onKeyDown //按下键触发事件;
l onDestroy //功能销毁;
l onPause //功能暂停;
l onResume //功能恢复;
我们就这样先去除掉了一个文档中的所有小红叉,不要停下来,我们继续!
这个程式文档中没有任何的错误,我们很高兴的跳过它。
登录模式程式,说白了是一个假登录,这里是所要实现的功能和我们可能有应用到的功能如下:
1. 对话框的使用;
2. 提交对话框中的内容;
3. 用一个提示对话框来现实我们输入的内容(笔者扩展功能);
和上面分析方式一样,我们首先来改改小红叉,看着他们在心烦意乱的没办法阅读好真个程式文档。
问题1:showalert成员函数
这次我们遇到的只有一个问题,但是这个问题实在是对我们来说比较无奈,还是老方法,大家去查下ShowAlert这个成员函数会发现,非常无奈的,没有了。但是我们又非常强烈的意识到,这个提示对话框的重要性,基本上应用程式软件里多多少少都要用到,所以我们要自己来实现这个功能,如何实现能?
其实我们仔细想想,无非不就是一个对话框的弹出,而且显示了我们输入的相关内容,有确定,有关闭,好了,我们就建立个对话框然后做一些相应的处理。
首先我们先把“this.showAlert("Login Data", 0, "Login" ……”这行程式给注释掉,先让小红叉消失。接下来我们分析下对话框程式的实现,这里为了节约大家宝贵的时间,我直接把我已经调试好放上来给大家分析下,具体如下:
import android.app.AlertDialog;//引用对话框包
import android.content.DialogInterface; //引用对话框包中现实内容的接口
//modify by mercury xu 20090314 in the new sdk
//they don't support this function as showAlert!
//this.showAlert("Login Data", 0, "Login" + usrTxt + " : " + pwdTxt, "ok!", false);
new AlertDialog.Builder(loginScreen.this)//新建一个对话框对象
.setTitle("Login Data")//设置对话框名称
.setMessage("Login :" + usrTxt + "/n"+ "Password : " + pwdTxt)
//设置对话框内现实内容,获取两个输入框中的内容
.setIcon(R.drawable.icon)//选择对话框现实图标
.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
setResult(RESULT_OK); //确认按钮实现
finish();//关闭对话框
}
})
.setNegativeButton("No", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
}
}) //取消按钮实现
.show(); //关闭对话框
到这里这个showalert的替代实现方法分析完了,至于输入框传值在grabEnteredText中实现,按钮的提交的功能在onClick中实现。请大家仔细阅读。
直入正题,修改错误小红叉!
问题1 OnFocusChangeListener
这个问题我们直接看看他的错误提示,如下图14所示:
图14 OnFocusChangeListener 问题
我们直接参考系统提出的修改意见来修订,我们会发现出现一个新的函数定义部分,具体如下代码所示:
public void onFocusChanged(View v, boolean hasFocus)
{
adjustTextColor(v, hasFocus);
}
public void onFocusChange(View v, boolean hasFocus) {
// TODO Auto-generated method stub
}
……
}
这行代码让我们看的很无奈,onFocusChanged和onFocusChange。这只是SDK版本的不同所导致,具体详情大家可以查看下相关的文档提示;我们为了减少代码量,直接把上面的onFocusChanged修改下就可以了,下面系统帮助我们生成的可以不要了。
问题2 setBackground 问题
同样这里是由于setBackground已经不在新的SDK中,这里我们点击小红叉,有如下的提示如图15所示:
图15 setBackground 问题
这里由于我们是要引用一个资源,当然,我们选择“setBackgroundResource”来代替他,其他的函数大家可以参考相关资料来学习。
问题3 setAlignment
这个问题是一个比较头痛的问题,因为引用它的对象title是来自TextView,而TextView中已经没有setAlignment这个函数,这个函数已经被移动到了Layout,如果我们要修改动作幅度还是有些大,对于新手来说可以尝试,这里我们由于时间关系,我们暂时把这句话屏蔽处理。
问题4 import处的警告
这个时侯我们回头会看到import会有很多黄色的感叹号,也就是警告,虽然不是错误,但是还是看着烦,这时候我们还是用老方法,点击下小黄感叹号,好了,系统给出了一个建议,如下图16所示:
图16 import警告
第一个方法,删除import,这个我们肯定不能做,第二个组织imports,第三个,加一个“unused”来处理重复的调用,这里为了减少代码量,我们重新组织下import。
这个程式文档主要实现的是对2个功能程式之间的调用,重点要阅读的几个函数如下:
l onClick //点击事件相应
l onCreate //创建功能
l onFocusChange //焦点变化处理
这个程式文档中没有任何的错误,我们很高兴的跳过它。但是这个文件我们需要阅读,因为他是所有资源注册的一个文件,图像,音频文件都有在它这里登记一个编号,系统调用是才可以用到,这个大家要注意的。
这是唯一一个非.java文件出错的文件。这个文件主要是负责对登录功能界面的处理,这里出错的主要原因为:“ERROR No resource identifier found for attribute 'textAlign' in package 'android'”,无法识别'textAlign'这个功能,这也是由于SDK导致,处理方法与在MainMenu中的处理方法类似,直接删除“android:textAlign="center"”这句话即可
这样一来,我们就基本上把小红叉干掉了,接下来我们可以再来debug/run一次了。