第2章 输入控件

输入控件是应用程序中用户接口的一种交互式组件。Android提供了大量的可供人们在UI中使用的控件,比如按钮、文本区域、(带滑块的)进度条、复选框、缩放按钮以及切换按钮等等。

在UI中增加输入控件就如同在XML布局中增加XNL元素一样简单。举例来说,下面为一个带有文本区域和按钮的布局。先看下图2-1的效果:

图2-1 各种输入控

接下来然我们看下代码清单2-1是如何布局上面这些控件的:

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="fill_parent"android:layout_height="fill_parent"android:orientation="horizontal"><EditText android:id="@+id/edit_message"android:layout_weight="1"android:layout_width="0dp"android:layout_height="wrap_content"android:hint="@string/edit_message" /><Button android:id="@+id/button_send"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@string/button_send"android:onClick="sendMessage" /></LinearLayout>

代码清单2-1

每个输入控件都支持一个特定的输入事件,如当用户输入文本或触摸一个按钮,这样你就可以处理事件。

2.1 常用控件

下面是一些常见的控件的清单,您可以在您的应用程序中使用它们。点击下面的链接,以了解每个控件更多的使用。注 意:Android提供了比这里列出来的更多的控件,可以通过浏览android.widget包发现更多的控件。如果您的应用程序需要特定的输入控件, 你可以建立自己的自定义组件。下面让我们来看一下表格2-1:

控件类型

描述

相关类

按钮

一个按钮,可以被用户按下或点击,以执行一个动作。

Button

文本域

一个可编辑的文本区域。你可以使用AutoCompleteTextView小部件来创建一个文本输入部件,以提供自动完成建议

EditText,AutoCompleteTextView

复选框

一个可以由用户切换的ON/OFF开关。当提供给用户一组不互斥的可选项时,你应该使用复选框。

CheckBox

单选按钮

与复选框类似,但一组里只可以选择一个选项。

RadioGroup
RadioButton

开关按钮

带有亮度指示的ON/OFF的按钮

ToggleButton

下拉列表

一个下拉列表,允许用户从一组数据中选择一个值。

Spinner

选择器

一个对话框供用户通过使用向上/向下按钮或手势从一系列值中选择一个值。使用DatePicker部件来输入日期(月,日,年)或使用TimePicker部件输入时间(小时,分钟,上午/下午),这将被自动的格式化为用户区域的值。

DatePicker,TimePicker

表格2-1

2.2 按钮(Buttons)

按钮包括文字或者图标,或者两者兼而有之,当用户触摸到按钮时就会触发事件。如图2-2所示:

图2-2 各种按钮

取决于你需要按钮有文本、图标或两者兼而有之,您可以以三种方式创建按钮布局:

需要有文字的按钮,使用Button类,如代码清单2-2所示:

<Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@string/button_text"... />

代码清单2-2

需要有图标的按钮,使用ImageButton类,如代码清单2-3所示:

<ImageButtonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:src="@drawable/button_icon"... />

代码清单2-3

需要有文字和图标的按钮,使用具有android:drawableLeft属性的Button类,如代码清单2-4所示:

<Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@string/button_text"android:drawableLeft="@drawable/button_icon"... />

代码清单2-4

2.2.1响应点击事件

当用户点击一个按钮时,Button对象就会收到一个单击事件。

为了定义一个按钮的点击事件处理程序,你可以在XML布局中<button元素添加android:onClick属性。这个属性的值必须是 你要调用的方法响应点击事件的名称。 使用这个布局的Activity必须执行相应的方法。例如,这里有一个使用android:onClick属性的按钮的布局,如代码清单2-5所示:

<?xml version="1.0" encoding="utf-8"?><Button xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/button_send"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@string/button_send"android:onClick="sendMessage" />

代码清单2-5

在使用这个布局的Activity中,利用下面的方法处理点击事件,代码清单2-6所示:

public void sendMessage(View view) {}

代码清单2-6

在android:onClick属性声明的方法必须完全按照上面显示。具体来说,该方法必须:

◆是public

◆返回void

◆定义一个View作为其唯一的参数

当然除了在xml中定义以外,你可以使用监听器(OnClickListener)

您也可以声明单击事件处理程序,而不是在XML布局中。因为某些情况下,如果你在运行时实例化Button,或者你需要在一个Fragment子类中声明单击事件。就需要使用setOnClickListener例如,代码清单2-7所示:

Button button = (Button) findViewById(R.id.button_send);button.setOnClickListener(new View.OnClickListener() {public void onClick(View v) {// Do something
}});

代码清单2-7

2.2.2按钮的样式风格(Styling)

按钮的外观(背景图片和字体)可能会因为机器不同而有所不同,因为不同厂家的设备的输入控件的默认样式往往不同。您可以控制控件使用适用于整个应用 程序的样式。例如,要确保所有运行Android4.0甚至更高版本的设备在您的应用程序使用Holo主题,需要在manifest的 <application>元素中声明android:theme="@android:style/Theme.Holo"。为了给按钮定 制不同的背景,指定android:background属性为图片或颜色。另外,您可以使用一种类似于HTML的样式来定义按钮的样式,可以定义多种属 性,如背景、字体、大小等等。

1. 无边框按钮

一种有用的设计是无边框按钮。无边框按钮与基本按钮相似,但是无边框按钮没有无边框或背景,但在不同状态如点击时,会改变外观。要创建一个无边框按钮,需要为按钮应用borderlessButtonStyle样式。如代码清单2-8所示:

<Buttonandroid:id="@+id/button_send"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@string/button_send"android:onClick="sendMessage"style="?android:attr/borderlessButtonStyle" />

代码清单2-8

2. 自定义背景

如果你想真正重新定义按钮的外观,你可以指定一个自定义的背景。而不是提供一个简单的位图或颜色,你的背景应该是一个状态列表资源,取决于按钮的当前状态而改变外观,。

您可以在一个XML文件中定义状态列表,定义三种不同的图像或颜色,用于不同的按钮状态。

要为按钮的背景创建一个状态列表资源,需要以下步骤:

◆创建三个按钮背景位图以表示默认、按下和选中的按钮状态。

为了确保图像适合不同大小的按钮,以<9-patch>的格式创建图像。

◆位图放到你工程的res/drawable/ directory。确保每个位图命名正确能够反映它们分别代表的按钮状态,如button_default.9.png、button_pressed.9.png以及button_focused.9.png。

◆在res/drawable/ directory下创建一个新的XML文件(命名如button_custom.xml)。使用下面的XML,如代码清单2-9所示:

<?xml version="1.0" encoding="utf-8"?><selector xmlns:android="http://schemas.android.com/apk/res/android"><item android:drawable="@drawable/button_pressed"android:state_pressed="true" /><item android:drawable="@drawable/button_focused"android:state_focused="true" /><item android:drawable="@drawable/button_default" /></selector>

代码清单2-9

这定义一个单一的绘制资源,将基于按钮的当前状态改变其图像。

第一个<item>定义了按下按钮(激活)时使用的位图。

第二个<item>定义了按钮按下时(按钮高亮时,使用轨迹球或方向键)使用的位图。

第三个<item>定义了默认状态下的按钮(既不是按下也不是选中)使用的位图。

注意:<item>元素的顺序是重要的。当图像可用时,按顺序遍历<item>元素,以确定哪一个适合当前按钮状态。因为 默认的位图在最后,当android:state_pressed 和android:state_focused的值都为false时才会被应用。

现在这个XML文件代表一个单一的绘制资源,当<Button>引用它作为背景,图像将基于按钮的三种状态而改变。

◆最后,只需应用此XML文件作为按钮的背景,如代码清单2-10所示:

<Buttonandroid:id="@+id/button_send"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@string/button_send"android:onClick="sendMessage"android:background="@drawable/button_custom"  />

代码清单2-10

2.3 文本域(Text Fields)

文本域允许用户在应用程序中输入文本。它们可以是单行的,也可以是多行的。点击文本域后显示光标,并自动显示键盘。除了输入,文本域还包含其它操 作,比如文本选择(剪切,复制,粘贴)以及数据的自动查找功能。你可以使用EditText对象在布局中添加一个文本字段, android里的写法通常是在XML布局文件中添加<EditText>元素,点击后的效果如图2-3所示:

图2-3 点击文本域后弹出的界面

2.3.1指定键盘类型

文本字段可以有不同的输入类型,如数字,日期,密码,或电子邮件地址。类型确定文本框内允许输入什么样的字符,可能会提示虚拟键盘调整其布局来显示 最常用的字符。你可以在EditText对象使用Android:inputType属性指定输入类型的键盘,例如:你想输入一个电子邮件地址上的用 户,inputType属性应为textEmailAddress。如代码清单2-11所示:

<EditTextandroid:id="@+id/email_address"android:layout_width="fill_parent"android:layout_height="wrap_content"android:hint="@string/email_hint"android:inputType="textEmailAddress" /> 

代码清单2-11

针对不同的情况有几种不同的输入类型。你可以找到所有的文件中列出的android:inputType属性,下面让我们看下各种图:

图2-4 默认的文本输入类型

图2-5 textEmailAddress文本输入类型

提示:为了让用户输入长文本字符串时换行,使用的“textMultiLine”属性。默认情况下,一个编辑文本对象仅限于一行文本和水平滚动文本时超过可用宽度。

2-6 phone文本输入类型

android:inputType还允许您指定操作行为,如在某此键盘上是否要利用所有新词,或使用自动完成和拼写建议功能。在 android:inputType的属性允许组合,让您可以一次指定一个键盘布局和一个或多个操作行为。例如,你如何收集邮政地址,利用每一个字,并禁 用文字的行为,如代码清单2-12所示:

<EditTextandroid:id="@+id/postal_address"android:layout_width="fill_parent"android:layout_height="wrap_content"android:hint="@string/postal_address_hint"android:inputType="textPostalAddress|textCapWords|textNoSuggestions" />

代码清单2-12

2.3.1指定键盘操作

除了改变键盘的输入类型,当用户完成输入时,android允许你指定特殊的按钮进行相应的操作,如把回车键作为 “搜索”或 “发送”操作。

2-7 如果你声明的Android imeOptions =“actionSend” ,键盘包括发送的动作。
您可以通过android:imeOptions属性设置指定的动作。例如,这里你可以指定发送的行为,如代码清单2-13所示:

<EditTextandroid:id="@+id/search"android:layout_width="fill_parent"android:layout_height="wrap_content"android:hint="@string/search_hint"android:inputType="text"android:imeOptions="actionSend" />

代码清单2-13

如果你不明确指定一个输入动作,然后系统将尝试确定是否有任何后续的android:focusable属性动作。如果发现了有 android:focusable属性动作,那么这个系统适用于在当前的EditText的 actionNext行动,使用户可以选择“下一步”或移动到下一个字段。如果是没有后续的focusable属性,那该系统适用actionDone 动作,你也可以通过设置Android:imeOptions属性使系统更改到其它值,如“actionSend”或“actionSearch”或禁止 使用“actionNone”动作的默认行为。

如果您已指定键盘采用Android:imeOptions属性(“actionSend”等)的操作方法,你可以使用 TextView.OnEditorActionListener监听事件行为。TextView.OnEditorActionListener接口提 供了一个回调方法onEditorAction(),它通过输入的动作ID,如IME_ACTION_SEND或IME_ACTION_SEARCH行为 调用相关的动作类型方法。例如,你可以监听用户点击键盘上的发送按钮,如代码清单2-14所示:

EditText editText = (EditText) findViewById(R.id.search);editText.setOnEditorActionListener(new OnEditorActionListener() {@Overridepublic boolean onEditorAction(TextView v, int actionId, KeyEvent event) {boolean handled = false;if (actionId == EditorInfo.IME_ACTION_SEND) {// 发送用户信息
handled = true;}return handled;}});

代码清单2-14

如果键盘太大,系统将会合理分担余下的应用程序(例如,当手机设备是横向的)空间,然后全屏(“提取模式”)被触发。在这种模式下,将在输入框旁边显示按钮,你可以通过设置imeActionLabel属性来定制按钮的文本,如代码清单2-25所示:

<EditTextandroid:id="@+id/launch_codes"android:layout_width="fill_parent"android:layout_height="wrap_content"android:hint="@string/enter_launch_codes"android:inputType="number"android:imeActionLabel="@string/launch" />

代码清单2-15

效果图如图2-8所示:


图2-8 android:imeActionLabel属性案例

2.3.2提供自动完成提示

如果你想向用户键入提供提示,您可以使用EditText的子类AutoCompleteTextView控件。为了实现自动完成,你必须指定一组 ( adndroid.widget.Adapter)文字提供建议。有几种可用的适配器,匹配数据项,如从数据库或一个数组获取所需要匹配值。如图2-9所 示:

图2-9 AutoCompleteTextView案例

下面的过程介绍了如何设置一个AutoCompleteTextView并使用ArrayAdapter适配器配置里面的所需的数组:
1. 添加AutoCompleteTextView到您的布局。这里是只是一个文本字段的布局,如代码清单2-16所示:

<?xml version="1.0" encoding="utf-8"?><AutoCompleteTextView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/autocomplete_country"android:layout_width="fill_parent"android:layout_height="wrap_content" />

代码清单2-16

2. 定义一个数组,里面包含数组所需的子值。例如,这里是一个国家的名字,这是定义在一个XML资源文件(res/values/strings.xml)数组,如代码清单2-17所示:

<?xml version="1.0" encoding="utf-8"?><resources><string-array name="countries_array"><item>Afghanistan</item><item>Albania</item><item>Algeria</item><item>American Samoa</item><item>Andorra</item><item>Angola</item><item>Anguilla</item><item>Antarctica</item>...</string-array></resources>

代码清单2-17

3. 在Acitivity中或Fragment中,建议使用下面的代码操作适配器,如代码清单2-18所示:

AutoCompleteTextView textView = (AutoCompleteTextView) findViewById(R.id.autocomplete_country);String[] countries = getResources().getStringArray(R.array.countries_array);ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, countries);textView.setAdapter(adapter);

代码清单2-18

代码中,创建一个countries的数组,并将ArrayAdapter适配器初始化,且将其绑定到simple_list_item_1文件布 局中(这是由Android提供一个文本框绑定数据的文本列表)。然后AutoCompleteTextView属性调用setAdapter()方法, 将适配器添加其中。

2.4 复选框(CheckBox)

复选框允许用户从列表中选择一个或多个选项。通常,你应该在垂直的列表中显示每一个选项。如图2-10所示:

图2-10 checkBox案例
当你要创建一个复选框时,你就必须要在你的布局文件中创建一个CheckBox字段。因为一组复选框选项允许用户选择多个选项,而且每个复选框分开管理,你必须为每一个选项注册点击监听器。

2.4.1响应单击事件

当用户选择一个复选框中的选项时,该复选框对象接收onClick事件。定义一个复选框的Click事件处理程序,需要在XML布局文件中 的<CheckBox>元素中添加android:onClick属性。这个属性的值必须是你要调用的方法响应click事件的名称。 Activity界面将会响应该事件方法。例如,这里有几组Checkbox对象列表,如代码清单2-19所示:

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="fill_parent"android:layout_height="fill_parent"><CheckBox android:id="@+id/checkbox_meat"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@string/meat"android:onClick="onCheckboxClicked"/><CheckBox android:id="@+id/checkbox_cheese"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@string/cheese"android:onClick="onCheckboxClicked"/></LinearLayout>

代码清单2-19

在Activity中,将会响应Checkboxes字段中设置的方法,如代码清代2-20所示:

public void onCheckboxClicked(View view) {boolean checked = ((CheckBox) view).isChecked();switch(view.getId()) {case R.id.checkbox_meat:if (checked){}else{}break;case R.id.checkbox_cheese:if (checked){}else{}break;}}

代码清单2-20

在方法中你必须声明android:onClick属性的方法,你在android声明:onClick属性必须严格按照上面显示的属性。具体来 说,该方法和声明按钮一样提示:如果你需要改变自己的单选按钮状态(如当加载一个保存CheckBoxPreference),使用 setChecked(boolean)或toggle()方法。当然用代码设置监听事件也是有的,与按钮类似就不在赘述。

转载于:https://www.cnblogs.com/Codenewbie/articles/2973150.html

从零开始--系统深入学习android(实践-让我们开始写代码-Android框架学习-2. 输入控件)...相关推荐

  1. 从零开始--系统深入学习android(实践-让我们开始写代码-Android框架学习-7.App Widgets)...

    第7章 App Widgets App Widgets是一个应用程序的微型视图,可以嵌入到其他应用程序(如主屏幕)并且能够定期更新.你可以发布一个应用程序的App Widget,而这些视图称为窗口的用 ...

  2. 从零开始--系统深入学习android(实践-让我们开始写代码-Android框架学习-2.service)...

    第2章 Services Service是一个长期运行在后台,并不提供用户界面的应用程序组件.其他应用程序的组件可以启动一个service,并且即使用户切换到另一个应用程序,service也可以在后台 ...

  3. qtdesigner怎么实现菜单栏跳转_人人都可写代码-Android零基础编程-app 入口菜单栏实操08...

    欢迎来到人人都可写代码,大家好,我是杨晓华,今天我们的课程内容是项目实操,以智者精选项目为例,编写一个Android app的入口关联菜单栏逻辑. 这是要实现的菜单栏组件展示效果,下面就是教大家如何制 ...

  4. 深入学习SAP UI5框架代码系列之五:SAP UI5控件的实例数据修改和读取逻辑

    这是Jerry 2021年的第6篇文章,也是汪子熙公众号总共第277篇原创文章. 系列目录 (0) SAP UI5应用开发人员了解UI5框架代码的意义 (1) SAP UI5 module懒加载机制 ...

  5. 深入学习SAP UI5框架代码系列之四:SAP UI5控件的元数据实现

    这是Jerry 2021年的第5篇文章,也是汪子熙公众号总共第276篇原创文章. 系列目录 (0) SAP UI5应用开发人员了解UI5框架代码的意义 (1) UI5 module懒加载机制 (2) ...

  6. android 按钮顶级效果_人人都可写代码-Android零基础编程-相对布局11

    欢迎来到人人都可写代码,大家好,我是杨晓华,今天我们的课程内容是:Android界面布局中的相对布局. 1.RelativeLayout的概述 (1) RelativeLayout是一个允许子视图相对 ...

  7. android 不通过数据线打印日志_人人都可写代码-Android零基础编程-开发调试、APK编译04...

    欢迎来到人人都可写代码,大家好,我是杨晓华,今天我们的课程内容是,讲解Android开发中如何调试代码程序,开发完后如何打包成可发布的apk文件. 开发调试 在开发中,难免我们会遇到BUG,快速定位问 ...

  8. php支付密码控件,Android高仿微信支付密码输入控件实例代码

    这篇文章主要为大家详细介绍了Android高仿微信支付密码输入控件的具体实现代码,供大家参考,具体内容如下 像微信支付密码控件,在app中是一个多么司空见惯的功能.最近,项目需要这个功能,于是乎就实现 ...

  9. Android仿抖音加载框之两颗小球转动控件

    Android仿抖音加载框之两颗小球转动控件 本篇文章已授权微信公众号 hongyangAndroid(鸿洋)独家发布. 效果图 安卓版抖音v2.5加载框: 本控件效果图: 使用方法 源码地址:And ...

  10. 从零开始--系统深入学习android(实践-让我们开始写代码-新手指南-3.Hello,本地化)...

    第3章 Hello,L10N(本地化) 本章我们将创建一个Hello,L10N的应用程序,它会根据Android框架来选择性的载入一些资源.然后我们将一些资源添加到res/目录中,通过这样的方法来将我 ...

最新文章

  1. Centos6下安装中文字体
  2. CheckBox in ListView
  3. 以后的blog将转移到微信公众号,请扫码关注谢谢!
  4. linux远程配置ssh服务,Linux远程服务之OpenSSH配置
  5. 使用VS开发QT项目时出现找不到QT头文件
  6. 华为AC6605二层组网,配置无线漫游
  7. 【JZOJ5336】【NOIP2017提高A组模拟8.24】提米树
  8. 淘宝逛逛ODL模型优化总结
  9. ctextart类的文档仅仅首页修改页眉
  10. 三星pay显示无法连接服务器,三星智付Samsung pay正式开启:服务器宕机 三星紧急发公告...
  11. Swift 复数变量定义
  12. Win10怎么隐藏磁盘分区
  13. @keyup.enter.native不生效问题解决
  14. 马尔可夫链及其平稳状态
  15. 软件测试肖sir___面试题总结
  16. 杭电2036——改革春风吹满地
  17. NR/5G - On demand SI
  18. 开源ERP系统Odoo16测试版发布
  19. 苹果云服务器满,管理 iCloud 储存空间
  20. 计算机主板上实时时钟晶振频率为,你知道你的笔记本电脑主板中的晶振好不好吗?...

热门文章

  1. poj 1056 IMMEDIATE DECODABILITY trie树 ——字典树 静态数组版
  2. inDesign入门教程,如何添加阴影效果?
  3. Ps 初学者教程,如何在图片中创建新背景?
  4. Photoshop 入门教程「6」如何更改图像大小?
  5. iOS 警告收录及科学快速的消除方法
  6. OCR图文识别工具Mac版:iText
  7. 多语言在线翻译工具Translatium for Mac
  8. One Switch for Mac(系统功能快速切换工具)
  9. 如何通过 Apple Watch 解锁 Mac
  10. Oracle 正则表达式函数-REGEXP_SUBSTR 使用例子