对话框中使用loading

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了对话框中使用loading相关的知识,希望对你有一定的参考价值。

参考技术A before-close:关闭前的回调,会暂停 Dialog 的关闭 function(done),done 用于关闭 Dialog

一定要在对话框关闭前,把loading变为true,清空列表数据。否则loading只会出现一次,并且对话框会出现上一次的数据

Kotlin实现Android项目中通用loading对话框

在安卓项目中,都会有耗时操作,用户进行操作后,都会给一个诸如正在加载的提示框,例如:

实现代码如下:

  • 第一步:编写通用加载框的布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@drawable/loading_dialog_bg"
    android:gravity="center_horizontal"
    android:orientation="vertical"
    android:padding="40dp">
//有的APP是在这里直接使用ProgressBar
    <ImageView
        android:id="@+id/loadingIv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:background="@drawable/loading_dialog_anim" />

</LinearLayout>
  • 第二步:编写对话框的样式:位于项目main/res/values/styles.xml文件中
    <style name="commonDialogStyle" parent="@android:style/Theme.Dialog">
        <item name="android:windowBackground">@android:color/transparent</item>
        <item name="android:windowNoTitle">true</item>
        <item name="android:windowFrame">@null</item>
        <item name="android:windowIsFloating">true</item>
        <item name="android:windowContentOverlay">@null</item>
        <item name="android:windowAnimationStyle">@android:style/Animation.Dialog</item>
        <item name="android:windowSoftInputMode">stateUnspecified|adjustPan</item>
    </style>
  • 第三步:实现自定义的Dialog
class CommonLoadingDialog private constructor(context: Context, theme: Int) : Dialog(context, theme) 
    companion object 
        private lateinit var mDialog: CommonLoadingDialog
        private lateinit var animDrawable: AnimationDrawable
        fun buildDialog(context: Context): CommonLoadingDialog 
            //根据指定主题样式创建Dialog
            mDialog = CommonLoadingDialog(context, R.style.commonDialogStyle)
            //设置Dialog的布局
            mDialog.setContentView(R.layout.common_loading)
            //点击或按返回键时消失
            mDialog.setCancelable(true)
            //点击对话框外的部分不消失.
            mDialog.setCanceledOnTouchOutside(false)
            //设置对话框居中
            mDialog.window.attributes.gravity = Gravity.CENTER
            val lp = mDialog.window.attributes
            lp.dimAmount = 0.2f
            //设置属性
            mDialog.window.attributes = lp
            //获取对话框中的动画
            val animView = mDialog.findViewById<ImageView>(R.id.loadingIv)
            animDrawable = animView.background as AnimationDrawable
            return mDialog
        
    
   //显示加载框
    fun showLoading() 
        super.show()
        animDrawable?.start()
    
   //关闭加载框
    fun hideLoading() 
        super.dismiss()
        animDrawable?.stop()
    

  • 最后:在需要的地方使用:

import android.os.Bundle
import android.support.v7.app.AppCompatActivity
import kotlinx.android.synthetic.main.activity_main.*

class MainActivity : AppCompatActivity() 
    override fun onCreate(savedInstanceState: Bundle?) 
        super.onCreate(savedInstanceState)
        //布局中就是一个简单的TextView作为点击源
        setContentView(R.layout.activity_main)
        //项目中都是把CommonLoadingDialog放在基类中初始化,在需要的地方直接使用
        val dialog: CommonLoadingDialog = CommonLoadingDialog.buildDialog(this);
        dialogTv.setOnClickListener 
            dialog.showLoading()
        
    

  • loading的圆角背景框drawable:
<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
    <solid android:color="#7f000000" />
    <corners
        android:bottomLeftRadius="5dp"
        android:bottomRightRadius="5dp"
        android:topLeftRadius="5dp"
        android:topRightRadius="5dp" />

</shape>

还有loading时转动的动画效果(最简单的帧动画)

//这里面的图片都是在网上找的
<?xml version="1.0" encoding="utf-8"?>
<animation-list
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:oneshot="false">
    <item android:drawable="@drawable/common_loading1" android:duration="200"/>
    <item android:drawable="@drawable/common_loading2" android:duration="200"/>
    <item android:drawable="@drawable/common_loading3" android:duration="200"/>
    <item android:drawable="@drawable/common_loading4" android:duration="200"/>
    <item android:drawable="@drawable/common_loading5" android:duration="200"/>
    <item android:drawable="@drawable/common_loading6" android:duration="200"/>
    <item android:drawable="@drawable/common_loading7" android:duration="200"/>
    <item android:drawable="@drawable/common_loading8" android:duration="200"/>
    <item android:drawable="@drawable/common_loading9" android:duration="200"/>
    <item android:drawable="@drawable/common_loading10" android:duration="200"/>
</animation-list>

以上是关于对话框中使用loading的主要内容,如果未能解决你的问题,请参考以下文章

android loading加载是怎么做的

加载loading对话框的功能(不退出沉浸式效果)

elementUI提交表单的按钮怎么改变loading状态

使用 load() 加载同样使用 jQuery 的页面

Dialog 使用详解

java 进度对话框。字体:https://stackoverflow.com/questions/12841803/best-way-to-show-a-loading-progress-indic