Android学习:常用控件
学习要点:掌握文本框、编辑框、按钮、单选按钮、复选框等基本控件的用法
控件是Android应用程序中用户界面的重要组成元素,正是因为Android应用程序提供了很多具有不同功能的各种类型的控件,才使得我们的程序开发更加简单、高效。所以,熟练地掌握一些常用的基本控件和高级控件的用法,是开发Android应用程序必须具备的基本功。
诸如文本框,编辑框和按钮等具有简单功能的控件都属于基本控件。有些基本控件在之前的应用程序中已经使用过,本章将进一步介绍这些控件的其他功能和用法。
1.1、文本框与编辑框
1.文本框
TextView(文本框)是用于显示字符串的控件,对于用户来说,就是屏幕一块用于显示文本的区域。
在XML文件中添加文件框的基本语法如下:
<TextView
android:id="@id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="字符串..."/>
【说明】id是Android布局文件中控件引用的一个“标签”,其格式为 android:id=”@+id/xxx”,如其名为xxx,则在程序中以R.id.xxx的形式引用该控件。
TextView控件具有很多属性,这些属性既可以在XML文件中通过标记设置,也可以在程序中通过java代码设置
下表列出了TextView的常用属性及其对应的java方法
XML标记属性 | java方法 | 说明 |
---|---|---|
android:text | setText(CharSequence) | 设置TextView的显示内容 |
android:hint | setHint(int) | 当文本为零时显示的提示信息 |
android:autoLink | setAutoLinkMask(int) | 控制是否自动查找并转换文本为超链接,默认值为none,禁止该属性。可选值web,email,phone,map和all |
android:ems | setEms(int) | 使TextView匹配指定个数的字符宽度 |
android:height | setHeight(int) | 设置TextView的高度 |
android:width | setWidth(int) | 设置TextView的宽度 |
android:textColor | setTextColor(int) | 直接或者通过资源设置TextView的文本颜色 |
android:TextSize | setTextSize(int,float) | 设置TextView的文本大小 |
android:gravity | setGravity(int) | 当显示的文本比视图小时,指定横向和纵向的对齐方式 |
2.编辑框
EditText(编辑框)也是一种可以显示字符串的控件,它与TextView的不同之处是用户可以对EditText的内容进行编辑,并且可以通过为其设置监听器,监测用户对此控件的操作,进而做出相应响应。在XML文件中添加编辑框的基本语法如下:
<EditText
android:id="@id/editText1"
android:layout_width="wrap_parent"
android:layout_height="wrap_parent"
android:text="字符串..." />
EditText控件具有很多属性,这些属性既可以在XML文件中通过标记设置,也可以在程序中通过java代码设置。
下表中列出了EditText的常用属性及其对应的java方法。
XML属性 | java方法 | 说明 |
---|---|---|
android:lines | setLines(int) | 设置文本的行数 |
android:maxLength | setFilters(InputFilter) | 限制输入的文本长度(汉字,数字,字母计数方式相同) |
android:maxlines | setMaxLines(int) | 设置文本的最大显示行数 |
android:minLines | setMinLines(int) | 设置文本的最小行数 |
android:intputType | setInputType(int) | 设置文本的输入格式,可选值有密码格式textPassworld、邮件地址格式textEmailAddress以及数字格式和日期格式等 |
android:hint | setHint(int) | 设置Text为空时显示的文字提示信息 |
1.2、普通按钮
Button(普通按钮)是用户界面中经常用到的控件之一。Android系统中的按钮主要有Button(普通按钮)和ImageButton(图片按钮)两种控件,由于两种按钮的使用方法相近,所以只介绍普通按钮的用法。
在XML文件中添加普通按钮的基本用法如下:
<Button
android:id="@id/button1"
android:layout_width="wrap_center"
android:layout_hright="wrap_center"
android:text="字符串..."/>
在用户界面添加按钮之后,可以通过一下3中方式之一为按钮添加单击事件监听器,以实现相应事件相应和处理
1、通过重写Activity的onCreate()方法,为指定的按钮添加单击事件监听器
2、在Activity中编写一个包含View类型参数的方法,为指定的按钮添加单击事件监听器
3、创建一个继承自View.OnClickListener的Activity,由此Activity实现OnClick(View view)方法,在此方法中利用switch-case根据Button控件的id进行单击事件的对象监听识别。这种方法适合按钮比较多的单击事件处理。
具体实现代码如下:
//XML代码:
<?xml version="1.0" encoding="utf-8"?>
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="wrap_content"
android:layout_width="wrap_content">
<TableRow>
<EditText android:id="@+id/etName"
android:layout_height="80dp"
android:layout_width="82dp"
android:textSize="12dp"
android:hint="请输入账号"/>
</TableRow>
<TableRow>
<EditText android:id="@+id/etPwd"
android:layout_height="80dp"
android:layout_width="wrap_content"
android:inputType="numberPassword"
android:lines="2"
android:maxLength="8"
android:textSize="12dp"
android:hint="请输入密码"/>
</TableRow>
<TableRow>
<Button
android:layout_width="80dp"
android:id="@+id/btnOK"
android:layout_height="wrap_content"
android:layout_marginTop="3dp"
android:text="确定"/><Button
android:layout_width="80dp"
android:id="@+id/btnEsc"
android:layout_height="wrap_content"
android:layout_marginTop="3dp"
android:text="取消"/>
<!-- android:onClick="escClick"-->
</TableRow>
</TableLayout>
//main方法里面的代码:
package zut.edu.ex5;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
public class MainActivity extends AppCompatActivity {
EditText etName;
Button btnOK,btnEsc;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//事件的调用;
//这是后台代码,要读取界面的元素,需要定义变量来接收
final Button btnOK=(Button) findViewById(R.id.btnOK);
Button btnEsc=(Button) findViewById(R.id.btnEsc);
final EditText etName=(EditText)findViewById(R.id.etName);
//2.实现监听方法,需要去实现一个接口;
btnOK.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//设置编辑框内容改变
etName.setText(btnOK.getText()+"打我");
}
});
}
//第二种方法实现是把click的业务方法抽取出来定义成一个单独的方法;
public void escClick(View view){
etName.setText("挨打无效");
}
//第三种方法,当前类需要实现View.OnClickListener接口,重写onClick方法
public void onClick(View v){
Button button=(Button)v;
switch(button.getId()){
case R.id.btnOK:etName.setText("今晚吃鸡");break;
case R.id.btnEsc:etName.setText("大吉大利");break;
}
}
}
1.3、单选按钮与单选按钮组
1.单选按钮
顾名思义,RadioButton(单选按钮)的功能就是只能在众多选项之一中选择其一,同一组单选按钮中的选择具有排他性,如单选选择题通常就利用单选按钮来设计。
在XML文件中添加单选按钮的基本语法如下:
<RedioButton
android:id="@+id/redio1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:checked="true/false"
android:text="字符串..."
2.单选按钮组
RedioButton控件通常与RadioGroup(单选按钮组)控件进行联合使用,以避免同一个页面中不同组单选按钮互相干扰。
在XML文件中添加单选按钮组的基本语法:
<RedioGroup
android:id="@+id/radioGroup1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
.../>
...(多个RadioButton控件)
</RadioGroup>
可以通过以下3种方式获取单选按钮的选项
1、直接判断相应的单选按钮是否被选中;
2、通过遍历单选按钮组中的每一个单选按钮的选择状态来获取选中的选项;
3、为单选按钮添加事件监听器,当其单选按钮选择状态改变时获取选中的选项。
具体实现代码如下:
//XML代码
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:orientation="vertical"
tools:context=".MainActivity">
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="1、请选择你的职业:"
android:textColor="@android:color/black"/>
<RadioGroup
android:id="@+id/radioGroup1"
android:layout_width="match_parent"
android:layout_height="match_parent">
<RadioButton
android:id="@+id/radioButton1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:checked="true"
android:text="教师"/>
<RadioButton
android:id="@+id/radioButton2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="学生"/>
</RadioGroup>
<TextView
android:id="@+id/textView16"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="2、请选择你的爱好:"
android:textColor="@android:color/black"/>
<RadioGroup
android:id="@+id/radioGroup2"
android:layout_width="match_parent"
android:layout_height="match_parent">
<RadioButton
android:id="@+id/radioButton3"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="游泳"/>
<RadioButton
android:id="@+id/radioButton4"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="篮球"/>
<RadioButton
android:id="@+id/radioButton5"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="打游戏"/>
</RadioGroup>
<Space
android:layout_width="match_parent"
android:layout_height="20dp" />
<TextView
android:id="@+id/textView2"
android:layout_width="300dp"
android:layout_height="wrap_content"
android:lines="3"
android:text="选择结果"
android:textColor="@android:color/black"/>
<Space
android:layout_width="match_parent"
android:layout_height="20dp" />
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="确定"/>
</LinearLayout>
//java页面
package zut.edu.ex6;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
//导入所需的包
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.RadioGroup.OnCheckedChangeListener;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//获取文本框
final TextView textView2 = (TextView) findViewById(R.id.textView2);
//获取单选按钮组2
final RadioGroup myChoice=(RadioGroup) findViewById(R.id.radioGroup2);
//获取确定按钮
Button button = (Button) findViewById(R.id.button1);
//设置提交按钮的单击事件监听
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
String mySelection = ""; //选择结果
//第一种获取单选结果的方式(直接判断某个单选按钮是否被选中)
//获取单选按钮1
RadioButton radioButton1 = (RadioButton) findViewById(R.id.radioButton1);
//获取选项(判断相应的单选按钮是否被选中)
if (radioButton1.isChecked()) {
mySelection = "你的职业是(获取方式一):教师";
} else {
mySelection = "你的职业是(获取方式一):学生";
}
//第二种获取单选结果的方式(遍历单选按钮组,逐一判断单选按钮是否被选中)
//获得子控件对象
int count = myChoice.getChildCount();
for ( int i = 0;i< count ;i++){
//获取子控件对象
RadioButton r = (RadioButton) myChoice.getChildAt(i);
//判断单选按钮是否被选中
if(r.isChecked()){
mySelection += "\n你的爱好是(获取选项方式二):"+r.getText();
break;//跳出循环
}
}
//输出结果
textView2.setText(mySelection);
}
});
//设置单选按钮组2的选项改变事件监听
myChoice.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
//第三种获取单选结果的方式(监听并获取选中的单选按钮)
for(int i=0;i<myChoice.getChildCount();i++){
RadioButton r = (RadioButton) myChoice.getChildAt(i);
if(r.isChecked()){ //判断单选按钮是否被选中
textView2.setText("你的爱好是(获取选项方式三):"+r.getText());
break;//跳出for循环
}
}
}
});
}
}
1.4、复选框
顾名思义,CheckBox(复选框)的功能就是可以在总多选项之中任意选择或者不选,如多选题通常使用复选框来设计;
不同于单选按钮,对于复选框的应用,即使在同一个界面中有不止一道的多项选择题,也不会产生不同选项之间的干扰。
在XML文件中添加复选框的基本语法如下:
<CheckBox
android:id="@+id/checkBox1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:checked="true/false"
android:text="字符串..."
可以通过一下3种方式获取复选框的选项
1、直接判断相应的复选框是否被选中
2、通过遍历每个复选框的选项状态来获取选项值
3、创建一个获取复选框状态改变的事件监听器,当某个复选框的选项状态改变时获取其选项。
具体实现代码如下:
//XML页面代码
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/Layout1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:orientation="vertical"
tools:context=".MainActivity">
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="请选择你的业余爱好:"
android:textColor="@android:color/black"/>
<CheckBox
android:id="@+id/checkBox1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="看电影" />
<CheckBox
android:id="@+id/checkBox2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="打游戏" />
<CheckBox
android:id="@+id/checkBox3"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="打篮球" />
<Space
android:layout_width="match_parent"
android:layout_height="20dp" />
<TextView
android:id="@+id/textView2"
android:layout_width="300dp"
android:layout_height="wrap_content"
android:lines="3"
android:text="显示选择结果"
android:textColor="@android:color/black"/>
<Space
android:layout_width="match_parent"
android:layout_height="20dp" />
<Button
android:id="@+id/button1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="确定" />
</LinearLayout>
//MainActivity.java
package zut.edu.e7;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View.OnClickListener;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.LinearLayout;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
TextView textView2; //声明一个文本框
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//实例化布局管理器 直接从线性布局上面获取数据
final LinearLayout mLayout = (LinearLayout)findViewById(R.id.Layout1);
//获取文本框
textView2 = (TextView) findViewById(R.id.textView2);
//获取每个复选框
final CheckBox checkBox1 = (CheckBox) findViewById(R.id.checkBox1);
final CheckBox checkBox2 = (CheckBox) findViewById(R.id.checkBox2);
final CheckBox checkBox3 = (CheckBox) findViewById(R.id.checkBox3);
//为每个复选框设置状态改变监听器
checkBox1.setOnCheckedChangeListener(checkBox_listener);
checkBox2.setOnCheckedChangeListener(checkBox_listener);
checkBox3.setOnCheckedChangeListener(checkBox_listener);
Button button = (Button) findViewById(R.id.button1);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//注 经常对字符串进行修改 推荐使用可变字符串StringBuffer(线程安全的)或者StringBuilder(非线程安全的)
StringBuilder myHobby = new StringBuilder();//选择结果
/*
//获取复选结果的方式一(直接判断某个复选框是否被选中)
if (checkBox1.isChecked())
{
myHobby.append(checkBox1.getText().toString());
}
if (checkBox2.isChecked())
{
myHobby.append(checkBox2.getText().toString());
}
if (checkBox3.isChecked())
{
myHobby.append(checkBox3.getText().toString());
}
if(myHobby.length()==0){
textView2.setText("未选择爱好");
}else {
textView2.setText(myHobby);
}*/
//获取复选结果的方式二(遍历复选框,逐一判断复选框是否被选中)
//注:方式一和方式二二者只可以选择其一,在此暂时选择了第二种
myHobby.append("你的业余爱好是(获取选项方式二:)");
//获取子控件的数量
int count = mLayout.getChildCount();
for (int i=0;i<=count;i++){
//获得子控件对象
View child = mLayout.getChildAt(i);
//判断复选框是否被选中
if(child instanceof CheckBox){
//转化为CheckBox对象
CheckBox cb = (CheckBox) child;
if (cb.isChecked()){
myHobby.append(cb.getText()+" ");
}
}
}
if(myHobby.length()==0){
textView2.setText("未选择爱好");
}else {
textView2.setText(myHobby);
}
}
});
}
//创建一个获取组状态改变的监听器
private OnCheckedChangeListener checkBox_listener = new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if(isChecked){
textView2.setText("当前点选的是(获取选项方式三):\n"+buttonView.getText().toString());
}else {
textView2.setText(buttonView.getText().toString()+"选择被取消(获取方式三):");
}
}
};
}
注:checkBox1.setOnCheckedChangeListener(checkBox_listener);这个语句是第三种方式的,假如先打的话可能会报错,但是接着向下打代码可能报错就会消失。