AlertDialog → DialogFragment

AlertDialog → DialogFragment

老写法(Java)

java 复制代码
private void showConfirmDialog() {
    new AlertDialog.Builder(this)
            .setTitle("确认删除")
            .setMessage("确定要删除这条记录吗?")
            .setPositiveButton("确定", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    deleteRecord();
                }
            })
            .setNegativeButton("取消", null)
            .show();
}

private void showLoading() {
    ProgressDialog dialog = new ProgressDialog(this);
    dialog.setMessage("加载中...");
    dialog.setCancelable(false);
    dialog.show();
}

问题在哪里

两个问题:

  1. 屏幕旋转或配置变更后 Dialog 直接消失,用户操作到一半就丢了
  2. ProgressDialog 已官方废弃(API 26+),Google 不建议继续使用

新写法(Kotlin + DialogFragment)

kotlin 复制代码
class ConfirmDialogFragment : DialogFragment() {

    companion object {
        const val TAG = "ConfirmDialog"

        fun newInstance(title: String, message: String): ConfirmDialogFragment {
            return ConfirmDialogFragment().apply {
                arguments = Bundle().apply {
                    putString("title", title)
                    putString("message", message)
                }
            }
        }
    }

    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
        val title = arguments?.getString("title") ?: ""
        val message = arguments?.getString("message") ?: ""

        return AlertDialog.Builder(requireContext())
                .setTitle(title)
                .setMessage(message)
                .setPositiveButton("确定") { _, _ ->
                    // 通过 FragmentResult 回传结果
                }
                .setNegativeButton("取消", null)
                .create()
    }
}

调用方:

kotlin 复制代码
ConfirmDialogFragment.newInstance("确认删除", "确定要删除这条记录吗?")
        .show(parentFragmentManager, ConfirmDialogFragment.TAG)

ProgressDialog 替换为自定义 DialogFragment:

kotlin 复制代码
class LoadingDialogFragment : DialogFragment() {

    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
        return Dialog(requireContext()).apply {
            setContentView(R.layout.dialog_loading)
            setCancelable(false)
        }
    }
}

一句话注意

DialogFragmentFragmentManager 管理,配置变更后会自动恢复,不会再丢。但如果显示 DialogFragment 的 Activity 本身被重建了,需要用 childFragmentManager 还是 parentFragmentManager 要搞清楚------在 Activity 里用 supportFragmentManager,在 Fragment 里用 childFragmentManager

结果回传不要再用"持有 Activity 引用"的老套路,用 setFragmentResultListener 即可。


Java Android 老项目迁移系列,持续更新中。

相关推荐
亦暖筑序10 小时前
AgentScope-Java 入门:用 SSE 展示评审任务进度
java·agent·ai编程
心中有国也有家10 小时前
AtomGit Flutter 鸿蒙客户端: AnimatedScale 与 AnimatedContainer 联合实战
android·javascript·flutter·华为·harmonyos
卓怡学长10 小时前
w261springboot基于web学校课程管理系统
java·数据库·spring boot·spring·intellij-idea
shuoshuohaohao10 小时前
《JavaWeb --2》
java
浩瀚地学10 小时前
【面试算法笔记】0105-数组-螺旋矩阵
java·开发语言·笔记·算法·面试
AI人工智能+电脑小能手11 小时前
【大白话说Java面试题 第169题】【07_Redis篇】第5题:如何保证缓存一致性?
java·redis·延迟双删·缓存一致性·双写一致性
SimonKing11 小时前
Spring I18N 底层源码大揭秘:你的 MessageSource 到底是怎么找到配置的?
java·后端·程序员
极客先躯11 小时前
高级java每日一道面试题-2026年04月04日-实战篇[Docker]-如何排查容器存储挂载失败的问题?
java·运维·docker·容器·高级面试
Hesionberger11 小时前
动态规划与二分法破解最长递增子序列
java·数据结构·python·算法·leetcode
CodeStats11 小时前
【Linux IO】从文件描述符到硬件中断:Linux IO 系统底层完全拆解
java·linux·开发语言·io·socket