实验单拿到后应该松口气,挺简单的,交上来的实验单也反映出大家对这种程度的作业还是挺满意的。当然也有个别人要求再简单,这种要求极其恶劣,不予采纳。
言归正传。
这次的实验主要就是设计一个简单的登陆界面,同时实现账号密码的固定值判断。但是其中还是有一些小细节需要特别拎出来强调下,同时由于本人的一个疏忽,导致部分学生开启了隐藏关卡,也在这里做个简要分析。
要点一:
在实验单中要求多个组件的宽度保持一定的比例,这样是为了使得移动设备的屏幕尺寸即使有变动也能按比例布满整个屏幕。这个问题主要通过在线性布局中利用View的属性android:layout_weight来实现。首先组件的宽度android:layout_width为wrap_content,然后利用android:layout_weight权重来控制比例。
要点二:
在java文件中通过findViewById找到各种View,并添加上必须的事件监听对象及相应的处理程序。
要点三:
在字符串相等比较时双等号==与equals是有区别的。以前JAVA学的比较好的同学,或者擅于发现总结的同学应该会有所了解。对于JAVA中的基本数据类型==就可以直接用来比较他们的值,如int、float等。但是对于类来说==就是用来比较内存地址的了。所以这里就需要用到equals了,根据资料显示最基类Ojbect中equals的定义也是用来做内存地址比较的,但是有一部分类重写覆盖了这个方法,这里需要用到的String类就是重写了equals,可以用来做值的比较。
我们可以通过查看SDK的docs文件夹中的reference子文件夹中的java子文件夹中的lang子文件夹中的Object.html和String.html两个文件,在Object.html查看equals方法的说明文字时有这么一句:The default implementation returns true only if this == o. See Writing a correct equals method if you intend implementing your own equals method.也就表明了除非你重写该方法,否则默认就是==比较,即内存地址比较。而在String.html查看equals方法的说明文字时有这么一句:with the same length, where for every index, charAt on each string returns the same value.也就是说它是逐个char的比较过去。而char又正是一种基本数据类型,所以就是进行了值的比较。
是不是很厉害,这么个比较过程就能扯出这么些内容,还要去查API文档,看下E文感受下专业的氛围。
要点四:
Toast和AlertDialog都是用来做消息对话框显示的,但是Toast是一个简单的信息提示,没有任何可进行交互操作的地方,而是是自动就消失的。所以也没啥好说的,只是有个匿名对象的使用要稍微注意下。就是不单独创建对象,通过static方法makeText创建匿名的Toast对象,然后调用相应的方法。
但是这个AlertDialog要稍微注意下,因为通过查看SDK的docs文件夹中的reference子文件夹中的android子文件夹中的app子文件夹中的AlertDialog.html中的说明,我们可以看到AlertDialog的构造函数都是protected的,所以无法直接使用new的方式来构造一个AlertDialog对象,但我们可以利用AlertDialog的嵌套类AlertDialog.Builder来实例化对象,然后同样可以以匿名对象的方式来显示一个带按钮(取消、忽略和确定)的可交互的消息对话框。但是因为这个对话框的显示会功能多点,所以不建议继续采用匿名对象的方式,还是先创建对象,然后再调用成员函数的方法来进行。
本来到了这里么也就OK了,但是我小看了大家的观察力和认真负责的程度。在实验单中有个登陆失败后显示的消息框,我要求是自动消失的,因为当初使用的是Toast,所以我也没觉得有什么问题。但是由于当时我使用的不是原生的模拟器,所以这个Toast的显示界面和AlertDialog的界面一样了。这下就挖坑了,部分同学也就跳了进去,碰到了隐藏关卡,不过实力还不错,还是有不少人打败了BOSS。一开始还有学生问我怎么来实现AlertDialog的自动消失,我还觉得是他想多了,结果竟然是我想简单了。
那么坑挖深了,还是得填啊。怎么填?教材上,不算太超纲,只能算超前了。利用时钟或线程,也许时钟更好理解点,我们就用时钟Timer类来解决它。
教材中介绍Timer类的时候首先就介绍了一个名为schedule的成员方法,顾名思义,该方法就是一个计划安排,也就是说我们可以利用该方法来安排一个延迟并能以固定频率重复发生的计划事件。那么我们这里因为只需要一次消失就可以了不需要周期性的消失消失再消失,所以主要就是实现延迟发生即可。
原理如下:
AlertDialog消息对话框显示之后创建Timer对象,然后安排N秒之后发生一个计划事件:让对话框消失。
原理很简单,其实代码也是挺简单的,要不是AlertDialog和AlertDialog.Builder有点区别的话分分钟搞定。区别在哪里呢?AlertDialog中有遗传自Dialog类的dismiss方法用来取消显示,但是AlertDialog.Builder并不遗传自Dialog,没有这个dismiss方法。怎么办怎么办?自己挖的坑,再深也得填。
其实挺简单的,我们发现AlertDialog.Builder的成员方法show用来显示这个对话框,同时这个方法的返回值类型就是AlertDialog的,那么我们是不是可以用个变量来接收这个返回值,然后再调用dismiss就可以了。
深呼吸…………………………………………………………………………打完收工!