目录

  • 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界面主要分为以下两个步骤:

  1. 在android应用的res/layout目录下编写xml布局文件。创建后,R.java会自动收录该布局文件资源。
  2. 在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个关键步骤。

  1. 创建布局管理器,可以是帧布局管理器、表格布局管理器、线性布局管理器和相对布局管理器等,并且设
    置布局管理器的属性。例如,为布局管理器设置背景图片等。
  2. 创建具体的组件,可以是TextView、Image View、EditText和Button等任何Android提供的组件,并且
    设置组件的布局和各种属性。
  3. 将创建的具体组件添加到布局管理器中。
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个步骤:

  1. 创建一个继承android.view.View类的View类,并且重写构造方法。
  2. 根据需要重写相应的方法。
  3. 在项目的活动中,创建并实例化自定义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属性,可以很好地控制相对布局管理器中各组件的分布方式。

Android怎么使软件界面交互 安卓软件界面设计_android

<?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

Android怎么使软件界面交互 安卓软件界面设计_布局管理器_02

<?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、列表视图

Android怎么使软件界面交互 安卓软件界面设计_布局管理器_03


通过适配器指定列表项来进行创建

<?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的数组。