目录
[① 简单提示对话框(带"确定"按钮)](#① 简单提示对话框(带“确定”按钮))
[② 带"是/否"的确认对话框](#② 带“是/否”的确认对话框)
[③ 带列表选项的对话框](#③ 带列表选项的对话框)
[④ 单选(RadioButton)对话框](#④ 单选(RadioButton)对话框)
[⑤ 多选(CheckBox)对话框](#⑤ 多选(CheckBox)对话框)
[① 修改布局文件------antivity_main.xml](#① 修改布局文件——antivity_main.xml)
[② 修改java文件------MainAntivity.java](#② 修改java文件——MainAntivity.java)
[① 修改布局文件------activity_main.xml](#① 修改布局文件——activity_main.xml)
[② 修改java文件------MainActivity.java](#② 修改java文件——MainActivity.java)
[🌟3、 测试实现效果](#🌟3、 测试实现效果)
[🎯四、demo3:实现"类似 ListView 的 AlertDialog"](#🎯四、demo3:实现“类似 ListView 的 AlertDialog”)
[① java文件](#① java文件)
[② 布局文件](#② 布局文件)
[① java文件------同上(只换方法,添加按钮)](#① java文件——同上(只换方法,添加按钮))
[② 布局文件------同上](#② 布局文件——同上)
[① java文件](#① java文件)
[② 布局文件](#② 布局文件)
[🧩① Fragment(碎片)------页面的"模块"](#🧩① Fragment(碎片)——页面的“模块”)
[🧩② ViewPager2------页面的"活动容器"](#🧩② ViewPager2——页面的“活动容器”)
[🧩③ TabLayout------页面的"导航栏"](#🧩③ TabLayout——页面的“导航栏”)
[🧩④ 整体协作流程](#🧩④ 整体协作流程)
[① 创建三个布局文件](#① 创建三个布局文件)
[🧩a:layout1.xml(首页 - 蓝色)](#🧩a:layout1.xml(首页 - 蓝色))
[🧩b:layout1.xml(设备 - 红色)](#🧩b:layout1.xml(设备 - 红色))
[🧩c:layout1.xml(首页 - 绿色)](#🧩c:layout1.xml(首页 - 绿色))
[② 创建三个fragment类](#② 创建三个fragment类)
[🧩a:创建 MyFragment1.java](#🧩a:创建 MyFragment1.java)
[🧩b:创建 MyFragment2.java](#🧩b:创建 MyFragment2.java)
[🧩c:创建 MyFragment3.java](#🧩c:创建 MyFragment3.java)
[③ 创建适配器 MyAdapter.java](#③ 创建适配器 MyAdapter.java)
[④ 主布局文件 activity_main.xml](#④ 主布局文件 activity_main.xml)
[⑤ 主 Activity 代码 MainActivity.java](#⑤ 主 Activity 代码 MainActivity.java)
[🧩测试长内容是否遮挡 TabLayout](#🧩测试长内容是否遮挡 TabLayout)
🎯一、认识安卓中的AlertDialog
AlertDialog是 Android 开发中常用的一种对话框(Dialog),用于向用户显示重要信息、请求确认或提供简单选项。它属于 androidx.appcompat.app.AlertDialog类
🌟1、基本特点
- 模态对话框:会阻塞用户与当前 Activity 的交互,直到用户做出响应。
- 可定制性强:支持设置标题、内容、图标、按钮(最多三个:positive、negative、neutral)。
- 轻量简洁:适合快速提示或确认操作,不适合复杂 UI。
🌟2、常见用法
① 简单提示对话框(带"确定"按钮)
java
new AlertDialog.Builder(context)
.setTitle("提示")
.setMessage("这是一条重要信息")
.setPositiveButton("确定",new DialogInterface.OnClickListener(){
@Override
public void onClick(DialogInterface dialog,int which){
Toast.makeText(MainActivity.this,"已确认",Toast.LENGTH_SHORT).show();
}
})
.show();
② 带"是/否"的确认对话框
java
new AlertDialog.Builder(context).
setTitle("确认操作")
.setMessage("是否删除此项目?")
.setPositiveButton("是",(dialog,which)->{
//执行删除操作
})
.setNegativeButton("否",null)
.show();
③ 带列表选项的对话框
java
String[] items={"选项1","选项2","选项2"};
new AlertDialog.Builder(context)
.setTitle("请选择")
.setItems(items, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
}
}).show();
④ 单选(RadioButton)对话框
java
String[] choives={"A","B","C"};
int checkedItem = 0;//默认选中项
new AlertDialog.Builder(context)
.setTitle("单选")
.setSingleChoiceItems(choives,checkedItem,((dialogInterface, i) -> {
dialogInterface.dismiss();
})).setNegativeButton("取消",null)
.show();
⑤ 多选(CheckBox)对话框
java
String[] items={"苹果","香蕉","橙子"};
boolean[] checked={true,false,false};//初始选中状态
new AlertDialog.Builder(context)
.setTitle("多选")
.setMultiChoiceItems(items,checked,((dialogInterface, i, b) -> {
})).setPositiveButton("确定",((dialogInterface, i) -> {
})).show();
🎯二、demo1:实现一个最简单的对话框demo
🌟1、实现逻辑
| 步骤 | 操作 |
|---|---|
| 1️⃣ | 在 XML 中给每个按钮加 android:onClick="onButtonClick" |
| 2️⃣ | 在 Java 中写 public void onButtonClick(View view) 方法 |
| 3️⃣ | 用 view.getId() 判断是哪个按钮 |
| 4️⃣ | 用 if-else 分别处理 |
🌟2、编写代码
① 修改布局文件------antivity_main.xml
XML
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
android:orientation="vertical"
tools:context=".MainActivity">
<Button
android:id="@+id/button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Button1" />
<Button
android:id="@+id/button2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="buttonClick"
android:text="Button2" />
<Button
android:id="@+id/button3"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="buttonClick"
android:text="Button3" />
<Button
android:id="@+id/button4"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="buttonClick"
android:text="Button4" />
</LinearLayout>
② 修改java文件------MainAntivity.java
java
package com.example.alertdialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
EdgeToEdge.enable(this);
setContentView(R.layout.activity_main);
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
return insets;
});
/*
demo1
*/
createAlertDialog();
private void createAlertDialog()
{
Dialog alertDialog = new AlertDialog.Builder(this).
setTitle("对话框的标题").
setMessage("对话框的内容").
setIcon(R.mipmap.ic_launcher).
create();
alertDialog.show();
}
public void buttonClick(View view)
{
//获取点击按钮ID
int id=view.getId();
//判断点击的是哪个按钮
if(id==R.id.button){
Toast.makeText(MainActivity.this, "你点击了第一个按钮", Toast.LENGTH_SHORT).show();
} else if (id==R.id.button2) {
Toast.makeText(MainActivity.this,"你点击了第二个按钮",Toast.LENGTH_SHORT).show();
} else if (id==R.id.button3) {
Toast.makeText(MainActivity.this,"你点击率第三个按钮",Toast.LENGTH_SHORT).show();
}else if (id==R.id.button4) {
Toast.makeText(MainActivity.this,"你点击率第四个按钮",Toast.LENGTH_SHORT).show();
}
}
}
🌟3、测试实现效果


🎯三、demo2:实现"确定删除?"对话框(带三个按钮)
🌟1、功能描述:
点击某个按钮后弹出一个对话框,包含:
-
标题:"确定删除?"
-
内容:"您确定删除该信息吗?"
-
三个按钮:
1、确定:执行删除操作
2、取消:关闭对话框
3、查看详情:显示详情
🌟2、编写代码
① 修改布局文件------activity_main.xml
XML
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
android:orientation="vertical"
tools:context=".MainActivity">
<Button
android:id="@+id/button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="buttonClick"
android:text="Button1" />
</LinearLayout>
② 修改java文件------MainActivity.java
java
package com.example.alertdialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
EdgeToEdge.enable(this);
setContentView(R.layout.activity_main);
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
return insets;
});
/*
* 1、找到按钮控件并设置点击事件
*/
Button btnShowDialog=findViewById(R.id.button);
btnShowDialog.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
/*
* 2、点击按钮时触发 showDeleteDialog() 方法
*/
showDeleteDialog();
}
});
}
/*
* 3、创建并显示对话框的方法即showDeleteDialog()方法的实现
*/
private void showDeleteDialog()
{
//创建AlerDialog.Builder对象,用于构建对话框
AlertDialog.Builder builder=new AlertDialog.Builder(this);
//设置对话框标题
builder.setTitle("确定删除?");
//设置对话框内容
builder.setMessage("您确定要删除该条信息吗?");
//设置图标
builder.setIcon(R.mipmap.ic_launcher);
//① 设置"确定"按钮并设置触达点击事件
builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
//当用户点击确定时,执行删除逻辑
Toast.makeText(MainActivity.this, "删除成功!", Toast.LENGTH_SHORT).show();
}
});
//② 设置"取消"按钮并设置触发点击事件
builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
//当用户点击取消按钮时,关闭弹框
Toast.makeText(MainActivity.this, "已取消删除", Toast.LENGTH_SHORT).show();
dialogInterface.dismiss();//关闭对话框
}
});
//③ 设置"查看详情页"按钮并设置触发点击事件
builder.setNeutralButton("查看详情页", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
//当用户点击"查看详情页"按钮时,执行查看详情页逻辑
Toast.makeText(MainActivity.this,"正在查看详情信息...",Toast.LENGTH_SHORT).show();
}
});
//创建对话框对象
AlertDialog alertDialog=builder.create();
//显示对话框
alertDialog.show();
}
}
| 代码 | 作用 |
|---|---|
new AlertDialog.Builder(this) |
创建一个对话框构建器,this 是当前 Activity |
.setTitle("...") |
设置标题文字 |
.setMessage("...") |
设置内容文字 |
.setIcon(...) |
设置图标(这里用的是应用图标) |
.setPositiveButton(...) |
设置"确定"按钮,点击后触发回调 |
.setNegativeButton(...) |
设置"取消"按钮 |
.setNeutralButton(...) |
设置"中性"按钮(如"查看详情") |
dialogInterface dialog, int which |
回调参数:dialog 是对话框对象,which 是按钮类型 |
dialog.dismiss() |
手动关闭对话框 |
.create() |
构建对话框对象 |
.show() |
显示对话框 |
| [注解说明] |
🌟3、 测试实现效果




🎯四、demo3:实现"类似 ListView 的 AlertDialog"
🌟1、功能目标
- 弹出一个对话框,显示四个水果选项(苹果、橘子、草莓、香蕉),点击任意一个水果会弹出提示信息"你喜欢吃苹果",底部有一个"取消按钮",点击关闭对话框
🌟2、功能实现逻辑

🌟3、编写代码
① java文件
java
package com.example.alertdialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.provider.AlarmClock;
import android.view.View;
import android.view.accessibility.AccessibilityManager;
import android.widget.Button;
import android.widget.Toast;
import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;
public class MainActivity extends AppCompatActivity {
/*
* 1、定义一个字符串数组,存储要显示的水果名称
*/
final String[] arrayFruit={"苹果","橘子","草莓","香蕉"};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
EdgeToEdge.enable(this);
setContentView(R.layout.activity_main);
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
return insets;
});
/*
* 2、找到按钮控件并绑定点击事件
*/
Button btnshowListDialog=findViewById(R.id.btnshowListDialog);
btnshowListDialog.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//点击这个测试按钮时触发 showFruitListDialog();方法
showFruitListDialog();
}
});
}
/*
* 2、实现showFruitListDialog();
* 创建显示"水果列表"对话框的方法
*/
private void showFruitListDialog() {
//① 创建AlertDialog构建器对象,this表示当前的Activity
AlertDialog.Builder builder = new AlertDialog.Builder(this);
//② 设置对话框标题
builder.setTitle("你喜欢吃哪种水果?")
//③ 设置图标
.setIcon(R.mipmap.ic_launcher)
/*
* ④ 使用setItems()方法添加列表并触发点击事件
* 参数1:arrayFruit表示要显示的数据数组
* 参数2:点击某个项时触发的事件
*/
.setItems(arrayFruit, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
/*
* which 是用户点击的项目的索引
*/
//获取水果名称
String selectedFruit = arrayFruit[which];
//弹出提示信息
Toast.makeText(MainActivity.this, "你喜欢吃" + selectedFruit, Toast.LENGTH_SHORT).show();
//点击后自动关闭
// dialog.dismiss();
}
});
//创建对话框对象
AlertDialog alertDialog=builder.create();
//显示对话框
alertDialog.show();
}
}
② 布局文件
XML
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
android:orientation="vertical"
tools:context=".MainActivity">
<Button
android:id="@+id/btnshowListDialog"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="请选择水果" />
<!--
<Button
android:id="@+id/button2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="buttonClick"
android:text="Button2" />
<Button
android:id="@+id/button3"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="buttonClick"
android:text="Button3" />
<Button
android:id="@+id/button4"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="buttonClick"
android:text="Button4" />
-->
</LinearLayout>
🌟4、测试
| 测试项 | 操作 | 预期结果 | 是否通过 |
|---|---|---|---|
| ✅ 初始状态 | 打开对话框 | "苹果"被选中(圆圈变蓝) | ✔️ |
| ✅ 点击"橘子" | 点击第二项 | "橘子"被选中,其他取消 | ✔️ |
| ✅ 点击"确认" | 点击确认 | 弹出"你选择了:橘子" | ✔️ |
| ✅ 点击"取消" | 点击取消 | 对话框关闭,无提示 | ✔️ |
| ✅ 连续点击 | 先点"草莓",再点"香蕉" | 最后一次选择生效 | ✔️ |
| ✅ 不选直接确认 | 不点任何项,直接点"确认" | 显示"你选择了:苹果"(默认值) | ✔️ |
🌟5、效果截图


🎯五、demo4:实现"单选水果"对话框
🌟1、功能描述:
弹出一个对话框,显示四个水果选项(苹果、橘子、草莓、香蕉),每个选项是单选按钮样式
- 默认选中"苹果"
- 点击任意水果------>选中该选项
- 点击"确认"------>弹出提示:你选择了苹果
- 点击"取消"------>关闭对话框
🌟2、代码逻辑思维
[开始]
↓
定义水果数组 → 存储选项
↓
声明变量 selectedFruitIndex 记住选中项索引(默认0)
↓
创建 AlertDialog.Builder 对象
↓
设置标题和图标
↓
使用 setSingleChoiceItems() 添加单选列表
→ 参数1:数据数组
→ 参数2:初始选中项索引(0表示"苹果")
→ 参数3:点击事件,更新 selectedFruitIndex
↓
添加"确认"按钮 → 获取选中项并提示
↓
添加"取消"按钮 → 关闭对话框
↓
创建并显示对话框
↓
[结束]
🌟3、编写代码
① java文件------同上(只换方法,添加按钮)
java
package com.example.alertdialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.provider.AlarmClock;
import android.view.View;
import android.view.accessibility.AccessibilityManager;
import android.widget.Button;
import android.widget.Toast;
import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;
public class MainActivity extends AppCompatActivity {
/*
* 1、定义一个字符串数组,存储要显示的水果名称
*/
final String[] arrayFruit={"苹果","橘子","草莓","香蕉"};
/*
* 声明一个私有变量,用于记住用户选中的水果索引
* 初始值为0,表示默认选中第一个(苹果)
*/
private int selectedFruitIndex = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
EdgeToEdge.enable(this);
setContentView(R.layout.activity_main);
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
return insets;
});
/*
* 2、找到按钮控件并绑定点击事件
*/
Button btnshowListDialog=findViewById(R.id.btnshowListDialog);
btnshowListDialog.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//3、点击这个测试按钮时触发 showFruitListDialog();方法
showFruitRadioDialog();
}
});
}
/*
* 3、实现showFruitRadioDialog();
* 创建并显示"单选水果"对话框的方法
*/
private void showFruitRadioDialog() {
//① 创建AlertDialog构建器对象,this表示当前的Activity
AlertDialog.Builder builder = new AlertDialog.Builder(this);
//② 设置对话框标题
builder.setTitle("你喜欢吃哪种水果?")
//③ 设置图标
.setIcon(R.mipmap.ic_launcher)
/*
* ④ 使用setSingleChoiceItems()方法实现单选功能
* 参数1:arrayFruit表示要显示的数据数组
* 参数2:初始被选选中的项的索引
* 参数3:点击某个选项时触发的事件
*/
.setSingleChoiceItems(arrayFruit, 0, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
//i是用户点击的选项的索引(0,1,2,3....)
//更新全局变量,记录当前选中的项
selectedFruitIndex=i;
}
});
//添加确认按钮
builder.setPositiveButton("确认", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
//执行点击确认逻辑------>获取之前选中的水果
//使用selectedFruitIndex从数组中取出对应的水果名称
String selectedFruit = arrayFruit[selectedFruitIndex];
//弹出提示信息
Toast.makeText(MainActivity.this,"你选择了:"+selectedFruitIndex,Toast.LENGTH_SHORT).show();
}
});
//添加"取消"按钮
builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
//点击取消按钮,关闭对话框
Toast.makeText(MainActivity.this,"已取消选择选择",Toast.LENGTH_SHORT).show();
dialogInterface.dismiss();
}
});
//创建对话框对象
AlertDialog alertDialog=builder.create();
//显示对话框
alertDialog.show();
}
}
② 布局文件------同上
🌟4、测试
| 测试项 | 操作 | 预期结果 | 是否通过 |
|---|---|---|---|
| ✅ 初始状态 | 打开对话框 | "苹果"被选中(右侧有蓝色圆点) | ✔️ |
| ✅ 点击"橘子" | 点击第二项 | "橘子"被选中,其他取消 | ✔️ |
| ✅ 点击"确认" | 点击确认 | 弹出"你选择了:橘子" | ✔️ |
| ✅ 点击"取消" | 点击取消 | 对话框关闭,无提示 | ✔️ |
| ✅ 不选直接确认 | 不点任何项,直接点"确认" | 弹出"你选择了:苹果"(默认值) | ✔️ |
| ✅ 连续点击 | 先点"草莓",再点"香蕉" | 最后一次选择生效 | ✔️ |
🌟5、效果截图



🎯六、demo5:实现"多选水果"对话框
🌟1、功能描述:
- 弹出对话框,显示水果(苹果、橘子、草莓、香蕉)
- 每个选项是复选框(CheckBox)样式
- 可以多选
- 点击"确认"后,弹出提示:"你选择了:苹果、橘子、香蕉"(最后一个顿号)
- 点击"取消"关闭对话框
🌟2、代码实现逻辑
[开始]
↓
定义水果数组 arrayFruit
↓
创建 boolean[] checkedItems 数组,记录每个选项是否被选中(初始全 false)
↓
创建 AlertDialog.Builder
↓
使用 setMultiChoiceItems() 添加多选列表
→ 参数1:数据数组
→ 参数2:初始选中状态数组
→ 参数3:点击事件,更新 checkedItems[which] = isChecked
↓
添加"确认"按钮
→ 遍历 checkedItems,收集所有选中的水果
→ 用 StringBuilder 拼接,每项后加"、",但最后去掉末尾顿号
↓
添加"取消"按钮 → 关闭对话框
↓
创建并显示对话框
↓
[结束]
| 方法 | 用途 |
|---|---|
setMultiChoiceItems(items, checkedItems, listener) |
实现多选对话框 |
boolean[] checkedItems |
记录每个选项的选中状态 |
StringBuilder |
高效拼接字符串 |
setLength(len - 1) |
删除末尾多余符号(最简单方法) |
🌟3、编写代码
①java文件------同上(只换方法)
- 注意:去掉末尾多余的顿号
java
package com.example.alertdialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.provider.AlarmClock;
import android.view.View;
import android.view.accessibility.AccessibilityManager;
import android.widget.Button;
import android.widget.Toast;
import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;
public class MainActivity extends AppCompatActivity {
/*
* 1、定义一个字符串数组,存储要显示的水果名称
*/
final String[] arrayFruit={"苹果","橘子","草莓","香蕉"};
/*
* 记录每个选项是否被选中
* 初始全false
*/
private boolean[] checkedItems={false,false,false,false};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
EdgeToEdge.enable(this);
setContentView(R.layout.activity_main);
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
return insets;
});
/*
* 2、找到按钮控件并绑定点击事件
*/
Button btnshowListDialog=findViewById(R.id.btnshowListDialog);
btnshowListDialog.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//3、点击这个测试按钮时触发 showFruitMultiDialog();方法
showFruitMultiDialog();
}
});
}
/*
* 3、实现showFruitMultiDialog();
* 创建并显示"单选水果"对话框的方法
*/
private void showFruitMultiDialog() {
//① 创建AlertDialog构建器对象,this表示当前的Activity
AlertDialog.Builder builder = new AlertDialog.Builder(this);
//② 设置对话框标题
builder.setTitle("你喜欢吃哪种水果?")
//③ 设置图标
.setIcon(R.mipmap.ic_launcher)
/*
* ④ 使用setMultiChoiceItems()方法实现多选功能
* 参数1:arrayFruit表示要显示的数据数组
* 参数2:表示当前是否被选中
* 参数3:点击某个选项时触发的事件
*/
.setMultiChoiceItems(arrayFruit, checkedItems, new DialogInterface.OnMultiChoiceClickListener(){
@Override
public void onClick(DialogInterface dialogInterface, int i,boolean isChecked) {
//i是用户点击的选项的索引(0,1,2,3....)
//isChecked:当前是否被选中(true/false)
//更新checkedItems数组,记录最新状态
checkedItems[i]=isChecked;
}
});
//添加确认按钮
builder.setPositiveButton("确认", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
//创建StringBuilder用于拼接选中的水果
StringBuilder selectdFruits=new StringBuilder();
//遍历checkedItems[]数组
for(int j=0;j<checkedItems.length;j++)
{
if(checkedItems[j])//如果第i向被选中
{
//把说过名称加上并加顿号
selectdFruits.append(arrayFruit[j]).append("、");
}
}
//检查是否有选项被选中
if(selectdFruits.length()==0)
{
//如果没有选中
Toast.makeText(MainActivity.this,"你没有选择任何水果",Toast.LENGTH_SHORT).show();
}
else {
//去掉末尾多余的顿号
//删除最后一个字节
selectdFruits.setLength(selectdFruits.length()-1);
//弹出提示信息
Toast.makeText(MainActivity.this,"你选择了:"+selectdFruits.toString(),Toast.LENGTH_SHORT).show();
}
}
});
//添加"取消"按钮
builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
//点击取消按钮,关闭对话框
Toast.makeText(MainActivity.this,"已取消选择选择",Toast.LENGTH_SHORT).show();
dialogInterface.dismiss();
}
});
//创建对话框对象
AlertDialog alertDialog=builder.create();
//显示对话框
alertDialog.show();
}
}
②布局文件------同上
XML
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
android:orientation="vertical"
tools:context=".MainActivity">
<Button
android:id="@+id/btnshowListDialog"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="请选择水果" />
<!--
<Button
android:id="@+id/button2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="buttonClick"
android:text="Button2" />
<Button
android:id="@+id/button3"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="buttonClick"
android:text="Button3" />
<Button
android:id="@+id/button4"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="buttonClick"
android:text="Button4" />
-->
</LinearLayout>
🌟4、测试
| 测试项 | 操作 | 预期结果 |
|---|---|---|
| ✅ 选"苹果" | 只勾第一个 | "你选择了:苹果" |
| ✅ 选"苹果、橘子" | 勾前两个 | "你选择了:苹果、橘子" |
| ✅ 全选 | 四个都勾 | "你选择了:苹果、橘子、草莓、香蕉" |
| ✅ 不选 | 一个都不勾 | "你没有选择任何水果" |
| ✅ 选中间两项 | 勾"橘子、草莓" | "你选择了:橘子、草莓" |
🌟5、效果截图




🎯七、demo6:实现"登录对话框"
- 自定义View的AlerDialog,也就是在对话框中嵌入一个我们自己设计的布局文件(如登录界面)
🌟1、功能描述
-
弹出对话框
-
对话框中包含两个输入框
① 用户名(EditText)
② 密码(EditText)
-
有两个按钮:"取消"和"登录"
-
点击"登录"后获取用户名和密码并提示
🌟2、代码实现逻辑
[开始]
↓
创建 login.xml 布局文件 → 包含用户名和密码输入框
↓
在 Activity 中使用 LayoutInflater 加载 login.xml
↓
创建 AlertDialog.Builder
↓
设置标题、图标、View(即 login.xml)
↓
添加"登录"和"取消"按钮
↓
在"登录"按钮中获取 EditText 内容
↓
显示结果
↓
[结束]
| 方法 | 用途 |
|---|---|
| LayoutInflater.from(this) | 获取布局填充器 |
| inflate(R.layout.login,null) | 加载XML布局文件为View对象 |
| setView(myLoginView) | 将自定义View添加到对话框 |
| findViewById() | 在自定义View中查找控件 |
| [核心语法] |
🌟3、编写代码
① java文件
java
package com.example.alertdialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.provider.AlarmClock;
import android.view.LayoutInflater;
import android.view.View;
import android.view.accessibility.AccessibilityManager;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;
public class MainActivity extends AppCompatActivity {
/*
* 1、定义一个字符串数组,存储要显示的水果名称
*/
// final String[] arrayFruit={"苹果","橘子","草莓","香蕉"};
/*
* 记录每个选项是否被选中
* 初始全false
*/
// private boolean[] checkedItems={false,false,false,false};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
EdgeToEdge.enable(this);
setContentView(R.layout.activity_main);
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
return insets;
});
/*
* 2、找到按钮控件并绑定点击事件
*/
Button btnshowListDialog=findViewById(R.id.btnshowListDialog);
btnshowListDialog.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//3、点击这个测试按钮时触发showLoginDialog();方法------调用登录对话框
showLoginDialog();
}
});
}
/*
* 3、实现showFruitMultiDialog();
* 创建并显示登录对话框的方法
*/
private void showLoginDialog() {
//创建LayoutInflater对象,用于加载布局文件
LayoutInflater layoutInflater=LayoutInflater.from(this);
/*
* 使用inflate()方法加兹安login.xml布局文件
* 参数1:布局资源ID(R.layout.login)
* 参数2:null表示不附加到父容器
*/
View myLoginView =layoutInflater.inflate(R.layout.login,null);
//① 创建AlertDialog构建器对象,this表示当前的Activity
AlertDialog.Builder builder = new AlertDialog.Builder(this);
//② 设置对话框标题
builder.setTitle("用户登录")
//③ 设置图标
.setIcon(R.mipmap.ic_launcher)
//④ 设置自定义View
.setView(myLoginView);
//添加确认按钮
builder.setPositiveButton("登录", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
//获取布局文件中的两个EditText控件
EditText Username=myLoginView.findViewById(R.id.Username);
EditText Password=myLoginView.findViewById(R.id.Password);
//获取用户输入的内容
String username = Username.getText().toString();
String password = Password.getText().toString();
//判断是否为空
if(username.isEmpty()||password.isEmpty())
{
Toast.makeText(MainActivity.this,"用户名和密码不能为空!",Toast.LENGTH_SHORT).show();
return;//不执行后续代码
}
//否则显示登录信息
Toast.makeText(MainActivity.this,"登陆成功!用户名:"+username,Toast.LENGTH_SHORT).show();
}
});
//添加"取消"按钮
builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
//点击取消按钮,关闭对话框
Toast.makeText(MainActivity.this,"已取消选择选择",Toast.LENGTH_SHORT).show();
dialogInterface.dismiss();
}
});
//创建对话框对象
AlertDialog alertDialog=builder.create();
//显示对话框
alertDialog.show();
}
}
② 布局文件
- login.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="wrap_content"
android:orientation="vertical"
android:padding="16dp">
<!-- 用户名区域 -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="用户名:"
android:textSize="16sp" />
<EditText
android:id="@+id/editTextUsername"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:ems="10"
android:hint="请输入用户名" />
</LinearLayout>
<!-- 密码区域 -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:orientation="horizontal"
android:layout_marginTop="16dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="密 码:"
android:textSize="16sp" />
<EditText
android:id="@+id/editTextPassword"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:ems="10"
android:hint="请输入密码"
android:inputType="textPassword" /> <!-- 密码隐藏显示 -->
</LinearLayout>
</LinearLayout>
- activity_main.xml
XML
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
android:orientation="vertical"
tools:context=".MainActivity">
<Button
android:id="@+id/btnshowListDialog"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="登录" />
🌟4、测试
| 测试项 | 操作 | 预期结果 |
|---|---|---|
| ✅ 输入用户名和密码 | 正常输入 | 登录成功提示 |
| ✅ 只输入用户名 | 密码为空 | 提示"不能为空" |
| ✅ 只输入密码 | 用户名为空 | 提示"不能为空" |
| ✅ 什么都不输入 | 点击登录 | 提示"不能为空" |
| ✅ 点击取消 | 点击取消按钮 | 对话框关闭 |
🌟5、效果截图



🎯八、demo7:实现ViewPager2多页面切换
方法一:
🌟1、功能描述:
- 实现一个带标签页的界面
- 三个页面:首页(蓝色)、设备(绿色)、我的(红色)
- 使用ViewPager2和TabLayout实现滑动切换
- 每个页面由Fragment控制
🌟2、代码实现逻辑
[主布局文件] → activity_view_pager.xml
↓
├─ TabLayout → 显示标签(首页、设备、我的)
└─ ViewPager2 → 切换页面内容
↓
├─ Fragment1 → layout1.xml(蓝色背景)
├─ Fragment2 → layout2.xml(绿色背景)
└─ Fragment3 → layout3.xml(红色背景)
↓
MyAdapter → 继承 FragmentStateAdapter
基础核心知识
🧩① Fragment(碎片)------页面的"模块"
- Fragment是Android中的一种轻量级界面单元
- 他不是单独存在的,必须嵌入在Activity中
- 可以理解为:一个可复用的页面
在本Demo中的作用:
- 把"首页"、设备、我的 三个页面分别做成三个Fragment
- 每个Fragment管理自己的布局和逻辑,互不干扰
类比:就像乐高积木,每个Fragment是一块积木,Activity是底板,ViewPager2负责切换那块积木朝上
🧩② ViewPager2------页面的"活动容器"
- ViewPager是Google推荐的新一代多页面滑动控件( 替代旧版的ViewPager**)**
- 用户可以通过左右滑动来切换不同的页面
- 它本身不包含内容,需要配合**适配器(Adapter)**使用
在本Demo中的作用:
- 作为容器,承载三个Fragment
- 实现左右滑动切换"首页------>设备------>wode "
注意:ViewPager2本身不会显示标签为,他只负责滑动内容
🧩③ TabLayout------页面的"导航栏"
- TabLayout是Material Design提供的一个顶部标签栏控件
- 它显示"首页"、设备、我的这样的文字按钮
- 点击标签会跳转到对应的页面
在本Demo中的作用:
- 提供直观地导航入口
- 和ViewPager2联动:滑动页面时,标签自动高亮;点击标签时,页面自动跳转
关键桥梁:TabLayoutMediator------它把TabLayout和ViewPager2"绑"在一起
🧩④ 整体协作流程
TabLayout显示标签------>ViewPager2滑动页面------>每个页面由Fragment实现------>通过Adapter链接一切

🌟3、编写代码
① 创建三个布局文件
🧩a:layout1.xml(首页 - 蓝色)
XML
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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="match_parent"
android:background="#03A9F4"
android:gravity="center"
android:orientation="vertical">
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="首页"
android:textColor="@color/black"
android:textSize="24sp" />
</LinearLayout>
🧩b:layout1.xml(设备 - 红色)
XML
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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="match_parent"
android:background="#E91E63"
android:gravity="center"
android:orientation="vertical">
<TextView
android:id="@+id/textView3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="设备"
android:textColor="@color/black"
android:textSize="24sp" />
</LinearLayout>
🧩c:layout1.xml(首页 - 绿色)
XML
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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="match_parent"
android:background="#55E85B"
android:gravity="center"
android:orientation="vertical">
<TextView
android:id="@+id/textView4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="我的"
android:textColor="@color/black"
android:textSize="24sp" />
</LinearLayout>
② 创建三个fragment类
🧩a:创建 MyFragment1.java
java
package com.example.alertdialog;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
public class MyFragment1 extends Fragment {
@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
//加载layout1.xml布局问价
return inflater.inflate(R.layout.layout1,container,false);
}
}
🧩b:创建 MyFragment2.java
java
package com.example.alertdialog;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
public class MyFragment2 extends Fragment {
@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
//加载layout1.xml布局文件
return inflater.inflate(R.layout.layout2,container,false);
}
}
🧩c:创建 MyFragment3.java
java
package com.example.alertdialog;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
public class MyFragment3 extends Fragment {
@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
//加载layout1.xml布局文件
return inflater.inflate(R.layout.layout3,container,false);
}
}
③ 创建适配器 MyAdapter.java
| 方法 | 职责 |
|---|---|
| 构造函数 | 接收 Fragment 列表并保存 |
createFragment(int position) |
按位置返回对应的 Fragment(核心!) |
getItemCount() |
告诉 ViewPager2 一共有多少页 |
java
package com.example.alertdialog.viewpage;
import android.content.Context;
import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentActivity;
import androidx.fragment.app.FragmentManager;
import androidx.lifecycle.Lifecycle;
import androidx.viewpager2.adapter.FragmentStateAdapter;
import java.util.List;
/*
* 自定义适配器:连接ViewPager2进而多个Fragment
* 作用:告诉ViewPager2第几页该显示那个Fragment以及总共多少页
*/
public abstract class MyAdapter extends FragmentStateAdapter{
//成员变量:保存所有要显示的Fragment
private final List<Fragment> fragments;
/*
* 构造函数:创建适配器时调用
*/
public MyAdapter(@NonNull FragmentManager fragmentManager, @NonNull Lifecycle lifecycle, List<Fragment> fragments) {
super(fragmentManager, lifecycle);
this.fragments = fragments;
}
/*
*Viewpager2会调用此方法来获取第position页对应的fragme
* position:页面索引,从0开始
* 返回对应未知的Fragem实例
*/
@NonNull
@Override
public Fragment createFragment(int position){
//从列表中取出制定位置的Fragment
return fragments.get(position);
}
/*
* 告诉ViewPager2一共有多少个页面
*/
@Override
public int getItemCount(){
return fragments.size();
}
}
④ 主布局文件 activity_main.xml
XML
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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="match_parent"
android:id="@+id/main"
android:orientation="vertical">
<!-- TabLayout:显示标签 -->
<com.google.android.material.tabs.TabLayout
android:id="@+id/tabLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:tabMode="fixed"
app:tabGravity="fill" />
<!-- ViewPager2:显示内容 -->
<androidx.viewpager2.widget.ViewPager2
android:id="@+id/viewPager2"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
⑤ 主 Activity 代码 MainActivity.java
java
package com.example.alertdialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.provider.AlarmClock;
import android.view.LayoutInflater;
import android.view.View;
import android.view.accessibility.AccessibilityManager;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;
import androidx.fragment.app.Fragment;
import androidx.viewpager.widget.ViewPager;
import androidx.viewpager2.widget.ViewPager2;
import com.example.alertdialog.viewpage.MyAdapter;
import com.example.alertdialog.viewpage.MyFragment1;
import com.example.alertdialog.viewpage.MyFragment2;
import com.example.alertdialog.viewpage.MyFragment3;
import com.google.android.material.tabs.TabLayout;
import com.google.android.material.tabs.TabLayoutMediator;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
/*
* 1、定义一个字符串数组,存储要显示的水果名称
*/
// final String[] arrayFruit={"苹果","橘子","草莓","香蕉"};
/*
* 记录每个选项是否被选中
* 初始全false
*/
// private boolean[] checkedItems={false,false,false,false};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
EdgeToEdge.enable(this);
setContentView(R.layout.activity_main);
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
return insets;
});
/*
* 主Activity:负责初始化ViewPager2+TabLayout
*/
/*
* 1、找到布局中的ViewPager2+TabLayout
*
*/
ViewPager2 viewPager2 = findViewById(R.id.viewPager2);
TabLayout tabLayout = findViewById(R.id.tabLayout);
//创建三个Fragment实例
MyFragment1 fragment1 =new MyFragment1();//首页
MyFragment2 fragment2 = new MyFragment2();//设备
MyFragment3 fragment3 = new MyFragment3();//我的
//将Fragment放入List中
List<Fragment> fragments =new ArrayList<>();
fragments.add(fragment1);
fragments.add(fragment2);
fragments.add(fragment3);
//创建自定义适配器,并传入当前上下文和Fragment列表
MyAdapter adapter=new MyAdapter(this,fragments);
//将适配器设置给ViewPager2
viewPager2.setAdapter(adapter);
//使用TabLayoutMediator将TabLayout和ViewPager2绑定在一起
new TabLayoutMediator(tabLayout,viewPager2,
//Lambda表达式:为每个标签设置文字
(tab,position) ->{
switch (position){
case 0:
tab.setText("首页");
break;
case 1:
tab.setText("设备");
break;
case 2:
tab.setText("我的");
}
}).attach();
}
}
🌟4、测试
| 测试项 | 操作 | 预期结果 |
|---|---|---|
| ✅ 启动 App | 运行程序 | 显示三个标签页 |
| ✅ 点击"首页" | 点击第一个标签 | 显示蓝色页面 |
| ✅ 滑动页面 | 左右滑动 | 页面切换 |
| ✅ 点击"设备" | 点击第二个标签 | 显示绿色页面 |
| ✅ 点击"我的" | 点击第三个标签 | 显示红色页面 |
🧩测试长内容是否遮挡 TabLayout
不会
TabLayout是固定在主 Activity 布局顶部的- 每个 Fragment 的内容是在 ViewPager2 内部滚动的
- 滚动范围仅限于 ViewPager2 区域,不会影响 TabLayout
如果你在 Fragment 里用了
ScrollView或RecyclerView,默认行为确实是只在页面内滚动,TabLayout 始终可见。
不过!有一种更高级的需求叫:"联动滚动" ------ 比如微信朋友圈,上滑时 TabLayout 隐藏,下滑时又出现。
测试:修改 layout1.xml(首页布局)
XML
<?xml version="1.0" encoding="utf-8"?>
<ScrollView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#0096FF">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="16dp">
<!-- 生成多行文本 -->
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="首页 - 第1行\n第2行\n第3行\n第4行\n第5行\n第6行\n第7行\n第8行\n第9行\n第10行\n第11行\n第12行\n第13行\n第14行\n第15行\n第16行\n第17行\n第18行\n第19行\n第20行"
android:textColor="@color/black"
android:textSize="34sp" />
</LinearLayout>
</ScrollView>
🌟5、效果截图



🌟6、小结
| 组件 | 用途 |
|---|---|
ViewPager2 |
实现页面滑动切换 |
TabLayout |
显示标签页标题 |
Fragment |
每个页面的内容载体 |
FragmentStateAdapter |
连接 ViewPager2 和 Fragment 的桥梁 |

