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()

 

posted @   荣超  阅读(1113)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
点击右上角即可分享
微信分享提示