Android 自定义dialog类
首先定制style样式 styles.xml 加入自定义样式
<style name="CustomLoadingDialog"> <item name="android:windowFrame">@null</item><!--边框--> <item name="android:windowIsFloating">true</item><!--是否浮现在activity之上--> <item name="android:windowIsTranslucent">true</item><!--半透明--> <item name="android:windowNoTitle">true</item><!--无标题--> <item name="android:windowBackground">@color/transparent</item><!--背景透明--> <item name="android:background">@color/transparent</item> <item name="android:backgroundDimEnabled">true</item><!--模糊--> <item name="android:backgroundDimAmount">0.6</item> </style>
在添加视图页面 在 res.layout 下加入loading_dialog.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="match_parent" android:alpha="255" android:background="@drawable/bg_white_radius" android:gravity="center" android:orientation="vertical"> <ProgressBar android:id="@+id/progressBar" style="?android:attr/progressBarStyle" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <TextView android:id="@+id/content_view" android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center" android:paddingLeft="10dp" android:paddingRight="10dp" android:text="@string/loading_text" android:textColor="@color/bg_primary" android:textSize="14sp" /> </LinearLayout>
现在开始写自定义视图LoadingView
class LoadingView(context: Context, content: String) : Dialog(context, R.style.CustomLoadingDialog) { init { setContentView(R.layout.loading_dialog) content_view.text = content setCanceledOnTouchOutside(true) backgroundAlpha(1f) val dm = context.resources.displayMetrics window?.attributes?.width = (dm.widthPixels * 0.6).toInt() window?.attributes?.height = (dm.widthPixels * 0.6 * 0.6).toInt() setCancelable(false) } override fun onKeyDown(keyCode: Int, event: KeyEvent): Boolean { when (keyCode) { KeyEvent.KEYCODE_BACK -> { if (isShowing) { dismiss() } } } return super.onKeyDown(keyCode, event) } override fun dismiss() { if(isShowing){ super.dismiss() } } override fun setTitle(title: CharSequence?) { content_view.text = title } private fun backgroundAlpha(alpha: Float) { window?.attributes?.alpha = alpha } }
创建一个单例管理类,方便使用
class LoadingManager private constructor(){ private var mContext:Context? = null private var loadingView: LoadingView? = null companion object { val instance: LoadingManager by lazy(mode = LazyThreadSafetyMode.SYNCHRONIZED) { LoadingManager() } } fun createDialog(context: Context, title: String): LoadingView { if(mContext == context){ if(loadingView != null){ loadingView?.setTitle(title) return loadingView!! } } loadingView = null mContext = context loadingView = LoadingView(mContext!!, title) return loadingView!! } }
使用
//显示加载中视图 LoadingManager.instance.createDialog(this,"登录中").show() //关闭视图 LoadingManager.instance.createDialog(this,"").dismiss()
分类:
android
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端