最新下载
热门教程
- 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的更新要求。
相关文章
- DNF玫瑰武器装扮外观效果怎么样 06-03
- 知到app怎样删除已选课程 06-03
- 艾尔登法环黑夜君临复仇者参战成就如何达成 06-03
- Benchmarking at the Edge of Comprehension 06-03
- 最终幻想14:水晶世界召唤师职业任务完成指南 06-03
- 疯狂水世界:海兽挑选全指南 06-03