2.3 第2组UI组件:TextView及其子类
TextView及其子类的类图;本节将对TextView及其子类进行系统总结
2.3.1 文本框(TextView)与编辑框(EditText)的功能和用法
TestView的XML属性与方法说明 android.widget.TextView
实例:不同颜色、字体、带链接的文本
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_height="match_parent"
android:layout_width="match_parent"
>
<!-- 设置字号,文本框结尾处绘制图片 -->
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/str01"
android:textSize="20pt"
android:drawableRight="@drawable/res"
android:drawableEnd="@drawable/res"
/>
<!-- 设置中间省略,所有字母大写 -->
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/str02"
android:singleLine="true"
android:ellipsize="middle"
android:textAllCaps="true"
/>
<!-- 对邮件电话添加连接 -->
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:singleLine="true"
android:text="@string/str03"
android:autoLink="email|phone"
/>
<!-- 设置文子颜色、大小、并使用阴影 -->
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/str04"
android:shadowColor="#00F"
android:shadowDx="10.0"
android:shadowDy="8.0"
android:shadowRadius="3.0"
android:textColor="#f00"
android:textSize="18pt"
/>
<CheckedTextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/str05"
android:checkMark="@drawable/ok"
/>
</LinearLayout>
实例:圆角边框、渐变背景的TextView
2.3.2 EditText的功能与用法
- EditText与TextView最大的区别是:EditText可以接受用户输入
- EditText组件最重要的属性是inputType,用于EditText为指定类型的输入组件
-
EditText派生了两个子类
- AutoCompleteTextView:带有自动完成功能的EditText,通常与Adapter结合使用
- ExtractEditText:它是EditText组件的底层服务类,负责全屏输入法支持(不是UI组件)
实例:用户友好的输入界面
<?xml version="1.0" encoding="utf-8"?>
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_height="match_parent"
android:layout_width="match_parent"
android:stretchColumns="1"
>
<TableRow>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/str01"
android:textSize="16sp"
/>
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/str02"
android:selectAllOnFocus="true"
/>
</TableRow>
<TableRow>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/str03"
android:textSize="16sp"
/>
<!-- android:inputType="numberPassword"表明只接受数字密码 -->
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="numberPassword"
/>
</TableRow>
<TableRow>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/str04"
android:textSize="16sp"
/>
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="number"
/>
</TableRow>
<TableRow>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/str05"
android:textSize="16sp"
/>
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="date"
/>
</TableRow>
<TableRow>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/str06"
android:textSize="16sp"
/>
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="phone"
android:selectAllOnFocus="true"
/>
</TableRow>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/str07"
/>
</TableLayout>
android:hint,当用户没输入信息的时候,显示的内容
android:inputType,指定文本框只接受的数据类型,并且自己切换对应的输入法
android:selectAllOnFocus=“true”,自动选取该组件内的所有的文本内容
2.3.3 按钮(Button)组件的功能和用法
-
Button继承了TextView,与TextView不同的是,当用户单击按钮时,按钮会触发一个OnClick事件。
-
Button使用起来与TextView差不多,可以设置android:background与定义Drawable对象来开发出各种各样的按钮。
2.3.5 单选按钮(RadioButton)与复选框(CheckBox)的功能与用法
- 单选按钮(RadioButton)和复选框(CheckBox)、状态开关按钮(ToggleButton)与开关(Switch)都继承了Button类。
- RadioButton、CheckBox多了一个可选中的按钮,因此都可额外指定一个android:checked属性,该属性用于指定它们初始时是否被选中。
- 它们的不同之处在于,一组RadioButton只能选中其中一个,因此RadioButton通常要与RadioGroup一起使用,用于定义一组单选按钮。
- 单选按钮是两个状态的按钮,可以选中也可以取消选中。当单选按钮未选中时,用户可以按下或单击它来选中它。但是相反
CheckBox
,单选按钮一旦选中就不能被用户取消选中。单选按钮通常在RadioGroup
. 当多个单选按钮位于一个单选组中时,选中一个单选按钮会取消选中所有其他单选按钮。
实例:利用单选按钮、复选框获取用户信息
<?xml version="1.0" encoding="utf-8"?>
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
>
<TableRow>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="性别"
android:textSize="16sp"
/>
<!-- 定义一组单选按钮 -->
<RadioGroup android:id="@+id/rg"
android:orientation="horizontal"
android:layout_gravity="center_horizontal">
<!-- 定义两个单选按钮-->
<RadioButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/male"
android:text="男"
android:checked="true"
/>
<RadioButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/female"
android:text="女"
/>
</RadioGroup>
</TableRow>
<TableRow>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="喜欢的颜色"
android:textSize="16sp"
/>
<!-- 定义一个垂直的线性布局-->
<LinearLayout
android:orientation="vertical"
android:layout_gravity="center_horizontal"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
>
<!-- 定义三个复选框-->
<CheckBox
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="红色"
android:checked="true"
/>
<CheckBox
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="蓝色"
/>
<CheckBox
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="绿色"
/>
</LinearLayout>
</TableRow>
<TextView
android:id="@+id/show"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="您的性别是男"
/>
</TableLayout>
上面的界面布局中定义了一组单选按钮以及三个复选框,并默认勾选了第一个。
-
如果在XML布局文件中默认勾选了某个单选按钮,则必须为该组单选按钮的每个按钮指定android:id属性值,否则这组单选按钮不能正常工作。
添加事件监听器,监听这组单选按钮的勾选状态的改变。
public class MainActivity extends AppCompatActivity {
RadioGroup rg;
TextView show;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//获取布局文件中rg、show两个组件
rg = (RadioGroup) findViewById(R.id.rg);
show = (TextView) findViewById(R.id.show);
//为RadioButton的OnCheck事件绑定事件监听器
rg.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup radioGroup, int i) {
String tip = i == R.id.male ? "您的性别是男" : "您的性别是女";
show.setText(tip);
}
});
}
}
2.3.6 状态开关按钮(ToggleButton)与开关(Switch)的功能与用法
状态开关按钮togglebutton和开关switch是由button派生出来的,本质也是按钮,支持BUtton的各种属性,从功能上看,ToggleButton、Switch与CheckBox非常的相似,他们都可以提供两种状态,不过更常用的是切换程序中的某种状态。
XML属性 | 相关方法 | 说明 |
---|---|---|
android:checked | setChecked(boolean) | 设置该按钮是否被选中 |
android:textOff | 设置该按钮的状态为关闭时的文本 | |
android:textOn | 设置该按钮的状态为打开时的文本 |
XML属性 | 相关方法 | 说明 |
---|---|---|
android:checked | setChecked(boolean) | 设置该开关是否被选中 |
android:switchMinWidth | setSwitchMinWidth(int) | 设置该开关的最小宽度 |
android:switchPadding | setSwitchPadding(int) | 设置该开关与标题文本之间的空白 |
android:switchTextAppearance | setSwitchTextAppearance(Context,int) | 设置该开关图标上的文本样式 |
android:textOff | setTextOff(CharSequence) | 设置该开关的状态关闭时显示的文本 |
android:textOn | setTextOn(CharSequence) | 设置该开关的状态打开时显示的文本 |
android:textStyle | setSwitchTypeface(Typeface) | 文本的样式(粗体、斜体、粗体) |
android:thumb | setThumbResource(int) | 指定使用自定义Drawable绘制该开关的开关按钮 |
android:track | setTrackResource(int) | 指定使用自定义Drawable绘制该开关的开关轨道 |
android:typeface | setSwitchTypeface(Typeface) | 文本的字体(正常、无衬线、衬线、等宽) |
实例:动态控制布局
思路:在页面中增加一个ToggleButton,随着该按钮状态的改变,界面布局的LinearLayout布局的方向在水平布局、垂直布局之间切换。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_height="match_parent"
android:layout_width="match_parent"
>
<!-- 定义一个ToggleButton按钮-->
<ToggleButton android:id="@+id/toggle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textOff="横向排列"
android:textOn="纵向排列"
android:checked="true"
/>
<Switch android:id="@+id/switcher"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textOff="横向排列"
android:textOn="纵向排列"
android:thumb="@drawable/check"
android:checked="true"
/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:id="@+id/test"
>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="测试按钮1"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="测试按钮2"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="测试按钮3"
/>
</LinearLayout>
</LinearLayout>
接下来为ToggleButton与Switch按钮绑定监听器,当状态发生改变时,通过程序改变LinearLayout的布局方向。
public class MainActivity extends AppCompatActivity {
ToggleButton toggle;
Switch switcher;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
toggle = (ToggleButton) findViewById(R.id.toggle);
switcher = (Switch) findViewById(R.id.switcher);
final LinearLayout test = (LinearLayout) findViewById(R.id.test);
CompoundButton.OnCheckedChangeListener listener = new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
if(b){
test.setOrientation(1);
}
else{
test.setOrientation(0);
}
}
};
toggle.setOnCheckedChangeListener(listener);
switcher.setOnCheckedChangeListener(listener);
}
}
2.3.7 时钟(AnalogClock和DigitalClock)的功能与用法
时钟UI组件是两个非常简单的组件,DigitalClock继承了TextView,只是它里面显示的内容是当前时间,因此为DigitalClock设置android:text属性没什么作用。
AnalogClock则继承了View,它重写了View的OnDraw方法,它会在View上绘制模拟时钟。
DigitalClock可以显示当前的秒数,AnalogClock不会显示当前秒数。
XML属性 | 说明 |
---|---|
android:dial | 设置该模拟时钟的表盘使用的图片 |
android:hand_hour | 设置该模拟时钟的时针表盘使用的图片 |
android:hand_minute | 设置该模拟时钟的分针使用的图片 |
实例:手机里的“劳力士”
我们只需要对AnalogClock的表盘、时针、分针设置合适的图片即可开发手机里的劳力士,这里仅展示普通的模拟、数字时钟。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_horizontal"
>
<AnalogClock
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<DigitalClock
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="14pt"
android:textColor="#f0f"
/>
</LinearLayout>
2.3.8 计时器(Chronometer)
Chronometer与DigitalClock一样都继承与TextView,因此它们都会显示一段文字,Chronometer显示的是从某个起始时间开始,一共过去了多长时间。
Chronometer提供了一个android:format属性,用于指定计时器的计时格式,除此之外,还支持如下常用方法:
- **setBase(long base):**设置计时器的起始时间。
- setFormat(String format):设置显示时间的格式。
- **start():**开始计时。
- **stop():**停止计时。
- **setOnChronometerTickListener(Chronometer.OnChronometerTickListener listener):**为计时器绑定事件监听器,当计数器改变时触发该监听器。
实例代码
布局文件中定义了一个Chronometer组件和一个Button组件。当用户单击Button时系统开始计时,当计时超过20秒时停止计时。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_height="match_parent"
android:layout_width="wrap_content"
android:layout_gravity="center_horizontal"
>
<Chronometer
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/test"
android:textSize="50sp"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="启动"
android:textSize="70sp"
android:id="@+id/start"
/>
</LinearLayout>
java代码:
public class MainActivity extends AppCompatActivity {
Chronometer ch;
Button start;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ch = (Chronometer) findViewById(R.id.test);
start = (Button) findViewById(R.id.start);
start.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//设置开始时间
ch.setBase(SystemClock.elapsedRealtime());
//启动计时器
ch.start();
//设置按钮不能按
start.setEnabled(false);
}
});
ch.setOnChronometerTickListener(new Chronometer.OnChronometerTickListener() {
@Override
public void onChronometerTick(Chronometer chronometer) {
//如果计时超过了20秒则停止
if(SystemClock.elapsedRealtime() - ch.getBase() > 20 * 1000){
ch.stop();
start.setEnabled(true);
}
}
});
}
}
程序中用到的SystemClock类仅仅是一个获取系统时间、运行时间的工具类,用法简单。
SystemClock官方API android.os.SystemClock
——————————————————————————————————————————————