Android AlertDialog实战:5种常用对话框实现

目录

🎯一、认识安卓中的AlertDialog

🌟1、基本特点

🌟2、常见用法

[① 简单提示对话框(带"确定"按钮)](#① 简单提示对话框(带“确定”按钮))

[② 带"是/否"的确认对话框](#② 带“是/否”的确认对话框)

[③ 带列表选项的对话框](#③ 带列表选项的对话框)

[④ 单选(RadioButton)对话框](#④ 单选(RadioButton)对话框)

[⑤ 多选(CheckBox)对话框](#⑤ 多选(CheckBox)对话框)

🎯二、demo1:实现一个最简单的对话框demo

🌟1、实现逻辑

🌟2、编写代码

[① 修改布局文件------antivity_main.xml](#① 修改布局文件——antivity_main.xml)

[② 修改java文件------MainAntivity.java](#② 修改java文件——MainAntivity.java)

🌟3、测试实现效果

🎯三、demo2:实现"确定删除?"对话框(带三个按钮)

🌟1、功能描述:

🌟2、编写代码

[① 修改布局文件------activity_main.xml](#① 修改布局文件——activity_main.xml)

[② 修改java文件------MainActivity.java](#② 修改java文件——MainActivity.java)

[🌟3、 测试实现效果](#🌟3、 测试实现效果)

[🎯四、demo3:实现"类似 ListView 的 AlertDialog"](#🎯四、demo3:实现“类似 ListView 的 AlertDialog”)

🌟1、功能目标

🌟2、功能实现逻辑

🌟3、编写代码

[① java文件](#① java文件)

[② 布局文件](#② 布局文件)

🌟4、测试

🌟5、效果截图

🎯五、demo4:实现"单选水果"对话框

🌟1、功能描述:

🌟2、代码逻辑思维

🌟3、编写代码

[① java文件------同上(只换方法,添加按钮)](#① java文件——同上(只换方法,添加按钮))

[② 布局文件------同上](#② 布局文件——同上)

🌟4、测试

🌟5、效果截图

🎯六、demo5:实现"多选水果"对话框

🌟1、功能描述:

🌟2、代码实现逻辑

🌟3、编写代码

①java文件------同上(只换方法)

②布局文件------同上

🌟4、测试

🌟5、效果截图

🎯七、demo6:实现"登录对话框"

🌟1、功能描述

🌟2、代码实现逻辑

🌟3、编写代码

[① java文件](#① java文件)

[② 布局文件](#② 布局文件)

🌟4、测试

🌟5、效果截图

🎯八、demo7:实现ViewPager2多页面切换

方法一:

🌟1、功能描述:

🌟2、代码实现逻辑

基础核心知识

[🧩① Fragment(碎片)------页面的"模块"](#🧩① Fragment(碎片)——页面的“模块”)

[🧩② ViewPager2------页面的"活动容器"](#🧩② ViewPager2——页面的“活动容器”)

[🧩③ TabLayout------页面的"导航栏"](#🧩③ TabLayout——页面的“导航栏”)

[🧩④ 整体协作流程](#🧩④ 整体协作流程)

🌟3、编写代码

[① 创建三个布局文件](#① 创建三个布局文件)

[🧩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)

🌟4、测试

[🧩测试长内容是否遮挡 TabLayout](#🧩测试长内容是否遮挡 TabLayout)

🌟5、效果截图

🌟6、小结


🎯一、认识安卓中的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 里用了 ScrollViewRecyclerView默认行为确实是只在页面内滚动,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 的桥梁
相关推荐
小年糕是糕手1 小时前
【C++】类和对象(六) -- 友元、内部类、匿名对象、对象拷贝时的编译器优化
开发语言·c++·算法·pdf·github·排序算法
坐不住的爱码1 小时前
静态资源映射-spring整合
java·spring·状态模式
大佐不会说日语~1 小时前
基于Spring AI Alibaba的AI聊天系统中,流式输出暂停时出现重复插入问题的分析与解决
java·人工智能·spring
大佬,救命!!!1 小时前
C++本地配置OpenCV
开发语言·c++·opencv·学习笔记·环境配置
0和1的舞者1 小时前
API交互:前后端分离开发实战指南
java·spring·tomcat·web3·maven·springmvc·springweb
一 乐1 小时前
宠物店管理|基于Java+vue的宠物猫店管理管理系统(源码+数据库+文档)
java·开发语言·前端·数据库·vue.js·spring boot·后端
天天摸鱼的小学生1 小时前
【Java泛型一遍过】
java·开发语言·windows
BD_Marathon1 小时前
【JavaWeb】JS_数据类型和变量
开发语言·javascript·ecmascript
峥嵘life1 小时前
Android EDLA 搭建Linux测试环境简介
android·linux·运维