UI 用户界面(User Interface,简称 UI,亦称使用者界面)是系统和用户之间进行交互和信息交换 的媒介,它实现信息的内部形式与人类可以接受形式之间的转换。
软件设计可分为两个部分:编码设计与UI设计。
Android UI
Android应用界面包含用户可查看并与之交互的所有内容。
Android 提供丰富多样的预置 UI 组 件,例如结构化布局对象和 UI 控件,您可以利用这些组件为您的应用构建图形界面。Android 还 提供其他界面模块,用于构建特殊界面,例如对话框、通知和菜单。
Android UI 都是由布局和控件组成的
布局
布局(layout)可定义应用中的界面结构(例如 Activity 的界面结构)。布局中的所有元素均使用 View 和 ViewGroup 对象的层次结构进行构建。View 通常绘制用户可查看并进行交互的内容。然而, ViewGroup 是不可见容器,用于定义 View 和其他 ViewGroup 对象的布局结构。
布局的结构
定义界面布局的视图层次结构图示
View 对象通常称为“微件”,可以是众多子类之一,例如
Button 或 LinearLayout 或 TextView 。 ViewGroup 对象通常称为“布局”,可以是提供其他布局结构的众多类型之一,例如 ConstraintLayout 。
声明布局
在 XML 中声明界面元素,Android 提供对应 View 类及其子类的简明 XML 词汇,如用于微件和布
局的词汇。 您也可使用 Android Studio 的 Layout Editor,并采用拖放界面来构建 XML 布局。
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
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="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
在运行时实例化布局元素。您的应用可通过编程创建 View 对象和 ViewGroup 对象(并操纵其属性)。
ConstraintLayout constraintLayout = new ConstraintLayout(this);
TextView view = new TextView(this);
view.setText("Hello World!");
constraintLayout.addView(view);
* 提示 : 使用 Layout Inspector 调试布局,可以查看通过代码创建的布局
- 在连接的设备或模拟器上[运行您的应用]。
- 依次点击 Tools > Layout Inspector。
- 在显示的 Choose Process 对话框中,选择要检查的应用进程,然后点击 OK。
编写XML
利用 Android 的 XML 词汇,按照在 HTML 中创建包含一系列嵌套元素的网页的相同方式快速设计
UI 布局及其包含的屏幕元素 每个布局文件都必须只包含一个根元素,并且该元素必须是视图对象或 ViewGroup 对象
定义根元素后,可以子元素的形式添加其他布局对象或控件,从而逐步构建定义布局的视图层次结 构
在 XML 中声明布局后,以 .xml 扩展名将文件保存在Android 项目的 res/layout/ 目录中
<?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" >
<TextView android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello, I am a TextView" />
<Button android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello, I am a Button" />
</LinearLayout>
加载 XML 资源
当编译应用时,系统会将每个 XML 布局文件编译成 View 资源。在 Activity.onCreate() 回调 内,通过调用 setContentView(),并以 R.layout.*layout_file_name* 形式向应用代码传 递布局资源的引用 ,加载应用代码中的布局资源。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
属性
每个 View 对象和 ViewGroup 对象均支持自己的各种 XML 属性。某些属性是 View 对象的特有
属性(例如,TextView 支持 textSize 属性),但可扩展此类的任一 View 对象也会继承这些属 性。某些属性是所有 View 对象的共有属性,因为它们继承自 View 根类(例如 id 属性)。此 外,其他属性被视为“布局参数”,即描述 View 对象特定布局方向的属性,如由该对象的父 ViewGroup 对象定义的属性。
<TextView
android:id="@+id/tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
android:textSize="24sp"/>
<Button
android:id="@+id/btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="按钮"/>
ID
任何 View 对象均可拥有与之关联的整型 ID,用于在结构树中对 View 对象进行唯一标识。编译应
用后,系统会以整型形式引用此 ID,但在布局 XML 文件中,系统通常会以字符串的形式在 id 属性中指定该 ID。这是所有 View 对象共有的 XML 属性(由 View 类定义),并且您会经常使 用该属性。
XML 标记内部的 ID 语法是:
android:id="@+id/tv"
字符串开头处的 @ 符号指示 XML 解析器应解析并展开 ID 字符串的其余部分,并将其标识为 ID 资
源。加号 (+) 表示这是一个新的资源名称,必须创建该名称并将其添加到我们的资源(在 R.java 文件中)内。Android 框架还提供许多其他 ID 资源。引用 Android 资源 ID 时,不需要加号,但 必须添加 android 软件包命名空间
android:id="@android:id/empty"
添加 android 软件包命名空间后,我们现在将从 R.java 文件
tips: @+id 和 @id区别:
其实@+id就是在R.java文件里新增一个id名称,如果之前已经存在相同的id名称,那么会覆盖之 前的名称。而@id则是直接引用R.java文件的存在的id资源,如果不存在,会编译报错。 注意: ID 字符串名称,在同一布局中必须是唯一的,不能重名,不同布局中可以同名; 通过ID值创建我们视图对象的实例
<TextView
android:id="@+id/tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
android:textSize="24sp"/>
TextView textView = (TextView) findViewById(R.id.tv);
布局参数 LayoutParams
layout_*** 的布局属性
<TextView
android:layout_width="100dp"
android:layout_height="200dp"
android:layout_marginLeft="10dp" //左边距
android:layout_marginTop="10dp" //上边距
android:text="Hello World!" />
布局参数作用是给我们的视图设定在布局中位置和大小
ViewGroup 类会实现一个扩展 ViewGroup.LayoutParams 的嵌套类,里面包含一些设置视图 view 的尺寸和位置的属性。 视图层次结构图,包含每个视图关联的布局参数:
TextView tv = new TextView(this);
LinearLayout linearLayout = new LinearLayout(this);
LinearLayout.LayoutParams layoutParams =
(LinearLayout.LayoutParams)tv.getLayoutParams();
layoutParams.leftMargin = 30; //左边距
layoutParams.topMargin = 30;//上边距
layoutParams.width = 100;//宽
layoutParams.height = 200;//高
tv.setLayoutParams(layoutParams);
linearLayout.addView(tv);
一般而言,建议不要使用绝对单位(如像素)来指定布局宽度和高度。更好的方法是使用相对测量
单位(如与密度无关的像素单位 (dp) 、 wrap_content 或 保您的应用在各类尺寸的设备屏幕上正确显示。 match_parent ),因为其有助于确
wrap_content 指示您的视图将其大小调整为内容所需的尺寸。
match_parent 指示您的视图尽可能采用其父视图组所允许的最大尺寸。
布局位置
视图可以通过调用 getLeft() 方法和 getTop() 方法来获取视图的坐标位置 ,也可以通过 getWidth() 和 getHeight() 获取视图的尺寸,这些方法返回的值是相对于其父视图的位置。
位置和尺寸的单位是像素(px)
px 与 dp 区别 px 即像素,1px代表屏幕上一个物理的像素点; 给视图设置px单位,不同分辨率下,尺寸不一样
dp (dip) Density independent pixels ,设备无关像素。它与“像素密度”密切相关 ;
dpi像素密度: 每英寸包含的像素数 假设有一部手机,屏幕的物理尺寸为1.5英寸x2英寸,屏幕分辨率为240x320,则我们 可以计算出在这部手机的屏幕上,每英寸包含的像素点的数量为240/1.5=160dpi(横 向)或320/2=160dpi(纵向),160dpi就是这部手机的像素密度,像素密度的单位 dpi是Dots Per Inch的缩写,即每英寸像素数量
内边距和外边距
常用布局
线性布局 - LinearLayout
LinearLayout 是一个视图容器,用于使所有子视图在单个方向(垂直或水平)保持对齐。您可 使用 android:orientation 属性指定布局方向。 android:orientation="horizontal"
android:orientatinotallow="vertical"
布局权重
android:layout_weight 通过给子视图设置权重值,来分配子视图所占空间的权重(比例),如图三个子视图权重分别设置 为1,均分页面空间
相对布局 - RelativeLayout
相对布局 :子视图可通过相应的布局属性,设定相对于另一个兄弟视图或父视图容器的相对位置
属性说明: 相对于兄弟元素
相对于父元素
对齐方式
间隔
父容器定位属性示意图
根据兄弟组件定位
帧布局 - FrameLayout
最简单的一种布局,没有任何定位方式,当我们往里面添加控件的时候,会默认把他们放到这块区
域的左上角,帧布局的大小由控件中最大的子控件决定,如果控件的大小一样大的话,那么同一时 刻就只能看到最上面的那个组件,后续添加的控件会覆盖前一个
网格布局 GridLayout
属性说明:
常用组件
## TextView
TextView 是用于显示文本内容的基本组件,具有多种属性可以用来控制文本的外观、样式和行为。
常用属性
属性
说明
android:text
设置TextView显示的文本内容。可以通过字符串资源或直接在布局文件中设置
android:textColor
设置文本的颜色。可以使用颜色代码或颜色资源
android:textSize
设置文本的大小。常用单位有sp和dp
android:textStyle
设置文本的风格。可选值有normal(正常)、bold(粗体)或italic(斜体)
android:textAlignment
设置文本的对齐方式。可选值有left、center、right、viewStart、viewEnd等
android:maxLines
设置TextView的最大行数。如果文本内容超过这个行数,将进行省略或滚动显示
android:ellipsize
设置当文本内容过长时,省略号的显示方式。可选值有start、end、middle、marquee
android:scrollHorizontally
设置是否允许文本水平滚动。如果设置为true,并且文本内容超出TextView的宽度,则文本将水平滚动显示
android:drawableLeft
在TextView的左侧显示一个Drawable
android:drawableTop
在TextView的上方显示一个Drawable
android:drawableRight
在TextView的右侧显示一个Drawable
android:drawableBottom
在TextView的下方显示一个Drawable
android:drawablePadding
设置文本与Drawable之间的间距
android:visibility
设置TextView的可见性。可选值有visible、invisible、gone
android:clickable
设置TextView是否可点击
android:focusable
设置TextView是否可获得焦点
常用方法
setText():设置TextView显示的文本内容。
setTextSize():设置TextView中文本的大小。
setTextColor():设置TextView中文本的颜色。
setBackgroundColor():设置TextView的背景颜色。
setPadding():设置TextView的内边距。
setGravity():设置TextView中文本的对齐方式。
setMaxLines():设置TextView的最大显示行数。
setEllipsize():设置当文本内容超出TextView显示范围时,用省略号代替的方式。
setMovementMethod():设置TextView的文本移动方式,如实现跑马灯效果。
setEnabled():设置TextView是否可用。
setClickable():设置TextView是否可点击。
setOnClickListener():为TextView设置点击事件监听器。
2.Button
Button 是一种常用的用户界面组件,用于响应用户的点击操作。它继承自TextView ,因此拥有 TextView 的所有文本属性,同时还具有一些按钮特有的属性和方法。
常用属性
属性
说明
background
按钮的背景
drawableLeft
按钮左侧的图标
drawableTop
按钮顶部的图标(某些框架支持)
drawableRight
按钮右侧的图标
drawableBottom
按钮底部的图标(某些框架支持)
enabled
按钮是否可用
visible
按钮是否可见
clickable
按钮是否可点击
focusable
按钮是否可获得焦点
常用方法
setId(): 设置按钮的唯一标识符。
setText(): 设置按钮上显示的文本。
setTextColor(): 设置按钮上文本的颜色。
setBackground(): 设置按钮的背景。
setBackgroundColor(): 设置按钮的背景颜色。
setEnabled(): 设置按钮是否可用。
setVisibility(): 设置按钮的可见性(VISIBLE、INVISIBLE、GONE)。
setPadding(): 设置按钮的内边距。
isEnabled(): 检查按钮是否可用。
isVisible(): 检查按钮是否可见。
getId(): 获取按钮的唯一标识符。
performClick(): 触发按钮的点击事件,即使按钮没有被用户实际点击。
点击事件:在Activity或Fragment中给按钮对象注册点击监听器setOnClickListener()。点击监听器需要实现接口View.OnClickListener,并重写onClick方法处理按钮点击后的逻辑。
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private Button myButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myButton = findViewById(R.id.my_button);
myButton.setOnClickListener(this);
}
@Override
public void onClick(View v) {
if (v == myButton) {
// 按钮点击后的逻辑
Toast.makeText(this, "按钮被点击了", Toast.LENGTH_SHORT).show();
}
}
}
长按事件:在Activity或Fragment中给按钮对象注册长按监听器setOnLongClickListener()。长按监听器需要实现长按接口View.OnLongClickListener,并重写长按方法onLongClick处理按钮长按后的逻辑。
3.CheckBox
在Android体系中,CompoundButton类是抽象的复合按钮,因为是抽象类,所以它不能直接使用。实际开发中用的是CompoundButton的几个派生类,主要有复选框CheckBox、单选按钮RadioButton以及开关按钮Switch,这些派生类均可使用CompoundButton的属性和方法。加之CompoundButton本身继承了Button类,故以上几种按钮同时具备Button的属性和方法。它们之间的继承关系如图:
CheckBox是 CompoundButton 一个最简单的实现控件,点击复选框将它勾选,再次点击取消勾选。
常用属性
属性
说明
name
复选框的名称,用于在表单中标识该复选框
checked
表示复选框是否被选中
disabled
表示复选框是否被禁用
value
表示复选框的值,提交表单时传递给服务器的值
常用方法
setChecked(): 设置 CheckBox 的选中状态。
isChecked(): 检查 CheckBox 是否选中。
勾选事件:在Activity或Fragment中给复选框对象注册勾选监听setOnCheckedChangeListener()。勾选监听器需要实现接口CompoundButton.OnCheckedChangeListener,并重写onCheckedChanged方法处理勾选状态改变后的逻辑。
public class MainActivity extends AppCompatActivity implements CompoundButton.OnCheckedChangeListener {
private CheckBox checkBox;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
checkBox = findViewById(R.id.checkBox);
checkBox.setText("同意条款和条件");
checkBox.setChecked(false); // 初始化为未选中状态
checkBox.setOnCheckedChangeListener(this);
}
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
// 在这里处理选中状态的变化
if (isChecked) {
// 用户选中了CheckBox
} else {
// 用户取消了CheckBox的选中状态
}
}
}
4.Switch
Switch 是开关按钮,它像一个高级版本的 CheckBox ,在选中与取消选中时可展现的界面元素比复选框丰富。
常用属性
属性
说明
android:textOn
设置当 Switch 处于打开状态时要显示的文本
android:textOff
设置当 Switch 处于关闭状态时要显示的文本
android:thumb
设置 Switch 滑块(拇指)的图标
android:thumbTint
设置滑块(拇指)的颜色
android:track
设置 Switch 轨道的背景
android:trackTint
设置轨道的颜色
android:switchMinWidth
设置 Switch 的最小宽度
android:switchPadding
设置文本标签和滑块之间的间距
android:showText
是否在Switch 上显示文本标签(textOn 和 textOff)
android:enabled
设置 Switch 是否可用
android:clickable
设置 Switch 是否可以点击
5.RadioButton
RadioButton 通常与 RadioGroup 控件一起使用,同一组RadioButton都要放在同一个RadioGroup节点下,一组RadioButton中只能有一个可以被选中。
RadioGroup 常用属性
属性
说明
android:orientation
设置RadioGroup中子视图(RadioButton)的布局方向。默认为vertical(垂直)。
android:checkedButtonId
设置初始选中的RadioButton的ID。
RadioGroup 常用方法
check():根据提供的ID选中对应的RadioButton。
clearCheck():清除所有RadioButton的选中状态。
getCheckedRadioButtonId():获取当前被选中的RadioButton的ID。
选中事件:在Activity或Fragment中给复选框对象注册选中监听setOnCheckedChangeListener()。选中监听器需要实现接口RadioGroup.OnCheckedChangeListener,并重写onCheckedChanged方法处理选中项改变后的逻辑。
public class MainActivity extends AppCompatActivity implements RadioGroup.OnCheckedChangeListener {
private RadioGroup radioGroup;
private TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
radioGroup = findViewById(R.id.radioGroup);
textView = findViewById(R.id.textView);
radioGroup.setOnCheckedChangeListener(this);
}
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
// 获取被选中的RadioButton
RadioButton checkedButton = findViewById(checkedId);
// 更新TextView来显示选中的选项
if (checkedButton != null) {
textView.setText("Selected Option: " + checkedButton.getText());
} else {
// 如果没有RadioButton被选中,则可能调用了clearCheck()
textView.setText("Selected Option: None");
}
}
}
6.EditText
EditText 是一个常用的用户界面控件,用于接收用户输入的文本。它允许用户在应用程序中输入和编辑文本内容,并可以通过多种方式进行自定义和配置。
常用属性
属性
说明
android:hint
设置EditText的提示文字
android:inputType
设置EditText的输入类型
android:maxLines
设置最大显示行数
android:maxLength
设置最大输入长度
android:imeOptions
设置软键盘的行为选项
android:editable
设置EditText是否可编辑
android:capitalize
设置英文字母大写类型
android:cursorVisible
设定光标为显示或隐藏
android:singleLine
设置单行输入模式,文字不能自动换行
常用方法
setSelection():设置EditText的光标位置。
setError():设置错误提示信息,可以用于输入验证。
setFilters():设置输入过滤器,可以限制用户的输入。
焦点变更事件:在Activity或Fragment中给输入框对象注册焦点变更监听器setOnFocusChangeListener()。让活动页面实现接口 View.OnFocusChangeListener,并重写该接口定义的onFocusChange方法处理光标切换之后(获得光标和失去光标)的逻辑。
public class MainActivity extends AppCompatActivity implements View.OnFocusChangeListener{
private EditText editText;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 初始化EditText
editText = findViewById(R.id.editText);
// 注册焦点变更监听器
editText.setOnFocusChangeListener(this);
}
@Override
public void onFocusChange(View v, boolean hasFocus) {
if (v == editText) {
if (hasFocus) {
// EditText获得了焦点
editText.setHintTextColor(getResources().getColor(android.R.color.holo_blue_light));
} else {
// EditText失去了焦点
editText.setHintTextColor(getResources().getColor(android.R.color.holo_gray_light));
}
}
}
}
文本变更事件:在Activity或Fragment中给输入框对象注册文本监听器addTextChangedListener()。文本监听器需要实现接口TextWatcher,并重写该接口定义的beforeTextChanged、onTextChanged、afterTextChanged方法,这些方法分别用于在文本变化之前、文本变化时以及文本变化之后执行特定的逻辑。
public class MainActivity extends AppCompatActivity implements TextWatcher{
private EditText editText;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 初始化EditText
editText = findViewById(R.id.editText);
// 注册文本监听器
editText.addTextChangedListener(this);
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
// 在文本变化之前调用
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
// 在文本变化时调用
}
@Override
public void afterTextChanged(Editable s) {
// 在文本变化之后调用
// 注意:此处的s是变化后的文本
}
7.ImageView
ImageView 是一种常用的UI组件,用于显示图像或者其他可绘制的内容。它能够显示来自多种来源的图像,包括应用程序资源、本地文件、网络资源等。
常用属性
属性
说明
android:src
要显示的图片资源,可以是本地资源或网络图片
android:scaleType
图片的缩放类型,决定了图片如何适应ImageView的尺寸。常用值包括:center、centerCrop、centerInside、fitCenter、fitStart、fitEnd、fitXY、matrix等
android:adjustViewBounds
是否根据图片的宽高比自动调整ImageView的大小
android:tint
设置图片的着色颜色
android:maxHeight
设置ImageView的最大高度
android:maxWidth
设置ImageView的最大宽度
android:baselineAlignBottom
是否将基线与底部对齐,默认为false。当ImageView用作文字图标时,可以使用该属性控制对齐方式
android:contentDescription
用于辅助功能的描述文本,通常用于无障碍功能
常用方法
setImageResource():使用图片资源ID设置ImageView显示的图片。
setImageDrawable():使用Drawable对象设置ImageView显示的图片。
setImageBitmap():使用Bitmap位图设置ImageView显示的图片。
setImageURI():使用图片的URI设置ImageView显示的图片(注意:通常不直接用于加载网络图片,而是用于加载本地文件或内容提供者的图片)。
setScaleType():设置图片的缩放类型。
setAlpha():设置图片的透明度,范围从0(完全透明)到255(完全不透明)。
setColorFilter():为图片设置颜色过滤器,可以改变图片的颜色或应用特定的颜色效果。
8.ImageButton
ImageButton是可以显示图片的图像按钮。虽然ImageButton号称图像按钮,但它并非继承Button,而是继承自ImageView,所以拥有ImageView的所有属性和方法。同时ImageButton作为按钮,也具有按钮家族常用的点击事件和长按事件。
常用属性
属性
说明
android:src
要显示的图片资源,可以是本地资源
android:background
设置ImageButton的背景,可以是颜色值、图片资源或渐变等。
android:contentDescription
用于辅助功能的描述文本,通常用于无障碍功能,描述ImageButton的用途或功能
常用方法
setPadding():设置ImageButton内部的填充空间。
setBackground():设置ImageButton的背景。
setEnabled():设置ImageButton是否可用。
setOnClickListener():为ImageButton设置点击事件监听器。
9.ProgressBar
ProgressBar 是一种用于显示任务进度或操作状态的常见用户界面组件。
常用属性
属性
说明
android:max
设置进度条的最大值,默认为100
android:progress
设置进度条的当前进度值,必须在0到max之间
android:secondaryProgress
设置进度条的第二进度值,用于表示如缓冲进度等额外信息,必须在0到max之间
android:indeterminate
设置进度条是否处于不确定模式,即不显示具体进度,只显示一个循环动画。默认为false
android:style
设置进度条的样式,可以是attr/progressBarStyleHorizontal、attr/progressBarStyleLarge、attr/progressBarStyleSmall
android:visibility
设置控件的可见性,可以是visible、invisible或gone
常用方法
getMax():返回进度条的最大值。
getProgress():返回进度条的当前进度值。
getSecondProgress():返回进度条的第二进度值。
incrementProgressBy():将进度条的当前进度值增加指定的量。
isIndeterminate():判断进度条是否处于不确定模式。
setIndeterminate():设置进度条是否处于不确定模式。
setVisibility():设置进度条的可见性。
setProgress():设置进度条的当前进度值。
setSecondaryProgress():设置进度条的第二进度值。
10.AlertDialog
AlertDialog 是一个常用的对话框(Dialog)类型,用于显示重要信息、确认操作或者让用户进行选择。它提供了一个简单的界面,通常包含标题、消息内容、按钮等组件,可以方便地与用户进行交互。
创建
1.初始化 AlertDialog.Builder
AlertDialog.Builder builder = new AlertDialog.Builder(this);
2. 设置对话框属性
属性
说明
setTitle()
设置对话框的标题。
setIcon()
设置对话框的图标。
setMessage()
设置对话框中显示的消息文本。
setItems()
设置一个项目列表供用户选择,并为每个项目设置一个点击监听器。
setSingleChoiceItems()
设置一个单选列表供用户选择,并指定一个默认选中的项目和一个点击监听器。
setMultiChoiceItems()
设置一个多选列表供用户选择,并指定默认选中的项目和一个多选点击监听器。
setPositiveButton()
设置一个正面按钮,并为其设置一个点击监听器。
setNegativeButton()
设置一个负面按钮,并为其设置一个点击监听器。
setNeutralButton()
设置一个中性按钮,并为其设置一个点击监听器。
setCancelable()
设置对话框是否可以通过点击对话框外部或返回键来取消。
setCustomTitle()
使用自定义视图来设置对话框的标题。
setView()
在对话框中设置一个自定义的内容视图。
3.创建 AlertDialog 实例
AlertDialog dialog = builder.create();
显示
dialog.show();
常用方法
show():显示对话框。
cancel():取消对话框。
dismiss():关闭对话框。
isShowing():检查对话框是否正在显示。
getButton():获取对话框中的按钮。
getWindow():获取对话框的窗口。
setCanceledOnTouchOutside():设置对话框是否可以通过触摸对话框外部来取消。
setOnCancelListener():设置对话框被取消时的监听器。
setOnDismissListener():设置对话框关闭时的监听器。
setOnKeyListener():为对话框设置按键监听器,以处理特定的按键事件。
11.Spinner
Spinner是一个常用的用户界面组件,用于显示一个下拉列表,并允许用户从中选择一个项目。
常用属性
属性
说明
android:prompt
设置Spinner在选择前的提示文本
android:spinnerMode
设置Spinner的显示模式,可选值为"dropdown"(下拉框)或"dialog"(对话框)
android:entries
指定Spinner的数据集合,通常引用一个字符串数组资源
android:dropDownHorizontalOffset
当spinnerMode为"dropdown"时,设置下拉列表在水平方向相对于Spinner的偏移量
android:dropDownVerticalOffset
当spinnerMode为"dropdown"时,设置下拉列表在垂直方向相对于Spinner的偏移量
android:dropDownWidth
当spinnerMode为"dropdown"时,设置下拉列表的宽度
android:gravity
设置Spinner内部选中项的对齐方式
android:popupBackground
当spinnerMode为"dropdown"时,设置下拉列表的背景
常用方法
setAdapter():为Spinner设置数据适配器,用于提供下拉列表的数据
Spinner spinner = findViewById(R.id.spinner);
String[] options = {"选项1", "选项2", "选项3"};
ArrayAdapter<String> adapter = new ArrayAdapter<>(this, android.R.layout.spinner_item, options);
adapter.setDropDownViewResource(android.R.layout.spinner_layout);
spinner.setAdapter(adapter);
setOnItemSelectedListener():为Spinner设置选择监听器,用于响应用户的选择事件
setOnTouchListener() :为Spinner设置触屏监听器,用于处理触屏事件getItemAtPosition():获取Spinner下拉列表中指定位置的项
getCount():获取Spinner下拉列表中的项数
getSelectedItem():获取Spinner当前选中的项
getSelectedItemPosition() :获取Spinner当前选中项的位置
12.ListView(不常用)
ListView是Android中常用的一种视图控件,用于显示垂直滚动的项目列表。它允许用户滚动并选择列表中的项目,通常与适配器(Adapter)结合使用,以便将数据动态地加载到列表中。
常用属性
属性
说明
android:divider
设置列表项之间的分隔符。可以是一个颜色、图片等。
android:dividerHeight
设置分隔符的高度。通常与 android:divider 一起使用。
android:listSelector
设置列表项被选中时的背景。可以是一个颜色、选择器等。
常用方法
setAdapter():为 ListView 设置适配器。适配器用于将数据源转换为 ListView 可以显示的视图。
getAdapter():获取当前设置的适配器。
setOnItemClickListener():设置列表项的点击监听器。
setOnItemLongClickListener():设置列表项的长按监听器。
getCount():获取适配器中的数据项数量。
getItem():获取适配器中指定位置的数据项。
getItemId():获取适配器中指定位置数据项的ID。在默认情况下,这个ID是数据项在适配器中的位置(从0开始)。
13.RecycleView
RecyclerView 是 Android 支持库中提供的高级版本列表视图(List),用于替代传统的 ListView。它提供了更加灵活和强大的机制来展示大数据集合,支持水平和垂直滚动,以及自定义布局管理器来控制子视图的布局和排列。
常用方法
setAdapter():为RecyclerView设置适配器,用于绑定数据和视图。
setLayoutManager():为RecyclerView设置布局管理器,决定RecyclerView中项目的布局方式,如线性布局、网格布局等。
setHasFixedSize():如果RecyclerView的内容不会改变大小,可以设置此方法为true,以提高性能。
scrollToPosition():滚动到指定位置的项目。
smoothScrollToPosition():平滑滚动到指定位置的项目。
使用步骤
1.添加依赖:在项目的build.gradle文件中添加RecyclerView的依赖。
implementation 'androidx.recyclerview:recyclerview:版本号'
2.在XML布局文件中添加RecyclerView
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="8dp" />
3.在res/layout目录下创建一个新的XML布局文件,比如item_layout.xml,作为RecyclerView中每个项目的布局。
<?xml versinotallow="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="8dp">
<TextView
android:id="@+id/textView"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="Item"
android:textSize="18sp"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"/>
</androidx.constraintlayout.widget.ConstraintLayout>
4.创建数据适配器:创建一个继承自RecyclerView.Adapter<VH>的类,其中VH是自定义的ViewHolder类。在适配器中,需要重写以下三个方法:
onCreateViewHolder(ViewGroup parent, int viewType):用于创建ViewHolder实例。
onBindViewHolder(VH holder, int position):用于将数据绑定到ViewHolder上。
getItemCount():返回数据集合的大小。
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {
private List<String> dataList;
public MyAdapter(List<String> dataList) {
this.dataList = dataList;
}
@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_layout, parent, false);
return new MyViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
String item = dataList.get(position);
holder.textView.setText(item);
}
@Override
public int getItemCount() {
return dataList.size();
}
public static class MyViewHolder extends RecyclerView.ViewHolder {
TextView textView;
public MyViewHolder(@NonNull View itemView) {
super(itemView);
textView = itemView.findViewById(R.id.textView);
}
}
}
5.设置RecyclerView的适配器:在Activity或Fragment中找到RecyclerView控件,并为其设置适配器和布局管理器。
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
RecyclerView recyclerView = findViewById(R.id.recyclerView);
// 准备数据
List<String> dataList = new ArrayList<>();
for (int i = 0; i < 20; i++) {
dataList.add("Item " + (i + 1));
}
// 设置适配器
MyAdapter adapter = new MyAdapter(dataList);
recyclerView.setAdapter(adapter);
// 设置布局管理器
recyclerView.setLayoutManager(new LinearLayoutManager(this));
}
}
14.ViewPager
ViewPager 是 Android 开发中常用的一个控件,用于实现页面切换的效果,通常用于展示多个页面,用户可以通过滑动手势在这些页面之间进行切换。
常用方法
setAdapter():为 ViewPager 设置适配器。适配器用于将页面数据转换为 ViewPager 可以显示的视图。
getAdapter():获取当前设置的适配器。
setCurrentItem():设置当前显示的页面。
getCurrentItem():获取当前显示的页面的索引。
setOnPageChangeListener():设置页面变化监听器。
addOnPageChangeListener():向 ViewPager 添加一个页面变化监听器,而不替换现有的监听器。
removeOnPageChangeListener():从 ViewPager 中移除一个页面变化监听器。
setOffscreenPageLimit():设置 ViewPager 在内存中缓存的页面数量。getOffscreenPageLimit():获取 ViewPager 在内存中缓存的页面数量。
使用步骤
1.需要在布局文件中添加ViewPager控件。
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/main"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:cnotallow=".MainActivity">
<androidx.viewpager.widget.ViewPager
android:id="@+id/viewPager"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
2.创建一个适配器类,继承自PagerAdapter,并实现其必要的方法。
public class MyViewPagerAdapter extends PagerAdapter {
private List<View> mViews; // 用于存储页面的列表
public MyViewPagerAdapter(List<View> mViews) {
this.mViews = mViews;
}
@Override
public int getCount() {
return mViews.size(); // 返回页面的数量
}
@Override
public boolean isViewFromObject(@NonNull View view, @NonNull Object object) {
return view == object; // 判断视图是否与对象相同
}
@NonNull
@Override
public Object instantiateItem(@NonNull ViewGroup container, int position) {
container.addView(mViews.get(position)); // 将页面添加到容器中
return mViews.get(position); // 返回添加的页面
}
@Override
public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
container.removeView(mViews.get(position)); // 从容器中移除页面
}
}
3.在Activity中,需要获取ViewPager的实例,并为其设置适配器。同时,可以将要显示的页面添加到适配器中。
public class MainActivity extends AppCompatActivity {
private ViewPager viewPager;
private List<View> views; // 用于存储要显示的页面
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
viewPager = findViewById(R.id.viewPager);
// 初始化要显示的页面
views = new ArrayList<>();
LayoutInflater inflater = getLayoutInflater();
for (int i = 0; i < 3; i++) {
ImageView imageView = new ImageView(this);
imageView.setImageResource(R.drawable.your_image); // 设置图片资源
imageView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
views.add(imageView);
}
// 设置适配器
viewPager.setAdapter(new MyViewPagerAdapter(views));
}
}