最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
AlertDialog 到 DialogFragment
时间:2026-06-03 09:10:01 编辑:袖梨 来源:一聚教程网
本次内容聚焦于Android开发中对话框组件的迁移策略,深入分析从传统AlertDialog及废弃组件向DialogFragment转换的核心原因与操作步骤。
AlertDialog → DialogFragment
老写法(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();
}
问题在哪里
两个问题:

- 屏幕旋转或配置变更后 Dialog 直接消失,用户操作到一半就丢了
ProgressDialog已官方废弃(API 26+),Google 不建议继续使用
新写法(Kotlin + DialogFragment)
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()
}
}
调用方:
ConfirmDialogFragment.newInstance("确认删除", "确定要删除这条记录吗?")
.show(parentFragmentManager, ConfirmDialogFragment.TAG)
ProgressDialog 替换为自定义 DialogFragment:
class LoadingDialogFragment : DialogFragment() { override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
return Dialog(requireContext()).apply {
setContentView(R.layout.dialog_loading)
setCancelable(false)
}
}
}
一句话注意
DialogFragment 由 FragmentManager 管理,配置变更后会自动恢复,不会再丢。但如果显示 DialogFragment 的 Activity 本身被重建了,需要用 childFragmentManager 还是 parentFragmentManager 要搞清楚——在 Activity 里用 supportFragmentManager,在 Fragment 里用 childFragmentManager。
结果回传不要再用"持有 Activity 引用"的老套路,用 setFragmentResultListener 即可。
通过采用DialogFragment来替代旧有的对话框实现方式,能有效解决因配置变更导致的界面状态丢失问题,并顺应官方对废弃API的更新要求。
相关文章
- 正则表达式替换table表格中的样式与空标记(保留rowspan与colspan) 09-28
- js 正则学习小记之匹配字符串字面量优化篇 09-28
- js正则学习小记之匹配字符串字面量 09-28
- 浅谈js正则之test方法bug篇 09-28
- 正则表达式+Python re模块详解 09-28
- 解析正则表达式中的..?.+?的含义 09-28