Android加载弹窗(loading dialog)封装的思考


前言

我们在进行网络请求或者其他一些耗时的操作时,为了良好的用户的体验和系统稳定性,需要弹出dialog来提示用户,并且限制用户的操作行为。有的的loading dialog是纯进度条的方式,有的是自定义的特殊动画效果,有的是进度条+文字,但无论哪种,都需要创建dialog,为了避免重复的模板代码,往往会对dialog进行封装。


1 系统全局dialog

因为某些特殊需求,比如请求失败统一自动关闭loading dialog,很多人的想法都是希望封装一个在系统内全局存在,随处可调用的dialog,常见的流传比较广的封装方式有两种。

1.1 基于栈顶activity系统全局dialog

一般我们创建的dialog都是依附于activity,假设现在管理全局弹窗的工具名为DialogManager,如果要在非activity中弹出dialog,那就必须要把当前处于栈顶的activity (这里称为:TopActivity) 传给DialogManager,直接传递的话,就需要activity持有DialogManager实例,这样就不能实现全局化了,所以我们必须通过间接的方式来传递。常见的做法是通过监听activity的生命周期,来取得当前的TopActivity,比如通过ActivityLifecycleCallbacks进行监听。


1.2 基于Service的悬浮窗

这种方式也是网上流传比较广的一种方式,利用WindowManager.LayoutParams.TYPE_SYSTEM_ALERTWindowManager.LayoutParams.TYPE_TOASTWindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY
等属性来将dialog变为悬浮窗,这种方式的坑也很多,比如权限限制,版本适配,第三方厂商ROM适配等,网上可以找到很多相关资料, 这里不作详细叙述。


2 非全局的dialog

基本上我们的网络请求都是在Activity或者Fragment中发起的,退求其次,我们可以在BaseActivity/BaseFragment中封装一个loading dialog,这样就能很方便的调用了。而且Google官方在很早之前就推荐使用DialogFragment来替代普通的dialog,而Fragment是必须依附Activity的,在BaseActivity/BaseFragment中封装也更方便。(PS:DialogFragment的优势在网上已经有很多文章讲解,这里不作详细叙述。)


记录,分享,交流。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要在 Android加载弹窗,可以使用对话框(Dialog)或者弹出窗口(PopupWindow)。 使用对话框: 1. 创建一个AlertDialog.Builder对象: AlertDialog.Builder builder = new AlertDialog.Builder(this); 2. 设置对话框的标题、消息和按钮: builder.setTitle("标题") .setMessage("消息") .setPositiveButton("确定", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { // 用户点击确定按钮后的操作 } }) .setNegativeButton("取消", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { // 用户点击取消按钮后的操作 } }); 3. 创建并显示对话框: AlertDialog dialog = builder.create(); dialog.show(); 使用弹出窗口: 1. 创建一个PopupWindow对象: PopupWindow popupWindow = new PopupWindow(this); 2. 设置弹窗的布局和大小: View contentView = LayoutInflater.from(this).inflate(R.layout.popup_layout, null); popupWindow.setContentView(contentView); popupWindow.setWidth(ViewGroup.LayoutParams.WRAP_CONTENT); popupWindow.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT); 3. 设置弹窗的背景色和动画效果: popupWindow.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); popupWindow.setAnimationStyle(R.style.popup_anim); 4. 显示弹窗: View anchorView = findViewById(R.id.anchor_view); // 弹窗要显示在哪个视图的下方 int xOff = 0; // 弹窗的横向偏移量 int yOff = 10; // 弹窗的纵向偏移量 popupWindow.showAsDropDown(anchorView, xOff, yOff);
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值