第4章 UI设计基础
4.1界面布局及其加载
Android应用程序中,用户界面可以通过View和ViewGroup来指定,也可以采用Activity中书写Java代码的方式来设定布局,这里介绍的是采用XML布局文件的设计方法。常用的布局包括线性布局,表格布局,相对布局,框架布局和绝对布局。
4.1.1View类和ViewGroup类
在一个Android应用程序中,用户界面通过View和ViewGroup对象构建。View对象时Android平台上表示用户界面的基本单元,一个View占据屏幕上的一块方形区域,存储了该特定区域的布局参数和内容。创建用户界面所用的空间都继承自View类,包括TextView,Button,CheckBox
ViewGroup类是View的子类,它可以充当其他空间的容器。其功能是装在和管理一组View和其他的ViewGroup,可以嵌套ViewGroup和View对象,而它们共同组建的顶层View可以由应用程序中的Activity中使用setContentView()方法来显示。
4.1.2 布局管理
1.定义布局文件
ID属性
尺寸参数
xmlns:Android属性
2.在Activity中引用布局
import android.app.Activity;
import android.os.Bundle;
public class TextViewSimple_MainActivity extends Activity{
public void onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
((TextView)findViewById(R.id.tvHello)).setText("Hello,Activity!");
//将字符串Hello,Activity!"显示在ID号位tvHello的TextView控件中
}
4.1.3 线性布局
线性布局定义在<LinearLayout</LinearLayout标签之间,它将其包含的Widget控件元素按水平,或者垂直的方向顺序排列。android:orientation=“vertical”
android:gravity="right"设置 控件的对齐方式
<?xml version="1.0" encoding="utf-8"?>
<!-- 声明一个LinearLayout 布局,并设置其属性:垂直排列 -->
<!--该线性布局在其所属的父容器中的布局方式为横向和纵向填充父容器-->
<!-- 该线性布局内部元素的布置方式为向右对齐-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="right" >
<!-- 声明一个TextView控件,其ID:txtMessage,控件占据的空间为恰好包住文字,显示文本:线性布局示例-->
<TextView
android:id="@+id/txtMessage"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="线性布局示例 "
/>
<!-- 声明三个 Button 控件-->
<Button
android:id="@+id/btnYes"
android:text="是"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<Button
android:id="@+id/btnNo"
android:text="否"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<Button
android:id="@+id/btnCancel"
android:text="取消"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
</LinearLayout>
MainActivity.java
package com.example.hello;
import android.app.Activity;
import android.os.Bundle;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
运行结果
4.1.4 表格布局
<?xml version="1.0" encoding="utf-8"?>
<!-- 声明一个 垂直排列的线性布局,里面有两个table -->
<LinearLayout
android:id="@+id/LinearLayout01"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" >
<!-- 声明第一个表格布局,ID:TableLayout01,里面有两个table -->
<TableLayout
android:id="@+id/TableLayout01"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="#dddddd" >
<!-- 声明第一行只有一个TextView-->
<TextView
android:id="@+id/TextView01"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="第一个Table的第一行,TextView控件独占"
android:textColor="#000000"
android:layout_marginTop="4dip" />
<!-- 声明第二行,TableRow 包括两列-->
<TableRow
android:id="@+id/TableRow01"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="4dip" >
<TextView
android:text="短字符串"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:textColor="#0000ff" />
<TextView
android:text="第2行第2列"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:textColor="#000000" />
</TableRow>
<!-- 声明了第三行, TableRow,ID为 TableRow02-->
<TableRow android:id="@+id/TableRow02"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="4dip" >
<TextView
android:text="长。。。。。。字符串"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#ff0000" />
<TextView
android:text="第3行第2列"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#000000" />
<TextView
android:text="第3行第3列"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#000000" />
</TableRow>
</TableLayout>
<!-- 声明第二个表格布局,ID:TableLayout02,里面有6个按钮 -->
<TableLayout
android:id="@+id/TableLayout01"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:shrinkColumns="0,1,2"
android:collapseColumns="2" >
<!--android:shrinkColumns作用是设置表格的列是否收缩(列编号从0开始),多列用逗号隔开,此例android:shrinkColumns="0,1,2",即表格的第1、2、3列内容是收缩的以适合屏幕大小即不会挤出屏幕-->
<!--android:collapseColumns作用是设置表格的列是否隐藏(从0起算序数),所以第三列的按钮没有显示出来-->
<!-- 第一行定义为居中显示,第一行定义为居左显示 -->
<TableRow android:gravity="center" >
<Button android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="按钮1-1"/>
<Button android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="按钮1-2" />
<Button android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="按钮1-3"/>
</TableRow><!-- 第一行设置三个按钮 -->
<TableRow android:gravity = "left" >
<Button android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="按钮2-1" />
<Button android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="按钮2-2" />
<Button android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="按钮2-3" />
</TableRow>
</TableLayout>
</LinearLayout>
运行结果:
4.1.5 相对布局
相对布局定义在RelativeLayout /RelativeLayout之间
在相对布局中,子控件的位置是相对兄弟控件或父容器而决定的。
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<!-- 声明了一个TextView控件-->
<TextView
android:id="@+id/txtMessage"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="相对布局示例"
/>
<!-- 声明了三个 Button 控件-->
<!-- ID为btnYes的按钮,位于ID为txtMessage的组件下面 -->
<!--该控件位于父控件的中央位置。-->
<Button
android:id="@+id/btnYes"
android:text="是"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/txtMessage"
android:layout_centerInParent="true"
/>
<!-- ID为btnNo的按钮,位于ID为btnYes的组件下面,给定距左的边界 -->
<Button
android:id="@+id/btnNo"
android:text="否"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/btnYes"
android:layout_marginLeft="12dip"
/>
<!-- ID为btnCancel的按钮,此按钮位于ID为btnYes的右边,和ID为btnYes的底边齐平-->
<Button
android:id="@+id/btnCancel"
android:text="取消"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@id/btnYes"
android:layout_alignBottom = "@id/btnYes"
/>
</RelativeLayout>
运行结果:
4.1.6 绝对布局
绝对布局在“AbsoluteLayout /AbsoluteLayout”之间
绝对布局方式是指屏幕中所有的控件位置由开发人员通过设置控件的
坐标来指定。控件容器不在负责管理其子控件的位置。系统无法根据
不同屏幕大小对元素位置进行调整,降低了布局对不同类型和尺寸
屏幕的适应能力。
<?xml version="1.0" encoding="utf-8"?>
<AbsoluteLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<!-- 声明一个绝对布局 -->
<!-- 设置绝对布局中子控件坐标-->
<TextView
android:layout_x="20dip"
android:layout_y="20dip"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:id="@+id/TextView01"
android:text="绝对布局示例" />
<TextView
android:layout_x="40dip"
android:layout_y="40dip"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:id="@+id/TextView02"
android:text="控件:TextView02" />
<EditText
android:layout_x="60dip"
android:layout_y="60dip"
android:layout_height="90dip"
android:layout_width="180dip"
android:id="@+id/EditText01"
android:text="控件:EditText01" />
<Button
android:layout_x="200dip"
android:layout_y="160dip"
android:layout_height="wrap_content"
android:id="@+id/Button01"
android:layout_width="wrap_content"
android:text="OK" />
</AbsoluteLayout>
运行结果:
4.1.7 框架布局
框架布局定义在<FrameLayout</FrameLayout之间
FrameLayout布局在屏幕上开辟出一块区域,在这块
区域中可以添加多个子控件,但是所有的子空间都被
对齐到区域的左上角。框架布局的大小由子控件中尺寸
最大的那个子控件来决定。如果子空间一样大,同一时刻
只能看到最上面的子控件。
框架布局使多个组件以层叠的效果呈现给用户,应用程序的布局
采用框架布局时,控件元素的位置只能放置在显示空间的左上角而
无法指定到一个确切的位置。如果有多个元素,后放置的元素将遮挡先
放置的元素。
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<TextView
android:text="较大的文字"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="26pt"
android:textColor = "#dddddd"/>
<TextView
android:text="中等的文字"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="18pt"
android:textColor = "#aaaaaa"/>
<TextView
android:text="较小的文字"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="10pt"
android:textColor = "#000000"/>
</FrameLayout>
运行结果:
4.2 Widget控件
4.2.1TextView和EditText
<?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"
>
<TextView
android:id="@+id/tv_hello"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="TextView 示例,在XML中设置了属性"
android:textColor="#ff00ff"
android:textStyle ="italic"
android:background="#cccccc"
android:textSize="20sp"
android:gravity="center_horizontal"
/>
<TextView
android:id="@+id/tv_message"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="\n请在下面的文本框中输入文字:" />
<EditText
android:id="@+id/txt_input"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="18sp"
android:text=""
android:hint = "单击输入文字"/>
<TextView
android:id="@+id/tv_txtout"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="\n您没有在文本框中输入文字:" />
</LinearLayout>
MainActivity.java
import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnKeyListener;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.TextView.OnEditorActionListener;
import android.widget.Toast;
public class MainActivity extends Activity {
TextView TxtOut;
EditText TxtIn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TxtOut = (TextView) findViewById(R.id.tv_txtout);
TxtIn = (EditText) findViewById(R.id.txt_input);
TxtIn.setOnKeyListener(new OnKeyListener(){
@Override
public boolean onKey(View arg0, int arg1, KeyEvent arg2) {
String str=TxtIn.getText().toString();
//在Java代码中设置TextView的属性,EditText与此类似
TxtOut.setTextColor(Color.BLUE);
TxtOut.setTextSize(25);
TxtOut.setText("\n您输入的是:"+str);
return false;
}
});
TxtIn.setOnEditorActionListener(
new OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView arg0, int arg1,KeyEvent arg2) {
Toast.makeText(MainActivity.this, "输入文字", Toast.LENGTH_SHORT).show();
String str=TxtIn.getText().toString();
TxtOut.setText(str);
return false;
}
});
}
}
运行结果:
4.2.2 Button
<?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"
>
<TextView
android:id="@+id/tv_button"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="显示两个按钮"
/>
<Button android:id="@+id/btn_normal"
android:text="普通按钮"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<Button android:id="@+id/btn_small"
style="?android:attr/buttonStyleSmall"
android:text="小小按钮"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
MainActivity.java
import android.app.Activity;
import android.os.Bundle;
import android.widget.Button;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button normal = (Button) findViewById(R.id.btn_normal);
//找到ID号为btn_normal的按钮
Button small = (Button) findViewById(R.id.btn_small);
//找到ID号为btn_small的按钮
}
}
运行结果:
4.2.3 CheckBox
<?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"
>
<TextView
android:id="@+id/favouriteLabel"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="请勾选您的感兴趣的图书类别" />
<CheckBox
android:id="@+id/cbox_classical"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:checked ="true"
android:text="古典文学" />
<CheckBox
android:id="@+id/cbox_novel"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="当代小说" />
<CheckBox
android:id="@+id/cbox_essays"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="散文随笔" />
<CheckBox
android:id="@+id/cbox_poetry "
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="诗歌" />
</LinearLayout>
MainActivity.java
import android.app.Activity;
import android.os.Bundle;
import android.widget.CheckBox;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
CheckBox my_essays = (CheckBox) findViewById(R.id.cbox_essays);
//使my1指向id号为cbox_essays的CheckBox
my_essays.setChecked(true); //设置为为选中状态
}
}
运行结果:
4.2.4 RadioGroup和RadioButton
<?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"
>
<TextView
android:id="@+id/favourite_single"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="请选择一个您感兴趣的图书类别" />
<RadioGroup
android:id="@+id/gender"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
<RadioButton
android:id="@+id/rbt_classical"
android:checked="true"
android:text="古典文学" />
<RadioButton
android:id="@+id/rbt_novel"
android:text="当代小说" />
<RadioButton
android:id="@+id/rbt_essays"
android:text="散文随笔" />
<RadioButton
android:id="@+id/rbt_poetry "
android:text="诗歌" />
</RadioGroup>
</LinearLayout>
运行结果:
4.3 Android中的事件处理机制
(1)事件:表示用户咋图形界面的操作的描述,通常是封装成各种类,
例如键盘事件操作相关的类KeyEvent,触摸屏相关移动事件类为MotionEvent
(2)事件源:事件源是指发生事件的控件,例如Button、EditTxt
(3)事件处理者:接收事件并对事件进行处理的对象,事件处理者
一般是一个实现某些特定接口类的对象
4.3.1基于监听接口的事件处理
1.直接实现接口的处理方式
import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity extends Activity implements OnClickListener {
//定义TestActivity类时实现OnClickListener接口
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button mybutton = (Button) findViewById(R.id.btn_normal);// 定义Button按钮
mybutton.setOnClickListener(this);
// 为事件源对象添加Click事件的监听,将事件处理绑定到事件源
}
@Override
public void onClick(View v) {
//监听器定义的事件处理方法,只需将事件处理代码在此方法中复写即可
//参数v就是事件发生的事件源
switch (v.getId()) {
case R.id.btn_normal:
TextView mytext = (TextView) findViewById(R.id.tv_button);
mytext.setTextColor(Color.BLUE);
mytext.setTextSize(20);
mytext.setText("你好,【普通按钮】被单击!");
break;
}
}
}
运行结果:
2.内部类处理方式
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity extends Activity {
//不需要在定义TestActivity类时实现OnClickListener接口
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button mybutton = (Button) findViewById(R.id.btn_normal);
mybutton.setOnClickListener(new MyClickListener());
// 为事件源对象添加Click事件的监听,将事件处理绑定到事件源
// 参数是一个内部类MyClickListener的对象,这个类实现OnClickListener接口
}
// 定义内部类MyClickListener,实现OnClickListener接口
class MyClickListener implements OnClickListener {
@Override
public void onClick(View v) { //事件处理代码同样在此方法中复写
switch (v.getId()) {
case R.id.btn_normal:
TextView mytext = (TextView)findViewById(R.id.tv_button);
mytext.setText("你好,【普通按钮】被单击!");
break;
}
}
}
}
3.匿名内部类处理方式
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button mybutton = (Button) findViewById(R.id.btn_normal);
final TextView mytext = (TextView) findViewById(R.id.tv_button);
mybutton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) { //参数v就是事件发生的事件源
switch (v.getId()) {
case R.id.btn_normal:
mytext.setText("你好,【普通按钮】被单击!");
break;
}
}
});
}
}
4.3.2基于回调机制的事件处理
1.onKeyDown()方法
import android.app.Activity;
import android.os.Bundle;
import android.text.format.Time;
import android.view.KeyEvent;
import android.widget.TextView;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public boolean onKeyDown (int keyCode, KeyEvent event) {
Time t=new Time();
t.setToNow(); //得到当前时间
TextView mytext = (TextView) findViewById(R.id.tv_message);
mytext.setTextSize(15); //设置文字大小
mytext.setText("当前时间是: "+t.toString() + "\n键盘码: "+keyCode);
return super.onKeyDown(keyCode, event);
}
}
2.onTouchEvent()方法
import android.app.Activity;
import android.os.Bundle;
import android.view.MotionEvent;
import android.widget.TextView;
public class MainActivity extends Activity {
TextView TxtAction,TxtPostion ;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TxtAction = (TextView) findViewById(R.id.tv_action);
TxtPostion= (TextView) findViewById(R.id.tv_postion);
}
@Override
public boolean onTouchEvent(MotionEvent event)
{
int Action=event.getAction();
float x=event.getX();
float y=event.getY();
TxtAction.setText("触屏动作:"+Action);
TxtPostion.setText("当前坐标:"+"("+x+" , "+y+")");
return true;
}
}
4.3.3 直接绑定标签的事件处理方法
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void buttonClick(View v){
//Toast.makeText(MainActivity.this,"按钮被单击!",Toast.LENGTH_SHORT).show();
switch (v.getId()) {
case R.id.btn_normal:
TextView mytext = (TextView) findViewById(R.id.tv_button);
mytext.setText("你好,【普通按钮】被单击!");
break;
}
}
}
4.3.4 EditText、CheckBox、和RadioButton的常见事件处理
<?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"
>
<TextView
android:id="@+id/tv_message"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="请在下面的文本框中输入文字:"
/>
<EditText
android:id="@+id/txt_input"
android:layout_width="200dip"
android:layout_height="wrap_content"
android:textSize="18sp"
android:text="" />
<TextView
android:id="@+id/favourite_single"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="请选择您的学历:" />
<RadioGroup
android:id="@+id/ rg_education"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<RadioButton
android:id="@+id/rbt_bachelor"
android:layout_width="wrap_content"
android:text="大学本科"
android:checked="true"/>
<RadioButton
android:id="@+id/rbt_master"
android:layout_width="wrap_content"
android:text="硕士研究生" />
<RadioButton
android:id="@+id/rbt_doctor"
android:layout_width="wrap_content"
android:text="博士研究生" />
</RadioGroup>
<TextView
android:id="@+id/favouriteLabel"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="请勾选您感兴趣的图书类别:" />
<CheckBox
android:id="@+id/cbox_classical"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="古典文学" />
<CheckBox
android:id="@+id/cbox_novel"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="当代小说" />
<CheckBox
android:id="@+id/cbox_essays"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="散文随笔" />
<CheckBox
android:id="@+id/cbox_poetry "
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="诗歌" />
<TextView
android:id="@+id/tv_result"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textColor="#0000ff"
android:text="\n您还没有输入任何文字,\n您的学历是:大学本科,\n您感兴趣的图书类别:无"
/>
</LinearLayout>
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnKeyListener;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.EditText;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.RadioGroup.OnCheckedChangeListener;
import android.widget.TextView;
import android.view.KeyEvent;
public class MainActivity extends Activity {
private String myresults1="\n您还没有输入任何文字,",
myresults2="\n您的学历是:大学本科,",
myresults3="\n您感兴趣的图书类别:无";
TextView tvResult;
EditText txtInput;
RadioButton rb1,rb2,rb3;
RadioGroup rg;
CheckBox cbox1,cbox2,cbox3,cbox4;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tvResult = (TextView) findViewById(R.id.tv_result);
txtInput= (EditText) findViewById(R.id.txt_input);
rb1 = (RadioButton) findViewById(R.id.rbt_bachelor);//通过ID找到RadioButton
rb2 = (RadioButton) findViewById(R.id.rbt_master);
rb3 = (RadioButton) findViewById(R.id.rbt_doctor);
rg = (RadioGroup) findViewById(R.id.rg_education);
//对EditText进行监听
txtInput.setOnKeyListener(new OnKeyListener(){
@Override
public boolean onKey(View arg0, int arg1, KeyEvent arg2) {
String str=txtInput.getText().toString();
myresults1="\n您输入的是:"+str;
tvResult.setText(myresults1+ myresults2+ myresults3);
return false;
}
});
//对RadioGroup进行监听
rg.setOnCheckedChangeListener(new OnCheckedChangeListener() {
public void onCheckedChanged(RadioGroup group, int checkedId) {
if(R.id. rbt_bachelor == checkedId){
myresults2="\n您的学历是:" + rb1.getText().toString();
}
else if(R.id. rbt_master == checkedId){
myresults2="\n您的学历是:" + rb2.getText().toString();
}
else if(R.id. rbt_doctor == checkedId){
myresults2="\n您的学历是:" + rb3.getText().toString();
}
tvResult.setText(myresults1+ myresults2+ myresults3);
}
});
cbox1 = (CheckBox) findViewById(R.id.cbox_classical);//通过ID找到CheckBox
cbox2 = (CheckBox) findViewById(R.id.cbox_novel);
cbox3 = (CheckBox) findViewById(R.id.cbox_essays);
cbox4 = (CheckBox) findViewById(R.id.cbox_poetry);
cbox1.setOnCheckedChangeListener(cBoxListener);
cbox2 .setOnCheckedChangeListener(cBoxListener);
cbox3 .setOnCheckedChangeListener(cBoxListener);
cbox4 .setOnCheckedChangeListener(cBoxListener);
}
private android.widget.CompoundButton.OnCheckedChangeListener cBoxListener =
new android.widget.CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton arg0, boolean arg1) {
myresults3="\n您感兴趣的图书类别:";
if (cbox1.isChecked()) {
myresults3 = myresults3+" "+cbox1.getText().toString() ;
}
if (cbox2.isChecked()) {
myresults3 = myresults3+" "+cbox2.getText().toString() ;
}
if (cbox3.isChecked()) {
myresults3 = myresults3+" "+cbox3.getText().toString() ;
}
if (cbox4.isChecked()) {
myresults3 = myresults3+" "+cbox4.getText().toString() ;
}
tvResult.setText(myresults1+ myresults2+ myresults3);
}
};
}
运行结果: