Android开发技术讲义之输入控件
输入控件是用户UI中用于交互的组件。Android中提供了大量的控件,比如按钮、文本框等
添加控件,只需要在XML布局文件中添加XML元素即可,如下例: 每种输入控件支持可处理的特定输入事件集,如当用户输入文本或按下按钮等。常用控件 按钮
按钮是由文本或者图标(或既有文本又有图标),它的作用是当用户触摸按钮的
会处理某种动作(action)。
以按钮上是否是文本、图标或者两者均有这三种情况,创建按钮的方式有三种: 有文字的:
text属性值为string资源
有图标的,使用ImageButton:
src属性值为drawable资源
既有文本又有图标的:
drawableXXX属性指定drawable资源,其中绘制图标的位置XXX为位置,比如本例中的drawableLeft,可以有: android:drawableBottom放在文本下方 android:drawableEnd放在文本后面 android:drawableLeft放在文本左边 android:drawableRight放在文本右边 android:drawableStart放在文本开始 android:drawableTop放在文本上面 对单击事件的相应
当用户单击一个按钮的时候,Button对象接收到一个onclick事件。
为定义button的事件处理器,需要在Button元素中添加一个android:onClick属性。该属性的值必须是对事件进行相应的方法名。该布局的对应Activity必须实现该方法。例如: 相应的Activity中应该有如下的方法,该方法相应该按钮的单击事件: /** Called when the user touches the button */ publicvoidsendMessage(View view){ // Do something in response to button click } 该响应方法必须满足下面的要求: 必须是public 返回void 有一个唯一的View参数
除了上面的方法,还可以在程序中使用事件监听的方式,这种方式要求你要实例化一个Button对象,再创建一个View.OnClickListener对象,并把该对象作为实参传递给Button的setOnClickListener(View.OnClickListener),如下: Button button =(Button)findViewById(R.id.button_send); button.setOnClickListener(newView.OnClickListener(){ publicvoid onClick(View v){ // Do something in response to button click } }); 上例中setOnClickListener的参数为一个匿名类的对象(注意创建方式),该匿名
类中有一个onClick方法,该方法的方法体既是对事件的响应代码。
定义按钮的样式
因为不同设备的生产商的输入控件的默认样式可能是不一样的,所有按钮在不同的设备上的表现可能不一致。
你可以通过设置整个app的主题来控制你的控件的表现。比如:保证所有的设备运行在Android 4.0及以上且使用Holo主题,这需要在你的Manifest文件中的元素中声明主题android:theme=\"@android:style/Theme.Holo\"为定制某个按钮的背景,设置android:backgroud属性为一个drawable或color资源。另外,你也可以应用button为某种样式,就像在HTML中定义background、font、size等一样。
无边框按钮
无边框按钮没有边框或者背景,但在不同的状态下,如单击时,还是能改变外观。给按钮应用borderlessButtonStyle样式,例如: 定制背景如果你想重新定义你的按钮的表现,你可以指定一个定制的背景。除了提供简单的背景bit图片或者颜色外,你可以根据按钮的状态将背景定义为一个状态表资源,从而在不同状态下有不同的外观。
在一个XML文件中定义三种不同的图片或者颜色对应不同的按钮状态:
1. 创建三个不同的位图图片,代表default、pressed和focused这三种状态,
为保证你的图片适应不同的大小,该图片应设计为Nine-patch图片
2. 把这些图片放在res/drawable/这个工程目录中,确保每个图片的名字反映
按钮的状态,比如button_default.9.png、
button_pressed.9.png,、 button_focused.9.png
3. 在res/drawable/目录中创建一个新的XML文件(名字诸如
button_custom.xml之类),把下面的XML插入文件中:
这里定义了一个drawable资源,会根据按钮的不同状态应用不同的图片: 第一个- 定义了当按钮按下时的位图
第二个- 定义了当按钮获得焦点时的位图
第三个- 定义了当按钮处于default状态时的位图(既不是按下,也不
是获得焦点)
注意:- 的顺序非常重要,当这个drawable资源被引用的时候,
- 元素按顺序对应到当前的按钮状态。因为default位图在最后,只有当android:state_pressed 和 android:state_focused 均为false时才会应用。
这个XML文件表示一个drawable资源,当某个按钮引用它作为背景的时候,会根据它的状态显示不同的图片
我们只需要在XML文件中修改button的背景即可:
Nine-patch
一个NinePatchDrawable图片是一个可以拉伸的位图图像,Android可以自动根据view中的内容适应其大小。一个NinePatch是一个标准的PNG图片,它包括一个附加的一像素宽的边框,文件名的后缀必须是.9.png,并且必须存放在res/drawable/目录中。
边框用于定义可伸缩的范围及不能伸缩的范围。在图片的顶部及左边绘制上一像素宽的黑色线,表示可伸缩的范围,边框的其余部分为白色或者透明。你可以定义多个可伸缩(stretchable)区域,这些区域在伸缩时保持其相对大小。
你也可以在图片的右边及下边划一条线来定义一个可选的drawable区域(实际上就是padding线),如果一个view对象把一个NinePatch设置为它的背景并指定view的文本,该view会伸缩它自己以便所有的文本适应右边及下边线指定的区域。如果没有padding线,android会使用左边及顶部的线来定义可绘制(drawable)区域。
这两种线的区别在于,左边及上边的线表明该部分的像素可以被复制以拉伸,右边及下边的线定义的区域表示内容必须放在该区域中,如下:
这张图的左边及上部的线定义了可伸缩区域,右边及下边的线定义了可绘制区域。在上面图片中灰色点线表示可伸缩区域,在下面图片中紫色区域表示按钮内容所在的区域,换句话说,紫色边框到四边之间为内容同四边之间的padding。
示例XML
我们把做好的NinePatch图片放在res/drawable/下,XML中的代码如下:
注意宽度和高度都设置为“wrap_content”,下面的图为显示效果: