目录
- 1、控制UI界面
- 1.1、使用xml布局文件控制UI界面
- 1.2、在代码中控制UI界面
- 1.3、xml布局文件和代码混合控制UI界面
- 1.4、开发自定义的View
- 2、布局管理器
- 2.1、线性布局
- 2.1.1、android:orientation
- 2.1.2、android:gravity
- 2.1.3、android:layout_width
- 2.1.4、android:layout_height
- 2.1.5、android:id
- 2.1.6、android:background
- 2.2、表格布局
- 2.3、帧布局
- 2.4、相对布局
- 3、范例
- 4、基本组件
- 4.1、文本框TextView
- 4.2、文本编辑框EditView
- 4.3、按钮Button
- 4.3.1、普通按钮
- 4.3.2、图片按钮
- 4.4、单选按钮复选框
- 4.4.1、单选按钮
- 4.4.2、复选框
- 4.5、图像ImageView
- 4.6、列表选择框
- 4.7、列表视图
- 4.8、日期时间拾取器
- 4.9、计时器
- 5、范例
1、控制UI界面
安卓提供了四种控制UI界面的方法
1.1、使用xml布局文件控制UI界面
使用xml布局文件控制UI界面主要分为以下两个步骤:
- 在android应用的res/layout目录下编写xml布局文件。创建后,R.java会自动收录该布局文件资源。
- 在Acitity中使用以下Java代码显示xml布局文件内容
setContentView(R.layout.main);
其中main是布局文件的文件名
例1.创建Adroid项目,使用xml布局文件实现开始界面
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout 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="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/title"
style="@style/text"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/startButton"
android:layout_gravity="center_vertical|center_horizontal"
style="@style/text"
android:text="@string/start"/>
</FrameLayout>
style属性可以设置样式
android:layout_gravity="center_vertical|center_horizontal"可以设置组件在帧布局中居中显示
在res/values目录下的string.xml文件中添加一个定义一个开始按钮的常量
<resources>
<string name="title">使用布局文件控制UI界面</string>
<string name="start">单击进入android...</string>
</resources>
为了改变窗体中文字的大小,需要为TextView组件添加syle属性,用于指定应用的样式。具体的样式需要在res\values目录中创建的样式文件中指定。在本实例中,创建一个名称为styles.xml的样式文件,并在该文件中创建一个名称为text的样式,用于指定文字的大小和颜色。styles..xml文件的具体代码如下:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="text">
<item name="android:textSize">24px</item>
<item name="android:textColor">#111111</item>
</style>
</resources>
在主活动中,用以下内容应用布局文件
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
1.2、在代码中控制UI界面
在代码中控制UI界面可以分为以下3个关键步骤。
- 创建布局管理器,可以是帧布局管理器、表格布局管理器、线性布局管理器和相对布局管理器等,并且设
置布局管理器的属性。例如,为布局管理器设置背景图片等。 - 创建具体的组件,可以是TextView、Image View、EditText和Button等任何Android提供的组件,并且
设置组件的布局和各种属性。 - 将创建的具体组件添加到布局管理器中。
package com.example.myapplication;
import ...
public class MainActivity extends AppCompatActivity {
public TextView textView1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//添加帧布局管理器
FrameLayout frameLayout = new FrameLayout(this);
frameLayout.setBackground(this.getResources().getDrawable(R.drawable.abc_vector_test));
setContentView(frameLayout);
//添加TextView组件
TextView textView = new TextView(this);
textView.setText("在代码中控制UI界面");
textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, 24);
textView.setTextColor(Color.rgb(1, 1, 1));
frameLayout.addView(textView);
//实例化组件textView1
textView1 = new TextView(this);
textView1.setText("点击进入android...");
textView1.setTextSize(TypedValue.COMPLEX_UNIT_PX, 24);
textView1.setTextColor(Color.rgb(1, 1, 1));
//设置保存布局参数的对象
FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(
ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.WRAP_CONTENT);
layoutParams.gravity = Gravity.CENTER_HORIZONTAL | Gravity.CENTER_VERTICAL; //设置居中显示
textView1.setLayoutParams(layoutParams);
//为textView1组件设置点击监听事件
textView1.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View view) {
new AlertDialog.Builder(MainActivity.this).setTitle("系统提示")
.setMessage("Android是一个丰富多彩智能的世界,确定要进入吗?")
.setPositiveButton("确定",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
Log.i("Android", "进入");
}
}).setNegativeButton("退出",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
Log.i("Android", "退出");
finish();
}
}).show();
}
});
frameLayout.addView(textView1);
}
}
说明:完全通过代码控制UI界面虽然比较灵活,但是其开发过程比较烦琐,而且不利于高层次的解耦,因此不推荐采用这种方式控制UI界面。
1.3、xml布局文件和代码混合控制UI界面
使用XML和Jva代码混合控制UI界面,习惯上把变化小、行为比较固定的组件放在XML布局文件中,把变化较多、行为控制比较复杂的组件交给Java代码来管理。下面通过一个具体的实例来演示如何使用XML和Java代码混合控制UI界面。
例l,3创建Android项目,通过XML和Java代码在窗体中横向并列显示4张图片。
(I)修改新建项目的res\layout目录下的布局文件main.xml,将默认创建的组件删除,然后将默认创建的线性布局的orientation属性值设置为horizontal(水平),并且为该线性布局设置背景以及id属性。修改后的代
码如下
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
</LinearLayout>
(2)在MainActivity中,声明img和imagePath两个成员变量,其中,img是一个ImageView类型的一维数组用于保存mageView组件;imagePath是一个int型的一维数组,用于保存要访问的图片资源。关键代码如下:
package com.example.myapplication;
import androidx.appcompat.app.AppCompatActivity;
import ...
public class MainActivity extends AppCompatActivity {
private ImageView[] imageViews = new ImageView[12];
private int[] imagePath = new int[]{
R.drawable.imge01, R.drawable.imag02, R.drawable.imag03};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
LinearLayout layout = (LinearLayout) findViewById(R.id.la);
for (int i = 0; i < imagePath.length; i++) {
imageViews[i] = new ImageView(this);
imageViews[i].setImageResource(imagePath[i]);
imageViews[i].setPadding(5, 5, 5, 5);
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(253, 148);
imageViews[i].setLayoutParams(params);
layout.addView(imageViews[i]);
}
}
}
1.4、开发自定义的View
在Android中,所有的UI界面都是由View类和ViewGroup类及其子类组合而成的。其中,View类是所有UI组件的基类,而ViewGroup类是容纳这些UI组件的容器,其本身也是View类的子类。在ViewGroup类中,除了可以包含普通的View类外,还可以再次包含ViewGroup类。
开发自定义的View组件大致分为以下3个步骤:
- 创建一个继承android.view.View类的View类,并且重写构造方法。
- 根据需要重写相应的方法。
- 在项目的活动中,创建并实例化自定义Viw类,并将其添加到布局管理器中。
下面通过一个具体的实例来演示如何开发自定义的View类。
自定义View组件实现跟随手指移动的图片
创建活动,在布局文件中添加帧布局
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/myframe"
android:background="@drawable/background01">
</FrameLayout>
创建Java文件,继承自View,重写其构造方法
package com.example.rabbitproject;
import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.view.View;
public class RabbitView extends View {
//用来记录图片的坐标
float x;
float y;
public RabbitView(Context context) {
super(context);
//为坐标添加初始值
x = 400;
y = 400;
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
Paint paint = new Paint();
Bitmap bitmap = BitmapFactory.decodeResource(this.getResources(), R.drawable.imag01);//根据图片生产位图对象
canvas.drawBitmap(bitmap, x, y, paint);//绘制图片
if (bitmap.isRecycled()){//判断是否回收,若没有回收则强制回收
bitmap.recycle();
}
}
}
创建并实例化自定义的组件,添加到布局中
package com.example.rabbitproject;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.widget.FrameLayout;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
FrameLayout frameLayout = (FrameLayout) findViewById(R.id.myframe);
RabbitView rabbitView = new RabbitView(this);
rabbitView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
rabbitView.x = motionEvent.getX();
rabbitView.y = motionEvent.getY();
rabbitView.invalidate();
return true;
}
});
frameLayout.addView(rabbitView);
}
}
2、布局管理器
Android中提供了线性布局管理器(LinearLayout)、表格布局管理器(TableLayout)、帧布局管理器(FrameLayout)、相对布局管理器(RelativeLayout)和绝对布局管理器(AbsoluteLayout),对应于这S种布局管理器,Android提供了S种布局方式,其中,绝对布局在Android2.0中被标记为已过期,可以使用帧布局或相对布局替代
2.1、线性布局
线性布局是将放入其中的组件按照垂直或水平方向来布局,也就是控制放入其中的组件横向或纵向排列。在线性
布局中,每一行(针对垂直排列)或每一列(针对水平排列)中只能放一个组件,并且Android的线性布局不会换行,当组件排列到窗体的边缘后,后面的组件将不会被显示出来
说明:在线性布局中,排列方式由android:orientation属性来控制,对齐方式由android:gravity属性来控制。
在Android中,可以在XML布局文件中定义线性布局管理器,也可以使用Java代码来创建(推荐使用前者)
在XML布局文件中定义线性布局管理器时,需要使用标记,其基本的语法格式如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
android:gravity="center_horizontal"
android:id="@+id/linearLout"
android:background="@color/white">
</LinearLayout>
在线性布局管理器中,常用的属性包括android:orientation、android:gravity、android:layout width、
android:layout height、.android:id和android:background。其中,前两个属性是线性布局管理器支持的属性,后面4个是android.view.View和android.view.ViewGroup支持的属性,下面进行详细介绍。
2.1.1、android:orientation
android:orientation属性用于设置布局管理器内组件的排列方式,其可选值为horizontal和vertical,默认值为vertical。其中,horizontal表示水平排列;vertical表示垂直排列。
2.1.2、android:gravity
android:gravity属性用于设置布局管理器内组件的对齐方式,其可选值包括top、bottom、left、right、center vertical、fill_vertical、center_horizontal、fill horizontal、center、fill、clip vertical和clip_horizontal。这些属性值也可以同时指定,各属性值之间用竖线隔开。例如,要指定组件靠右下角对齐,可以使用属性值right bottom。
2.1.3、android:layout_width
android:layout_width属性用于设置组件的基本宽度,其可选值包括fill parent、match_parent和wrap_content。其中,fill_parent表示该组件的宽度与父容器的宽度相同;match_paren与fill parent的作用完全相同,从Android2.2开始推荐使用;wrap content:表示该组件的宽度恰好能包裹它的内容。
2.1.4、android:layout_height
android:layout_height属性用于设置组件的基本高度,其可选值包括fill parent、match_parent和wrap_content。其中,fill parent表示该组件的高度与父容器的高度相同;match paren与fill parent的作用完全相同,从Android2.2开始推荐使用;wrap content表示该组件的高度恰好能包裹它的内容。
2.1.5、android:id
android:id属性用于为当前组件指定一个id属性,在Java代码中可以应用该属性单独引用这个组件。为组件指定id属性后,在R.java文件中,会自动派生一个对应的属性,在Java代码中,可以通过findViewByldO)方法来获取它。
2.1.6、android:background
android:background属性用于为组件设置背景,可以是背景图片,也可以是背景颜色。用下以的代码进行设置:
android:background="@drawable/background"
如果想指定背景颜色,可以使用颜色值。例如,要想指定背景颜色为白色,可以使用下面的代码:
android:background="#FFFFFFFF"
2.2、表格布局
表格布局与常见的表格类似,以行、列的形式来管理放入其中的UI组件。表格布局使用标记定义,在表格布局中,可以添加多个标记,每个标记占用一行。由于标记也是容器,所以还可在该标记中添加其他组件,每添加一个组件,表格就会增加一列。在表格布局中,列可以被隐藏,也可以被设置为伸展的,从而填充可利用的屏幕空间,还可以设置为强制收缩,直到表格匹配屏幕大小。
TableLayout继承了LinearLayout,因此它完全支持LinearLayout支持的全部XML属性,此外,TableLayout
还支持如图所示的XML属性。
属性 | 描述 |
Android:collapseColumns | 设置需要被隐藏的列的列序号(序号从0开始),多个列序号之间用逗号“,”分割 |
android:shrinkColumns | 设置允许被收缩的列的列序号 |
android:strethColumn | 设置允许被拉伸的列序号 |
实现用户登录界面:
<?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="match_parent"
android:id="@+id/tableLyout1"
android:gravity="center_vertical"
android:stretchColumns="0,3">
<!--第一行-->
<TableRow
android:id="@+id/tableRow1"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<TextView/>
<TextView
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:id="@+id/textView1"
android:text="用户名:"
android:textSize="24px"/>
<EditText
android:id="@+id/editText1"
android:textSize="24px"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:minWidth="200px"/>
<TextView/>
</TableRow>
<!--第二行-->
<TableRow
android:id="@+id/tableRow2"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<TextView/>
<TextView
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:id="@+id/textView2"
android:text="密 码:"
android:textSize="24px"/>
<EditText
android:id="@+id/editText2"
android:textSize="24px"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:minWidth="200px"/>
<TextView/>
</TableRow>
<!--第三行-->
<TableRow
android:id="@+id/tableRow3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<TextView/>
<Button
android:text="登录"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<Button
android:text="注册"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</TableLayout>
说明:在本实例中,添加了6个TextView组件,并且设置对应列允许拉伸,这是为了让用户登录表单在水平方向上居中显示而设置的。
2.3、帧布局
在帧布局管理器中,每加入一个组件,都将创建一个空白的区域,通常称为一帧,这些帧都会根据gravity属性执行自动对齐。默认情况下,帧布局从屏幕的左上角(0,0)坐标点开始布局,多个组件层叠排序,后面的组件覆盖前面的组件。
显示叠层的正方形
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/frameLayout1"
android:foreground="@android:color/black"
android:foregroundGravity="bottom|right">
<!--添加居中显示的红色背景的TextView,将显示在最下层-->
<TextView
android:text="红色背景的TextView"
android:layout_width="400px"
android:layout_height="400px"
android:layout_gravity="center"
android:background="#FFFF0000"
android:id="@+id/textView1"/>
<!--添加居中显示的橙色背景的TextView,将显示在中间层-->
<TextView
android:text="橙色背景的TextView"
android:layout_width="300px"
android:layout_height="300px"
android:id="@+id/textView2"
android:background="#FFFF6600"
android:layout_gravity="center"/>
<!--添加居中显示的黄色背景的TextView,将显示在最上层-->
<TextView
android:text="黄色背景的TextView"
android:layout_width="200px"
android:layout_height="200px"
android:id="@+id/textView3"
android:background="#FFFFEE00"
android:layout_gravity="center"/>
</FrameLayout>
2.4、相对布局
相对布局是指按照组件之间的相对位置来进行布局,如某个组件在另一个组件的左边、右边、上方或下方等。在Android中,可以在XML布局文件中定义相对布局管理器,也可以使用Java代码来创建。推荐使用前者。在XML布局文件中定义相对布局管理器可以使用标记,其基本的语法格式如下:
在相对布局管理器中,只有上面介绍的两个属性是不够的,为了更好地控制该布局管理器中各子组件的布局分布RelativeLayout提供了一个内部类RelativeLayout..LayoutParams,通过该类提供的大量XML属性,可以很好地控制相对布局管理器中各组件的分布方式。
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/relativeLayout1">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="发现有widget的新版本,要现在就更新吗?"
android:id="@+id/textView1"
android:textSize="55px"
android:layout_centerHorizontal="true"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="现在更新"
android:id="@+id/button1"
android:layout_below="@id/textView1"
android:layout_toLeftOf="@id/button2"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/button2"
android:layout_below="@id/textView1"
android:layout_alignRight="@id/textView1"
android:text="以后再说"/>
</RelativeLayout>
3、范例
范例1:使用表格布局与线性布局实现分类工具栏
<?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="match_parent"
android:id="@+id/tableLayout1"
android:padding="10px">
<TableRow
android:id="@+id/tableRow1"
android:layout_width="match_parent"
android:layout_weight="1">
<LinearLayout
android:id="@+id/linearLayout1"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:background="#edff1249"
android:layout_weight="1"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:id="@+id/text1"
android:text="框1"
android:textSize="150px"
android:gravity="center"/>
</LinearLayout>
<LinearLayout
android:id="@+id/linearLayout2"
android:layout_width="wrap_content"
android:background="#ffff1877"
android:layout_height="match_parent"
android:layout_weight="1"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:id="@+id/text2"
android:text="框2"
android:textSize="150px"
android:gravity="center"/>
</LinearLayout>
</TableRow>
<TableRow
android:id="@+id/tableRow2"
android:layout_width="match_parent"
android:layout_weight="1">
<LinearLayout
android:id="@+id/linearLayout3"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/purple_500"/>
</LinearLayout>
<LinearLayout
android:id="@+id/linearLayout4"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/black"
/>
</LinearLayout>
<LinearLayout
android:id="@+id/linearLayout5"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#ffff0000"/>
</LinearLayout>
</TableRow>
<TableRow
android:id="@+id/tableRow3"
android:background="#FFFFEE00"
android:layout_width="match_parent"
android:layout_weight="1">
<LinearLayout
android:layout_weight="1"
android:layout_height="match_parent"
android:background="@color/black"/>
<LinearLayout
android:layout_weight="1"
android:layout_height="match_parent"
android:background="@color/material_on_background_emphasis_medium"/>
</TableRow>
</TableLayout>
4、基本组件
4.1、文本框TextView
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
android:autoLink="email"
android:textSize="50pt"/>
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="209dp"
android:background="@drawable/mmexport1647693561983"
android:text="带图片的TextView" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/textView2"
android:text="多行文本:从前有一个老人,他给我们带了很多苹果"
android:textSize="20px"
android:width="300px"
android:textColor="#0f0"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/textView3"
android:text="单行文本:从前有一个老人,他给我们带了很多苹果"
android:textSize="20px"
android:width="300px"
android:textColor="#f00"
android:singleLine="true"/>
</LinearLayout>
4.2、文本编辑框EditView
在Android中,编辑框使用EditText表示,用于在屏幕上显示文本输入框,这与Java中的文本框组件功能类似。需要说明的是,Android中的编辑框组件可以输入单行文本,也可以输入多行文本,还可以输入指定格式的文本(如密码、电话号码、E-mail地址等)。
在Android中,可以使用两种方法向屏幕中添加编辑框:一种是通过在XML布局文件中使用标记添加;另一种是在Java文件中,通过new关键字创建。
在屏幕中添加编辑框后,还需要获取编辑框中输入的内容,这可以通过编辑框组件提供的getText(0方法实现。使用该方法时,先要获取到编辑框组件,然后再调用getText(0方法。例如,要获取布局文件中添加的id属性为login的编辑框的内容,可以通过以下代码实现:
<?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:id="@+id/tableLayout1"
android:background="#2FFFFB00">
<TableRow
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/tabMode1">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="会员昵称:"
android:textSize="20dp"
android:inputType="textPersonName"
android:id="@+id/textView1"
android:height="50px"/>
<EditText
android:id="@+id/nickname"
android:layout_width="500px"
android:layout_height="wrap_content"
android:singleLine="true"
android:hint="请输入会员昵称"/>
</TableRow>
<TableRow
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/tabMode2">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="密 码:"
android:textSize="20dp"
android:inputType="textVisiblePassword"
android:id="@+id/textView2"
android:height="50px"/>
<EditText
android:id="@+id/password_toggle"
android:layout_width="500px"
android:layout_height="wrap_content"
android:singleLine="true"
android:inputType="textPassword"
android:hint="请输入密码"/>
</TableRow>
<TableRow
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/tabMode3">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="确认密码:"
android:textSize="20dp"
android:inputType="textVisiblePassword"
android:id="@+id/textView3"
android:height="50px"/>
<EditText
android:id="@+id/password_toggle1"
android:layout_width="500px"
android:layout_height="wrap_content"
android:singleLine="true"
android:inputType="textPassword"
android:hint="请再次输入密码"/>
</TableRow>
<TableRow
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/tabMode4">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text=" email :"
android:textSize="20dp"
android:inputType="textVisiblePassword"
android:id="@+id/textView4"
android:height="50px"/>
<EditText
android:id="@+id/email"
android:layout_width="500px"
android:layout_height="wrap_content"
android:singleLine="true"
android:inputType="textPassword"
android:hint="请输入Email"/>
</TableRow>
<LinearLayout
android:orientation="horizontal"
android:layout_width="wrap_content"
android:background="#19FF00FF"
android:layout_height="wrap_content">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="注册"
android:id="@+id/button1"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text=" "/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="重置"
android:id="@+id/button2"/>
</LinearLayout>
</TableLayout>
package com.example.edittextproject;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button = (Button)findViewById(R.id.button1);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
EditText edittext1 = (EditText)findViewById(R.id.nickname);
String name = edittext1.getText().toString();
EditText editText2 = (EditText) findViewById(R.id.password_toggle);
String password = editText2.getText().toString();
EditText editText3 = (EditText) findViewById(R.id.password_toggle1);
String password2 = editText3.getText().toString();
EditText editText4 = (EditText) findViewById(R.id.email);
String email = editText4.getText().toString();
Log.i("edit", "会员昵称: "+name);
Log.i("edit", "密码: "+password);
Log.i("edit", "Email: "+email);
}
});
}
}
4.3、按钮Button
4.3.1、普通按钮
在屏幕上添加按钮后,还需要为按钮添加单击事件监听器,才能让按钮发挥其特有的用途。Android提供了两种为按钮添加单击事件监听器的方法,一种是在Java代码中完成,例如,在Activity的onCreate0)方法中完成,具体的代码如下:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button = (Button)findViewById(R.id.button1);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
}
});
}
另一种是在Activity中编写一个包含Viw类型参数的方法,并且将要触发的动作代码放在该方法中,然后在布局文件中,通过android:onClick属性指定对应的方法名实现。例如,在Activity中编写一个名为myClickO的方法,关键代码如下:
public void myClick(View view){
}
那么就可以在布局文件中通过android:onClick="myClick"语句为按钮添加单击事件监听器。
4.3.2、图片按钮
图片按钮与普通按钮的使用方法基本相同,只不过图片按钮使用mageButton:标记定义,并且可以为其指定android:src属性,用于设置要显示的图片。在布局文件中添加图像按钮的基本语法格式如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="普通按钮"
android:id="@+id/button1"
tools:ignore="MissingConstraints" />
<ImageButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_launcher_background"
android:onClick="myClick"
android:id="@+id/button2"
tools:ignore="OnClick" />
</LinearLayout>
package com.example.imgbuttonproject;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button viewById = (Button) findViewById(R.id.button1);
viewById.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast toast = Toast.makeText(MainActivity.this,"你点击了普通按钮",Toast.LENGTH_SHORT);
toast.show();
}
});
}
public void myClick(View view){
Toast toast = Toast.makeText(MainActivity.this,"你点击了图片按钮",Toast.LENGTH_SHORT);
toast.show();
}
}
4.4、单选按钮复选框
在Android中,单选按钮和复选框都继承了普通按钮,因此,它们都可以直接使用普通按钮支持的各种属性和方法。与普通按钮不同的是,它们提供了可选中的功能。下面分别对单选按钮和复选框进行详细介绍。
4.4.1、单选按钮
在默认情况下,单选按钮显示为一个圆形图标,并且在该图标旁边放置一些说明性文字。在程序中,一般将多单选按钮放置在按钮组中,使这些单选按钮表现出某种功能,当用户选中某个单选按钮后,按钮组中的其他按钮将被自动取消选中状态。在Android中,单选按钮使用RadioButton表示,而RadioButton类又是Button的子类,所以单选按钮可以直接使用Button支持的各种属性。
RadioButton组件的android:checked属性用于指定选中状态,属性值为true时,表示选中;属性值为false时,表示取消选中,默认为false。
通常情况下,RadioButton组件需要与RadioGroup组件一起使用,组成一个单选按钮组。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="性别"
android:textSize="50px" />
<RadioGroup
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:id="@+id/radioGroup1">
<RadioButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="男"
android:id="@+id/radio1"
android:checked="true"/>
<RadioButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="女"
android:id="@+id/radio2"/>
</RadioGroup>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="提交"
android:id="@+id/button1"/>
</LinearLayout>
在屏幕中添加单选按钮组后,还需要获取单选按钮组中选中项的值,通常存在以下两种情况:一种是在改变单选按钮组的值时获取;另一种是在单击其他按钮时获取。下面分别介绍这两种情况所对应的实现方法。在改变单选按钮组的值时获取选中项的值时,首先需要获取单选按钮组,然后为其添加OnCheckedChangeListener,并在其onCheckedChanged()方法中根据参数checkedId获取被选中的单选钮,并通过其getTextO方法获取该单选按钮对应的值。例如,要获取id属性为radioGroupl的单选按钮组的值,可以通过下面的代码实现
RadioGroup radioGroup = (RadioGroup) findViewById(R.id.radioGroup1);
radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup radioGroup, int i) {
RadioButton radioButton = (RadioButton) findViewById(i);
Toast.makeText(MainActivity.this, "你的性别是:"+radioButton.getText(), Toast.LENGTH_SHORT);
}
});
单击其他按钮时获取选中项的值时,首先需要在该按钮的单击事件监听器的onClickO方法中,通过for循环语句遍历当前单选按钮组,并根据被遍历到的单选按钮的isCheckedO方法判断该按钮是否被选中,当被选中时,通过单选按钮的getTextO)方法获取对应的值。例如,要在单击“提交"”按钮时,获取id属性为radioGroupl的单选按钮组的值,可以通过下面的代码实现。
RadioGroup radioGroup1 = (RadioGroup) findViewById(R.id.radioGroup1);
Button button = (Button) findViewById(R.id.button1);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
for (int i = 0; i < radioGroup1.getChildCount(); i++) {
RadioButton radioButton = (RadioButton) radioGroup1.getChildAt(i);
if (radioButton.isChecked()){
radioButton.getText();
break;
}
}
}
});
4.4.2、复选框
在默认情况下,复选框显示为一个方块图标,并且在该图标旁边放置一些说明性文字。与单选按钮唯一不同的是复选框可以进行多选设置,每一个复选框都提供“选中”和“不选中”两种状态。在Android中,复选框使用CheckBox表示,而CheckBox类又是Button的子类,所以可以直接使用Button支持的各种属性。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="爱好"
android:width="100px"
android:height="50px"
android:gravity="right" />
<CheckBox
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="音乐"
android:id="@+id/like1"/>
<CheckBox
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="学习"
android:id="@+id/like2"/>
<CheckBox
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="体育"
android:id="@+id/like3"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="提交"
android:id="@+id/button"/>
</LinearLayout>
package com.example.fuxuankuang;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
public class MainActivity extends AppCompatActivity {
private CompoundButton.OnCheckedChangeListener checkbox = new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
if (b){
Log.i("复选框", "选中: "+compoundButton.getText().toString());
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
CheckBox checkBox1 = (CheckBox) findViewById(R.id.like1);
CheckBox checkBox2 = (CheckBox) findViewById(R.id.like2);
CheckBox checkBox3 = (CheckBox) findViewById(R.id.like3);
checkBox1.setOnCheckedChangeListener(checkbox);
checkBox2.setOnCheckedChangeLisetener(checkbox);
checkBox3.setOnCheckedChangeListener(checkbox);
Button button = (Button) findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String like = "";
if (checkBox1.isChecked()){
like = like + checkBox1.getText().toString();
}
if (checkBox2.isChecked()){
like = like + checkBox2.getText().toString();
}
if (checkBox3.isChecked()){
like = like + checkBox3.getText().toString();
}
Log.i("复选框", "爱好是: " + like);
}
});
}
}
4.5、图像ImageView
ImageView是用于在界面上展示图片的一个控件,它可以让我们的程序界面变得更加丰富多彩。学习这个控件需要提前准备好一些图片,图片通常都是放在以“drawable”开头的目录下的。
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/image"
android:src="@drawable/icon03"
android:layout_gravity="center"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/button"
android:text="切换"
android:layout_gravity="center_vertical|right"/>
</FrameLayout>
package com.example.imageproject;
import androidx.appcompat.app.AppCompatActivity;
import android.annotation.SuppressLint;
import android.content.res.Resources;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
int i = 1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ImageView imageView = (ImageView) findViewById(R.id.image);
Button button = (Button) findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
i++;
if (i % 2 == 0){
imageView.setImageResource(R.drawable.icon04);
}else {
imageView.setImageResource(R.drawable.icon03);
}
}
});
}
}
4.6、列表选择框
Android中提供的列表选择框(Spinner)相当于在网页中常见的下拉列表框,通常用于提供一系列可选择的列表项供用户进行选择,从而方便用户。
其中,android:entries为可选属性,用于指定列表项,如果在布局文件中不指定该属性,可以在Java代码中通过为其指定适配器的方式指定;android:prompt属性也是可选属性,用于指定列表选择框的标题。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<Spinner
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:entries="@array/ctype"
android:id="@+id/spread1"/>
</LinearLayout>
编写用于指定列表项的数组资源文件,并将其保存在res\values目录中,这里将其命名为arrays.xml,在该文件中添加一个字符串数组,名称为ctype,具体代码如下
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="ctype">
<item>身份证</item>
<item>学生证</item>
<item>工作证</item>
<item>军人证</item>
<item>其他证</item>
</string-array>
</resources>
package com.example.spinnerproject;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.Spinner;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Spinner spinner = (Spinner) findViewById(R.id.spread1);
spinner.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
String s = adapterView.getItemAtPosition(i).toString();
Toast.makeText(MainActivity.this, s, Toast.LENGTH_SHORT);
}
});
}
}
4.7、列表视图
通过适配器指定列表项来进行创建
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<ListView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/listView1"
android:divider="@drawable/ic_launcher_background"
android:dividerHeight="3px"
android:footerDividersEnabled="false"
android:headerDividersEnabled="false"
tools:ignore="MissingConstraints" />
</androidx.constraintlayout.widget.ConstraintLayout>
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="arrs">
<item>1</item>
<item>2</item>
<item>3</item>
<item>4</item>
<item>5</item>
</string-array>
</resources>
package com.example.listviewproject;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ListView listView = (ListView) findViewById(R.id.listView1);
//创建适配器
ArrayAdapter<CharSequence> arrayAdapter = ArrayAdapter.createFromResource(this,
R.array.arrs, androidx.appcompat.R.layout.support_simple_spinner_dropdown_item);
listView.setAdapter(arrayAdapter);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
String s = adapterView.getItemAtPosition(i).toString();
Toast.makeText(MainActivity.this, s, Toast.LENGTH_SHORT).show();
}
});
}
}
Activity继承ListActivity实现
package com.example.listviewproject01;
import androidx.appcompat.app.AppCompatActivity;
import android.app.ListActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;
public class MainActivity extends ListActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
String[] str = new String[]{"1", "2", "3", "4"};
ArrayAdapter<String> arrayAdapter = new ArrayAdapter<>(this,
androidx.appcompat.R.layout.support_simple_spinner_dropdown_item, str);
setListAdapter(arrayAdapter);
}
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
super.onListItemClick(l, v, position, id);
String s = l.getItemAtPosition(position).toString();
Toast.makeText(MainActivity.this, s, Toast.LENGTH_SHORT).show();
}
}
4.8、日期时间拾取器
为了让用户能够选择日期和时间,Android提供了日期、时间拾取器,分别是DatePicker组件和TimePicker组件。这两个组件使用比较简单,可以在Android Studio的可视化界面设计器中,选择对应的组件并拖曳到布局文件中。为了可以在程序中获取用户选择的日期、时间,还需要为DatePicker和TimePicker组件添加事件监听器。其中,DatePicker组件对应的事件监听器是OnDateChangedListener,而TimePicker组件对应的事件监听器是OnTimeChangedListener.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical">
<DatePicker
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/datePicker"
tools:ignore="MissingConstraints" />
<TimePicker
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/timePicker"
tools:ignore="MissingConstraints" />
</LinearLayout>
package com.example.dataandtimeproject;
import androidx.annotation.RequiresApi;
import androidx.appcompat.app.AppCompatActivity;
import android.icu.util.Calendar;
import android.os.Build;
import android.os.Bundle;
import android.widget.DatePicker;
import android.widget.TimePicker;
import android.widget.Toast;
@RequiresApi(api = Build.VERSION_CODES.N)
public class MainActivity extends AppCompatActivity {
Calendar calendar = Calendar.getInstance();
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH);
int day = calendar.get(Calendar.DAY_OF_MONTH);
int hour = calendar.get(Calendar.HOUR_OF_DAY);
int minute = calendar.get(Calendar.MINUTE);
public void show(int year, int month, int day, int hour, int minute){
String str = year + "年" + month + 1 + "月" + day + "日" + hour + "时" + minute + "分";
Toast.makeText(MainActivity.this, str, Toast.LENGTH_SHORT).show();
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
DatePicker datePicker = (DatePicker) findViewById(R.id.datePicker);
TimePicker timePicker = (TimePicker) findViewById(R.id.timePicker);
timePicker.setIs24HourView(true);
datePicker.init(year, month, day, new DatePicker.OnDateChangedListener() {
@Override
public void onDateChanged(DatePicker datePicker, int year, int month, int day) {
MainActivity.this.year = year;
MainActivity.this.month = month;
MainActivity.this.day = day;
show(year, month, day, hour, minute);
}
});
timePicker.setOnTimeChangedListener(new TimePicker.OnTimeChangedListener() {
@Override
public void onTimeChanged(TimePicker timePicker, int i, int i1) {
MainActivity.this.hour = i;
MainActivity.this.minute = i1;
show(year, month, day, hour, minute);
}
});
}
}
4.9、计时器
计时器(Chronometer)组件可显示从某个起始时间开始,一共过去了多长时间的文本。由于该组件继承自TextView,所以它以文本的形式显示内容。使用该组件也比较简单,通常只需要使用以下5个方法。
setBase():用于设置计时器的起始时间。
setFormat():用于设置显示时间的格式。
start():用于指定开始计时。
stop():用于指定停止计时。
setOnChronometerTickListener():用于为计时器绑定事件监听器,当计时器改变时触发该监听器。
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<Chronometer
android:layout_width="match_parent"
android:text="chronometer"
android:layout_height="match_parent"
android:gravity="center"
android:id="@+id/chronometer"/>
</androidx.constraintlayout.widget.ConstraintLayout>
package com.example.chronomterproject;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.os.SystemClock;
import android.widget.Chronometer;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Chronometer chronometer = (Chronometer) findViewById(R.id.chronometer);
chronometer.setBase(SystemClock.elapsedRealtime());
chronometer.setFormat("已用时间:%s");
chronometer.start();
}
}
5、范例
1、实现跟踪鼠标单击状态的图片按钮。
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<ImageButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/imageButton"
android:background="#0000"
android:src="@drawable/button_state"
tools:ignore="MissingConstraints" />
</androidx.constraintlayout.widget.ConstraintLayout>
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true" android:drawable="@drawable/mmexport1647693561983"/>
<item android:state_pressed="false" android:drawable="@drawable/mmexport1647693579357"/>
</selector>
package com.example.fanli_anniuproject;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageButton;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ImageButton imageButton = (ImageButton) findViewById(R.id.imageButton);
imageButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(MainActivity.this, "1", Toast.LENGTH_SHORT).show();
}
});
}
}
2、实现带图标的ListView.
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<ListView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/listView"
tools:ignore="MissingConstraints" />
</androidx.constraintlayout.widget.ConstraintLayout>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/image"
android:paddingTop="20px"
android:paddingRight="10px"
android:paddingBottom="20px"
android:adjustViewBounds="true"
android:maxWidth="72px"
android:maxHeight="72px"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/text"
android:padding="10px"
android:layout_gravity="center"/>
</LinearLayout>
package com.example.fanli_listviewproject;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ListView listView = (ListView) findViewById(R.id.listView);
int[] imageId = new int[]{R.drawable.icon01, R.drawable.icon02,
R.drawable.icon03, R.drawable.icon04, R.drawable.icon05, R.drawable.icon06};
String[] str = new String[]{"1", "2", "3", "4", "5", "6"};
ArrayList<Map<String, Object>> arrayList = new ArrayList<>();
for (int i = 0; i < imageId.length; i++) {
HashMap<String, Object> map = new HashMap<>();
map.put("image", imageId[i]);
map.put("title", str[i]);
arrayList.add(map);
}
SimpleAdapter simpleAdapter = new SimpleAdapter(this, arrayList,
R.layout.items, new String[]{"title", "image"}, new int[]{R.id.text, R.id.image});
listView.setAdapter(simpleAdapter);
}
}
说明:SimpleAdapter类的构造方法SimpleAdapter(Context context,List?extends Map<String,?>>data,int resource.,String[]from,int to)中,参数context用于指定关联SimpleAdapter运行的视图上下文;参数data用于指定一个基于Map的列表,该列表中的每个条目对应列表中的一行;参数resource用于指定一个用于定义列表项目的视图布局文件的唯一标识;参数from用于指定一个将被添加到Map上关联每一个项目的列名称的数组;参数to用于指定一个与参数from显示列对应的视图id的数组。