一. Activity基础控件的知识
1.1 TextView
1.2 Button
1.3 EditText
1.4 ImageView
1.5 ProgressBar
1.6 AlterDialog
二. 特殊的ListView控件
2.1 ListView知识
前言:
Android给我们提供了大量的UI控件,合理地使用这些控件就可以非常轻松地编写出相当不错的界面,下面我们就挑选几种常用的控件,详细介绍一下它们的使用方法。
一**.**六个常见控件
1.1TextView****控件(文字框)
1.1.1****几个基础的控件属性:
我们先讲几个基础的控件属性方便我们的理解:
id**:**为TextView设置一个组件id,根据id,我们可以在Java代码中通过findViewById()的方法获 取到该对象,然后进行相关属性的设置,又或者使用RelativeLayout时,参考组件用的也是id!
layout_width**:组件的宽度,一般写:wrap_content或者match_parent(fill_parent)**,前者是 控件显示的内容多大,控件就多大,而后者会填满该控件所在的父容器;当然也可以设置成特定的大小,比如我这里为了显示效果,设置成了200dp。
layout_height**:**组件的高度,内容同上。
gravity**:**设置控件中内容的对齐方向,TextView中是文字,ImageView中是图片等等。
text**:**设置显示的文本内容,一般我们是把字符串写到string.xml文件中,然后通过@String/xxx 取得对应的字符串内容的,这里为了方便我直接就写到""里
textColor**:**设置字体颜色,同上,通过colors.xml资源来引用,尽量不要直接写颜色代码(如果 我们写完想要正题对一个颜色进行修改的话,直接写色号可能会遗漏部分颜色导致界面的美观效果 变差,但是如果写应用的话,就是全部同一种进行修改)
textStyle**:**设置字体风格,三个可选值:normal(无效果),bold(加粗),italic(斜体)
textSize**:**字体大小,单位一般是用sp!
background**:**控件的背景颜色,可以理解为填充整个控件的颜色,可以是图片哦!(也是使用引用drawable)
下面是代码演示
XML
<TextView
//控件id
android:id = "@+id/xxx" @+id/xxx表示新增控件命名为xxx
//宽度与高度
android:layout_width="wrap_content" //wrap_content或者match_parent
android:layout_height="wrap_content" //wrap_content或者match_parent
//文本文字
android:text="@string/hello_world" //两种方式,直接具体文本或者引用values下面的
string.xml里面的元素
//字体大小
android:textSize="24sp" //以sp为单位
//字体颜色
android:textColor="#0000FF" //RGB颜色
//字体格式
android:textStyle="normal" //normal,bold,italic分别为正常,加粗以及斜体,默认为normal
//文本显示位置
android:gravity="center" //来指定文字的对齐方式,可选值有 top、bottom、left、right、
center 等
//是否只在一行内显示全部内容
android:singleLine="true" //true或者false,默认为false
1.1.2****提出几个我认为可以详细展开的来讲一下:
下面我讲几个可以扩展的:
1.1.2.1基本的id****解读
第一个我要讲的就是最基础的id语句,这里我会讲一下它的在xml界面以及java界面的引用和书写,下面我们看代码来解决:
下面是xml界面的
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="vertical"
android:padding="16dp">
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello, World!"
android:textSize="18sp" />
</LinearLayout>
接下来是java界面
java
<?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="vertical"
android:padding="16dp">
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello, World!"
android:textSize="18sp" />
</LinearLayout>
对上面的代码来进行一个解读:
我们在XML文件里写了一份定义语句: android:id="@+id/textView" 下面则是java的引用
myTextView = findViewById(R.id.myTextView) :通过 findViewById 方法获取布局文件中定义 的TextView 控件的引用。 R.id.myTextView 是 TextView 的资源 ID,它在activity_main.xml 中 定义。
myTextView.setText("Text changed from Java code!") :通过 setText 方法修改TextView 的文 本内容。
1.1.2.2基本的gravity****解读
接下来讲一下这个代码:android:gravity就是用于指定文字在控件中的对齐方式。
android:gravity :主要是针对控件里的元素来说的,用来控制元素在该控件里的显示位置。例如,在 一个Button按钮控件中设置如下两个属性, android:gravity="left" 和 android:text="提交" ,这 时Button上的文字"提交"将会位于Button的左部。
下面我们主要扩展的就是关于gravity里可填的东西,这里面可以填写的有很多,我来列举一下: 我们在线性布局这个属性可选的值有:top、bottom、left、rightcenter_vertical、 fill_vertical、center_horizontal、fill_horizontal、center、fill、clip_vertical。
含义如下:
top: 将对象放在其容器的顶部,不改变其大小。
bottom: 将对象放在其容器的底部,不改变其大小。
left: 将对象放在其容器的左侧,不改变其大小。
right: 将对象放在其容器的右侧,不改变其大小。
center_vertical: 将对象纵向居中,不改变其大小.垂直对齐方式:垂直方向上居中对齐。
fill_vertical: 必要的时候增加对象的纵向大小,以完全充满其容器.垂直方向填充。
center_horizontal: 将对象横向居中,不改变其大小.水平对齐方式:水平方向上居中对齐。
fill_horizontal: 必要的时候增加对象的横向大小,以完全充满其容器.水平方向填充。
center: 将对象横纵居中,不改变其大小。
fill: 必要的时候增加对象的横纵向大小,以完全充满其容器。
clip_vertical: 附加选项,用于按照容器的边来剪切对象的顶部和/或底部的内容.。剪切 基于其纵向对齐设置: 顶部对 齐时,剪切底部;底部对齐时剪切顶部;除 此之外剪切顶部和底部.垂直方向裁剪。
clip_horizontal: 附加选项,用于按照容器的边来剪切对象的左侧和/或右侧的内容. 剪切基 于其横向对齐设置: 左侧对齐 时,剪切右侧;右侧对齐时剪切左侧;除此 之外剪切左侧和右侧.水平方向裁剪。
1.1.2.3为textView****控件添加一个文字
我们常常会看见一个为添加内容的地方设置一个文字框,现在我来讲解一下这个功能是如何实现的:
先要编写它的drawable
XML
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
<!-- 设置一个黑色边框 -->
<stroke android:width="2px" android:color="#000000"/>
<!-- 渐变 -->
<gradient
android:angle="270"
android:endColor="#C0C0C0"
android:startColor="#FCD209" />
<!-- 设置一下边距,让空间大一点 -->
<padding
android:left="5dp"
android:top="5dp"
android:right="5dp"
android:bottom="5dp"/>
</shape>
上面这段代码设置了一个规则的矩形文字框,接下来我们设置一个边缘圆化的。
XML
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 设置透明背景色 -->
<solid android:color="#87CEEB" />
<!-- 设置一个黑色边框 -->
<stroke
android:width="2px"
android:color="#000000" />
<!-- 设置四个圆角的半径 -->
<corners
android:bottomLeftRadius="10px"
android:bottomRightRadius="10px"
android:topLeftRadius="10px"
android:topRightRadius="10px" />
<!-- 设置一下边距,让空间大一点 -->
<padding
android:bottom="5dp"
android:left="5dp"
android:right="5dp"
android:top="5dp" />
</shape>
这两个代码的区别就在于我们设计了这个文字框边框的半径。
接下来看XML界面来写代码:
XML
<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"
android:background="#FFFFFF"
android:gravity="center"
android:orientation="vertical"
tools:context=".MainActivity">
<TextView
android:id="@+id/txtOne"
android:layout_width="200dp"
android:layout_height="64dp"
android:textSize="18sp"
android:gravity="center"
android:background="@drawable/txt_rectborder"
android:text="矩形边框的TextView" />
<TextView
android:id="@+id/txtTwo"
android:layout_width="200dp"
android:layout_height="64dp"
android:layout_marginTop="10dp"
android:textSize="18sp"
android:gravity="center"
android:background="@drawable/txt_radiuborder"
android:text="圆角边框的TextView" />
</LinearLayout>
1.1.2.4****设置文字框的阴影
我们自己可能在word里面见过文字设置阴影,接下来我们可以在代码里实现对我们文字框里文字的设置
阴影部分,我们对这部分简单概括其代码:
**android:shadowColor:**设置阴影颜色,需要与shadowRadius一起使用哦!
**android:shadowRadius:**设置阴影的模糊程度,设为0.1就变成字体颜色了,建议使用3.0
**android:shadowDx:**设置阴影在水平方向的偏移,就是水平方向阴影开始的横坐标位置
**android:shadowDy:**设置阴影在竖直方向的偏移,就是竖直方向阴影开始的纵坐标位置
1.2Button****控件(按钮)
下面要将的就是我们控件里最常使用的也是我们生活中最常见的按钮控件------button
1.2.1基础了解button****按键
android:id:设置Button的唯一标识符。在代码中可以使用这个ID引用Button。
android:layout_width:指定Button的宽度,可以使用以下值:
"wrap_content":根据按钮内部内容自适应宽度。"match_parent":填充父布局的宽度。具体数值 (如"100dp"):设置具体的宽度值。
android:layout_height:指定Button的高度,可以使用以下值:
"wrap_content":根据按钮内部内容自适应高度。"match_parent":填充父布局的高度。具体数值 (如"50dp"):设置具体的高度值。
android:text:设置Button显示的文本内容。
android:textColor:设置Button文本的颜色。 可以是具体颜色值(如"#FF0000"表示红色)。可以是指向颜色资源的引用(如"@color/red"),资源文件中定义对应的颜色值。
android:textSize:设置Button文本的大小。 可以是具体数值(如"14sp"),也可以是指向尺寸资源的引用。
android:background:设置Button的背景,可以使用以下值:
可以是具体颜色值(如"#FF0000"表示红色)。可以是指向图片资源的引用 (如"@drawable/button_bg"),使用图片作为背景。
android:padding:设置Button的内容与边框之间的内边距
android:gravity:设置Button中文本内容的对齐方式。
这里就是最基础的Button涉及的知识。
1.2.2Button****三种点击事件重要属性
1.2.2.1 onClick****点击事件
onClick点击事件是最基础的点击事件,它的实现主要是通过在xml里设计onClick语句,再通过java界面的引用语句实现的。
下面我们看代码以及Java界面语句来实现这个点击事件。
xml界面:
XML
<Button
android:id="@+id/myButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Click Me"
android:onClick="onButtonClick" />
上面我们写了一个 android:onClick="onButtonClick" 语句,下面是Java
java
public void onButtonClick(View view) {
// 处理点击事件
Toast.makeText(this, "Button clicked!", Toast.LENGTH_SHORT).show();
}
其实使用onClick的主要语句部分是下面这段:
public void onButtonClick(View view) {
}
我们可以在这个大括号中间写点击onClick的引用语句,而我后面写的Toast则是用于观察我们是否成功点击了这个按钮。如果成功点击了这个按钮,下面就会显示ButtonClick。
1.2.2.2****创建一个监听器来制作点击事件
监听器其实是我们点击事件的主要的实现方法,而onClick方法则是一种有些过时的方法,监听器的方法主要是搭配id定义语句结合setonClickListener方法制作而成,下面我们来简单了解一下代码,先看xml界面:
XML
<Button
android:id="@+id/myButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Click Me" />
我们会注意到,这里没有onClick语句,只是给一个定义的id语句,下面我们来看java界面,也就是它的引用代码:
java
// 通过 findViewById 获取按钮的引用
Button myButton = findViewById(R.id.myButton);
// 为按钮设置点击事件监听器
myButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 处理点击事件
Toast.makeText(MainActivity.this, "Button clicked!", Toast.LENGTH_SHORT).show();
}
});
相比了解完上面Toast语句的作用,你也知道监听器的基础代码是什么了,我们再列举出来:
java
// 通过 findViewById 获取按钮的引用
Button myButton = findViewById(R.id.myButton);
// 为按钮设置点击事件监听器
myButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
}
});
我们来进行解读一下吧:
Button myButton = findViewById(R.id.myButton); 的知识点:
findViewById 方法:
findViewById 是 Activity 或 View 类的一个方法,用于通过资源 ID 获取布局文件中定义的控件的引用。
R.id.myButton 是布局文件中定义的 Button 控件的资源 ID。这个 ID 是在布局文件中通过 android:id 属性指定的。
Button myButton :将获取到的 Button 控件的引用赋值给变量 myButton ,这样你就可以在代码中操作这个按钮了。
java
myButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
}
});
setOnClickListener 方法:
setOnClickListener 是 View 类的一个方法,用于为控件设置点击事件监听器。
new View.OnClickListener() :创建一个新的 View.OnClickListener 对象。
View.OnClickListener 是一个接口,定义了点击事件的处理逻辑。
@Override :表示这个方法覆盖了接口中的同名方法。
public void onClick(View v) :这是 View.OnClickListener 接口中的方法,当按钮被点击时调用。
View v :表示被点击的控件,这里是指 myButton 。
1.2.2.3重写onClick****方法
上面讲解的方法都是关于一个按钮的方法,而接下来的这个方法则便于调控多个按钮,因为它可以将所有按钮的点击事件处理逻辑集中在一个方法中,便于维护和管理。
不多废话,我们来看代码:
XML界面
XML
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button 1" />
<Button
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button 2" />
上面定义了两个按钮分别为Button1和2,我们直接看java界面:
java
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 为每个控件绑定方法
findViewById(R.id.button).setOnClickListener(this);
findViewById(R.id.button2).setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) { // 判断ID
case R.id.button:
Toast.makeText(this, "方法3:button1", Toast.LENGTH_SHORT).show();
break;
case R.id.button2:
Toast.makeText(this, "方法3:button2", Toast.LENGTH_SHORT).show();
break;
}
}
除去Toast,可能还是觉得很懵,我们按常理,分布解读他们:
findViewById(R.id.button).setOnClickListener(this);
findViewById(R.id.button2).setOnClickListener(this);
findViewById 方法:
通过资源 ID 获取布局文件中定义的控件的引用。
R.id.button 和 R.id.button2 是布局文件中定义的按钮的资源 ID。
public void onClick(View v)
v.getId() :获取被点击控件的资源 ID。每个控件在布局文件中都有一个唯一的 ID,通过
android:id 属性指定。
switch :用于根据不同的条件执行不同的代码块。
case R.id.button:
Toast.makeText(this, "方法3:button1", Toast.LENGTH_SHORT).show();
break;
case R.id.button :表示如果 v.getId() 的值等于 R.id.button ,则执行以下代码。
Toast.makeText(this, "方法3:button1", Toast.LENGTH_SHORT).show() :显示一个短暂的提示信息,通知用户 button1 被点击。
Toast.makeText :创建一个 Toast 对象,用于显示提示信息。
this :表示当前 Activity 的上下文。
"方法3:button1" :提示信息的内容。
Toast.LENGTH_SHORT :提示信息的显示时长,表示短暂显示。
.show() :显示 Toast 提示信息。
break :结束当前 case ,防止代码继续执行到下一个 case 。
学完Button点击事件我们来总结一下:
使用android:onClick 属性
适用场景:
简单的点击事件处理,特别是当点击事件的处理逻辑集中在 Activity 或 Fragment 中时。
快速开发和简单的逻辑。
使用setOnClickListener 方法
适用场景:
复杂的点击事件处理,特别是当需要在运行时动态设置监听器或处理多个控件的点击事件时。
动态设置监听器和处理多个控件的点击事件。
重写onClick 方法
适用场景:
处理多个按钮的点击事件,特别是当多个按钮共享相同的点击事件处理逻辑时。
集中管理点击事件处理逻辑,减少代码冗余。
1.3EditText****控件(输入框)
1.3.1****提示性文字的制作
你可能平时会留意到,一些做得比较人性化的软件会在输入框里显示一些提示性的文字,一旦用户输入了任何内容,这些提示性的 字就会消失。这种提示功能在Android里是非常容易实现的,我们甚至不需要做任何逻辑控制,因为系统已经帮我们都处理好了。类似下图这种:
![](https://i-blog.csdnimg.cn/direct/91d93f4f2fa446eeab718a131c2e44d6.jpeg)
图1:提示文字格式
我们来看XML文件的代码:
XML
<EditText
android:id="@+id/editText"
android: layout_ width="match_ parent"
android: layout_ height-"wraip_ content"
android:hint="Type something here"
/>
这个代码就会让我们的输入框里出现文字"Type something here",当然如果想要实现上面图片中的效果,就把文字打进去。
1.3.2****最大行数限制
可以看到,EditText中显示了一段提示性文本,然后当我们输入任何内容时,这段文本就会自动消失不过,随着输入的内容不断增多,EditText会被不断地拉长。这是由于BditText的高度指定的是wrap-content,因此它总能包含住里面的内容,但是当输入的内容过多时,界面就会变得非常难看。我们可以使用android:maxLines属性来解决这个问题,
XML
<EditText
android:id="@+id/editText"
android: layout_ width="match_parent"
android: layout_ height="wrap_content"
android:hint="Type something here"
android:maxLines="2/>
这里通过android:maxLines指定EditText的最大行数为两行,这样当输入的内容超过两行时候,文本就会向上滑动,EditText就不会继续拉伸。
1.3.3****通过按钮事件获取文字框里的内容
来写代码我们方便理解一下,接下来看代码:
XML界面
XML
<EditText
android:id="@+id/username"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="输入账号" />
<EditText
android:id="@+id/password"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="输入密码" />
通过点击按钮来获取 EditText 的内容,你可以在按钮的点击事件监听器中使用
getText().toString() 方法来获取 EditText 中的。
下面是java界面。
java
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 获取 EditText 和 Button 的引用
final EditText editText = findViewById(R.id.editText);
Button button = findViewById(R.id.button);
// 为按钮设置点击事件监听器
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 获取 EditText 的文本内容
String text = editText.getText().toString();
// 显示获取到的文本
Toast.makeText(MainActivity.this, text,
Toast.LENGTH_SHORT).show();
}
});
}
}
逐步分析代码:
final EditText editText = findViewById(R.id.editText);
Button button = findViewById(R.id.button);
使用 findViewById 方法获取布局文件中定义的组件的引用。
R.id.editText 和 R.id.button 是在 activity_main.xml 布局文件中定义的组件的 ID。
editText 和 button 变量存储了这些组件的引用,以便在代码中操作这些组件。
java
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 获取 EditText 的文本内容
String text = editText.getText().toString();
// 显示获取到的文本
Toast.makeText(MainActivity.this, text, Toast.LENGTH_SHORT).show();
}
});
setOnClickListener 方法为按钮设置了一个点击事件监听器。
创建了一个匿名内部类实现 View.OnClickListener 接口,并重写了 onClick 方法。
在 onClick 方法中,获取 EditText 组件的文本内容,并使用 Toast 显示这个文本。
getText().toString() 获取 EditText 中的文本内容。
Toast.makeText(MainActivity.this, text, Toast.LENGTH_SHORT).show(); 创建并显示一个Toast 对象,显示文本内容。
1.4ImageView****控件(展示图片)
1.4.1****这个控件包含的基础知识
android:src:要显示的图片资源,可以是本地资源(如@drawable/image)或网络图片(如 http://.......)。
注意,不能直接使用URL加载网络图片,需要使用第三方库或自定义实现。
android:scaleType:图片的缩放类型。常见的取值有:
center**:保持原图大小居中显示。**
centerCrop**:按比例缩放图片,使其完全填充ImageView,并裁剪超出部分。**
centerInside**:按比例缩放图片,使其完全显示在ImageView内部,不裁剪。**
fitCenter**:按比例缩放图片,使其完整显示在ImageView内部,不裁剪,并保持图片原始比例。**
android:adjustViewBounds:是否根据图片的宽高比自动调整ImageView的大小。
android:tint:设置图片的着色颜色。
android:background:设置ImageView的背景,可以是颜色值或者图片资源。
android:baselineAlignBottom:是否将基线与底部对齐,默认为false。当ImageView用作文字图标时,可以使用该属性控制对齐方式。
android:contentDescription:用于辅助功能的描述文本,通常用于无障碍功能。
1.4.2****代码详细的讲解
1.4.2.1src****语句
XML
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_launcher" />
我们要在drawable里添加图片并对其进行命名,直接在src中引用,就会发现图片已经出现在UI界面里了。
1.4.2.2scaleType****语句
XML
<attr name="scaleType">
<enum name="matrix" value="0" />
<!-- Scale the image using {@link
android.graphics.Matrix.ScaleToFit#FILL}. -->
<enum name="fitXY" value="1" />
<enum name="fitStart" value="2" />
<enum name="fitCenter" value="3" />
<enum name="fitEnd" value="4" />
<enum name="center" value="5" />
<enum name="centerCrop" value="6" />
<enum name="centerInside" value="7" />
</attr>
- matrix ( value="0" ):
不改变原图大小,将图片放在 ImageView 的左上角。这意味着图像将不会缩放或裁剪,而是按照原图大小显示在视图的左上角。
- fitXY ( value="1" ):
使用 Matrix.ScaleToFit 方法缩放图像。这会缩放图像以适应 ImageView 的边界,同时保持图像的宽高比。
- fitStart ( value="2" ):
保持图像的宽高比不变,直到较长的边与 ImageView 控件的边长相等,然后缩放。完成后将图像放置于 ImageView 的左上。
- fitCenter ( value="3" ):
与 fitStart 类似,但缩放完成后将图像放置于中间。
- fitEnd ( value="4" ):
与 fitStart 类似,但缩放完成后将图像放置于右下角。
- center ( value="5" ):
不改变原图大小。如果原图小于 ImageView 的大小,则保持原图大小,显示在 ImageView的中心。当原图大于 ImageView 的大小时,只保留原图中间的部分,其他部分裁剪掉。
- Crop ( value="6" ):
保持图像宽高比不变缩放图像,直到完全覆盖 ImageView ,图像要在 ImageView 中居中。可能会出现图像显示不完整的情况。
- centerInside ( value="7" ):
当原图大于 ImageView 时,效果和 fitCenter 一样。当原图小于 ImageView 时,不会像fitCenter 那样将图像放大到与 ImageView 边长相等。
1.4.2.3maxHeight最大高度maxWidth最大宽度调整View****的界限
maxHeight和maxWidth
maxHeight:定义视图的最大高度。如果视图的内容高度超过了这个值,它将不会显示超出这个
高度限制。
maxWidth:定义视图的最大宽度。如果视图的内容宽度超过了这个值,它将不会显示超出这个宽
度限制。
1.5ProgressBar控件(进度条)
进度条在我们软件设计的UI的设计中是非常常见的一个控件,我们通常在等待服务器响应,网页跳转, 甚至游戏都有它的身影,这个等待的时候如果没有进度条,我们有时候会以为手机死机了,进度条可以很清晰的了解进度的详情。下面,我们来看他的基本代码:
1.5.1****进度条的基本知识
java代码:
android:indeterminate:指定是否为不确定型进度条。取值为true表示不确定型,取值为false表示确定型。
android:max:设定进度条的最大值,默认为100。通过该属性可以设置进度条的整体范围。
android:progress:设置当前的进度值。默认为0,表示进度条的初始状态。
android:secondaryProgress:设置次要进度的值,用于双重进度条的情况。默认为0。
android:minWidth:设定进度条的最小宽度。
android:minHeight:设定进度条的最小高度。
android:progressDrawable:设置自定义的进度条样式。可以指定一个.drawable类型的资源文件作为进度条的背景样式。
android:indeterminateDrawable:设置自定义的不确定型进度条样式。可以指定一个.drawable类型的资源文件作为不确定型进度条的背景样式。
android:indeterminateDuration:设置不确定型进度条动画的循环周期时长,默认为2700毫秒。
android:indeterminateOnly:当设定了indeterminate为true时,通过该属性可以指定进度条只显示 不确定样式,而不显示具体进度。
XML代码:
getMax():返回这个进度条的范围的上限;
getProgress():返回进度;
getSecondaryProgress():返回次要进度;
incrementProgressBy(int diff):指定增加的进度;
isIndeterminate():指示进度条是否在不确定模式下;
setIndeterminate(boolean indeterminate):设置不确定模式下;
1.5.2****进度条实机代码演示
进度条一般分为圆形和直线形,我们来看下圆形的代码:
XML
<ProgressBar
style="@android:style/Widget.ProgressBar.Small"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<ProgressBar
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<ProgressBar
style="@android:style/Widget.ProgressBar.Large"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
这上面的三种进度条分别代表了小中大号的圆形进度条,搭配的Java语言写一下,看下面代码:
java
import android.os.Bundle;
import android.widget.ProgressBar;
import androidx.appcompat.app.AppCompatActivity;
public class MainActivity extends AppCompatActivity {
private ProgressBar progressBarSmall;
private ProgressBar progressBarDefault;
private ProgressBar progressBarLarge;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); // 加载布局文件
// 获取 ProgressBar 控件
progressBarSmall = findViewById(R.id.progressBarSmall);
progressBarDefault = findViewById(R.id.progressBarDefault);
progressBarLarge = findViewById(R.id.progressBarLarge);
// 控制 ProgressBar
progressBarSmall.setVisibility(ProgressBar.VISIBLE); // 显示小进度条
progressBarDefault.setProgress(50); // 设置默认进度条的进度
}
}
1.5.2.2****直线进度条制作
XML
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="16dp">
<!-- 确定的进度条 -->
<ProgressBar
android:id="@+id/determinateProgressBar"
style="@android:style/Widget.ProgressBar.Horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:max="100"
android:progress="18" />
<!-- 不确定的进度条 -->
<ProgressBar
android:id="@+id/indeterminateProgressBar"
style="@android:style/Widget.ProgressBar.Horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:indeterminate="true" />
</LinearLayout>
我们可以看到,这里设置了两个不同的直线形进度条,直线进度条和圆形进度条不一样,上面两个进度条的区别不在于大小,而是在于进度条是否确定,接下来我们详细看一下区别:
XML
<!-- 确定的进度条 -->
<ProgressBar
android:id="@+id/determinateProgressBar"
style="@android:style/Widget.ProgressBar.Horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:max="100"
android:progress="18" />
android:max="100" :设置进度条的最大值为 100。
android:progress="18" :设置当前进度为 18,表示任务完成了 18%。
进度条会显示一个具体的进度值,用户可以清楚地看到任务完成了多少。
适用于可以明确知道任务进度的场景,例如文件下载、数据加载等。
XML
<!-- 不确定的进度条 -->
<ProgressBar
android:id="@+id/indeterminateProgressBar"
style="@android:style/Widget.ProgressBar.Horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:indeterminate="true" />
android:indeterminate="true" :设置为不确定进度条,表示任务的进度无法确定。
进度条会显示一个动画效果(通常是循环滚动的效果),表示任务正在进行中,但无法知道具体的 进度。
适用于无法明确知道任务进度的场景,例如网络请求、后台处理等。
总结:
确定进度条:显示具体的进度值,适用于可以明确知道任务进度的场景。
不确定进度条:显示动画效果,适用于无法明确知道任务进度的场景
下面是需要关联的Java代码:
java
import android.os.Bundle;
import android.os.Handler;
import android.widget.ProgressBar;
import androidx.appcompat.app.AppCompatActivity;
public class MainActivity extends AppCompatActivity {
private ProgressBar determinateProgressBar;
private ProgressBar indeterminateProgressBar;
private Handler handler = new Handler();
private int progressStatus = 0; // 当前进度值
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); // 关联 XML 布局文件
// 初始化控件
determinateProgressBar = findViewById(R.id.determinateProgressBar);
indeterminateProgressBar = findViewById(R.id.indeterminateProgressBar);
// 启动一个后台线程模拟进度更新
new Thread(new Runnable() {
@Override
public void run() {
while (progressStatus < 100) {
progressStatus += 1; // 每次增加 1
// 在主线程更新 UI
handler.post(new Runnable() {
@Override
public void run() {
determinateProgressBar.setProgress(progressStatus);
}
});
try {
Thread.sleep(100); // 模拟延迟
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// 进度完成后,隐藏不确定的进度条
handler.post(new Runnable() {
@Override
public void run() {
indeterminateProgressBar.setVisibility(ProgressBar.GONE);
}
});
}
}).start();
}
}
1.6AlertDialog****控件(对话框)
AlertDialog可以在当前界面弹出一个对话框,这个对话框是置顶于所有界面元素之上的,能够屏蔽其他控件的交互能力,因此AlertDialog 般 于提示一 些非常重要的内容或者警告信息。比如为了防止用户误删重要内容,在删除前弹出一个确认对话框
下面,我们来看一下代码知识吧:
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="wrap_content"
android:orientation="vertical"
android:padding="16dp">
<TextView
android:id="@+id/tv_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="请输入内容"
android:textSize="18sp"/>
<EditText
android:id="@+id/et_input"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="输入提示"/>
</LinearLayout>
现在,我们设置一下三种不同的对话框:
1.6.1****基础对话框
特点
组成:标题 + 消息 + 按钮(最多 3 个)。
交互:用户仅能通过按钮(确定、取消等)响应操作。
布局:系统默认样式,无需自定义 XML。
适用场景
确认操作(如删除、退出)。
提示简单信息(如成功/失败消息)。
java
// 创建基础对话框
new AlertDialog.Builder(MainActivity.this)
.setTitle("提示")
.setMessage("确定要删除吗?")
.setPositiveButton("确定", (dialog, which) -> {
// 确认操作
})
.setNegativeButton("取消", null)
.show();
1.6.2****列表对话框
特点
组成:标题 + 列表项(普通、单选或多选)。
交互:用户通过点击列表项触发操作。
类型:
普通列表:点击后直接触发操作(如选择来源)。
单选列表:选中一项并确认(如设置选项)。
多选列表:选中多项后确认(如批量删除)。
适用场景
从预定义选项中选择一个(如拍照、相册)。
需要用户确认选择的场景(如单选设置项)。
批量操作(如多选删除文件)。
1.6.2.1****普通列表
java
String[] items = {"拍照", "相册", "文件"};
new AlertDialog.Builder(this)
.setTitle("选择来源")
.setItems(items, (dialog, which) -> {
// which 是点击项的索引
})
.show();
1.6.2.2****单选列
java
int checkedItem = 0; // 默认选中项索引
new AlertDialog.Builder(this)
.setSingleChoiceItems(items, checkedItem, (dialog, which) -> {
// 选中项逻辑
dialog.dismiss(); // 自动关闭对话框
})
.show();
1.6.2.3****多选列表
java
boolean[] checkedItems = {true, false, false}; // 初始选中状态
new AlertDialog.Builder(this)
.setMultiChoiceItems(items, checkedItems, (dialog, which, isChecked) -> {
// isChecked 表示当前项的选中状态
})
.setPositiveButton("确认", (dialog, which) -> {
// 处理最终选中项
})
.show();
1.6.3****自定义对话框
特点
组成:完全自定义的布局(XML 定义),可包含任意控件。
交互:自由定义输入、按钮、复杂控件等。
灵活性:适合需要扩展功能的场景。
适用场景
用户输入(如填写表单、输入文本)。
复杂交互(如日期选择、评分控件)。
需要个性化样式的对话框。
java
// 加载自定义布局
View view = getLayoutInflater().inflate(R.layout.dialog_login, null);
EditText etUsername = view.findViewById(R.id.et_username);
EditText etPassword = view.findViewById(R.id.et_password);
new AlertDialog.Builder(this)
.setView(view) // 绑定自定义布局
.setPositiveButton("登录", (dialog, which) -> {
String username = etUsername.getText().toString();
String password = etPassword.getText().toString();
// 处理登录逻辑
})
.setNegativeButton("取消", null)
.show();
三者的核心区别
|----------------|-------------|-------------|----------------|
| 特性 | 基础对话框 | 列表对话框 | 自定义对话框 |
| 布局复杂 度 | 简单(系统默认样 式) | 中等(列表项) | 高(完全自定义 XML ) |
| 交互方式 | 按钮点击 | 列表项点击或选择 | 自由定义(输入、按钮等) |
| 适用场景 | 简单确认 / 提示 | 选择预定义选项 | 复杂输入或个性化需求 |
| 代码复杂 度 | 低 | 中(需处理选中逻 辑) | 高(需绑定控件和事件处 理) |
1.6.4****对话框关键代码说明
|----------------------|----------------------------|
| 方法 / 参数 | 作用 |
| setTitle() | 设置对话框标题 |
| setMessage() | 设置对话框消息内容 |
| setIcon() | 设置标题栏图标(可选) |
| setPositiveButton() | 确认按钮(如 " 确定 "" 提交 " ) |
| setNegativeButton() | 取消按钮(如 " 取消 "" 关闭 " ) |
| setNeutralButton() | 中性按钮(如 " 稍后提醒 " ) |
| setCancelable(false) | 禁止用户点击外部或返回键关闭对话框 |
| setView() | 绑定自定义布局或控件(如 ProgressBar ) |
二**.ListView****控件**
**2.1.**核心组成部分
ListView :负责显示垂直滚动列表的容器。
Adapter :桥梁,将数据绑定到 ListView 的每一项。
常用Adapter类型:
ArrayAdapter :适用于简单文本列表。
SimpleAdapter :支持多控件绑定(如文本 + 图片)。
BaseAdapter :完全自定义列表项(最灵活)。
CursorAdapter :用于数据库查询结果。
2.2**、基本代码示例**
2.2.1.****使用ArrayAdapter (简单文本列表)
java 复制
java
// 数据源
List<String> data = Arrays.asList("Item 1", "Item 2", "Item 3");
// 创建 Adapter(使用系统预定义布局)
ArrayAdapter<String> adapter = new ArrayAdapter<>(
this,
android.R.layout.simple_list_item_1, // 列表项布局
data
);
// 绑定到 ListView
ListView listView = findViewById(R.id.list_view);
listView.setAdapter(adapter);
2.2.2.****使用BaseAdapter (自定义列表项)
自定义****Adapter
java 复制
java
public class CustomAdapter extends BaseAdapter {
private List<Item> data;
private LayoutInflater inflater;
public CustomAdapter(Context context, List<Item> data) {
this.data = data;
inflater = LayoutInflater.from(context);
}
@Override
public int getCount() {
return data.size();
}
@Override
public Object getItem(int position) {
return data.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
// 1. 加载布局文件
convertView = inflater.inflate(R.layout.list_item, parent, false);
// 2. 初始化 ViewHolder
holder = new ViewHolder();
holder.textView = convertView.findViewById(R.id.tv_item);
convertView.setTag(holder);
} else {
// 3. 复用 ViewHolder
holder = (ViewHolder) convertView.getTag();
}
// 4. 绑定数据
Item item = data.get(position);
holder.textView.setText(item.getTitle());
return convertView;
}
static class ViewHolder {
TextView textView;
}
}
2.3**、核心优化技巧**
2.3.1. ViewHolder****模式
作用:减少 findViewById() 的调用次数,提升性能。
实现:在 getView() 中复用 convertView ,并通过 ViewHolder 缓存控件引用。
**2.3.2.**分页加载(Pagination)
适用场景:数据量极大时,分批加载数据。
实现:
-
监听 ListView 的 OnScrollListener 。
-
当滚动到底部时,加载下一页数据。
-
更新 Adapter 并调用 notifyDataSetChanged() 。