我发现ProgressDialog现在已经被弃用了。除了ProgressBar,还有什么替代工具可以代替它。 我使用的是android studio 2.3.3版。

ProgressDialog progressDialog=new ProgressDialog(this);
progressDialog.show();

当前回答

ProgressDialog在API级别26中已弃用。

“已弃用”指的是正在被更新的函数或元素替换的函数或元素。

ProgressDialog是一个模态对话框,它阻止用户与之交互 而不是使用这个类,你应该使用一个进度 比如ProgressBar,它可以嵌入到你的应用程序的 UI。

优势

我个人认为ProgressBar比这两者更有优势。ProgressBar是一个指示操作进度的用户界面元素。以非中断的方式向用户显示进度条。在应用程序的用户界面中显示进度条。

其他回答

是的,ProgressDialog已弃用,但Dialog没有。

您可以将自己的XML文件(包含进度条和加载文本)扩展到对话框对象中,然后使用show()和dismiss()函数显示或隐藏它。 下面是一个例子(Kotlin):

ProgressDialog类:

class ProgressDialog {
companion object {
    fun progressDialog(context: Context): Dialog{
        val dialog = Dialog(context)
        val inflate = LayoutInflater.from(context).inflate(R.layout.progress_dialog, null)
        dialog.setContentView(inflate)
        dialog.setCancelable(false)
        dialog.window!!.setBackgroundDrawable(
                ColorDrawable(Color.TRANSPARENT))
        return dialog
    }
  }
}

XML

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
android:background="#fff"
android:padding="13dp"
android:layout_height="wrap_content">
<ProgressBar
    android:id="@+id/progressBar"
    style="?android:attr/progressBarStyle"
    android:layout_width="100dp"
    android:layout_margin="7dp"
    android:layout_height="100dp"/>
<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerVertical="true"
    android:layout_margin="7dp"
    android:layout_toEndOf="@+id/progressBar"
    android:text="Loading..." />
</RelativeLayout>

在你的代码中: 只需执行var dialog = progressdialog。progressdialog (context)

显示方法:dialog.show()

隐藏方法:dialog.dismiss()

Kotlin和androidx DialogFragment的另一个解决方案

通过使用DialogFragment,你不必每次都在需要显示对话框的每个屏幕上调整窗口的大小,我认为这是一个更干净的解决方案

创建对话框类


class BaseProgressDialog : DialogFragment() {

    companion object {
        const val DIALOG_TAG = "BaseProgressDialogFragment"
    }

    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
        return activity?.let {
            val builder = AlertDialog.Builder(it, R.style.MainAlertDialog)
            val inflater = requireActivity().layoutInflater
            val dialogView = inflater.inflate(R.layout.progress_dialog, null)

            builder.setView(dialogView)
            builder.create()
        } ?: throw IllegalStateException("Activity cannot be null")
    }

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        dialog?.setCanceledOnTouchOutside(false)
        dialog?.setCancelable(false)
        return super.onCreateView(inflater, container, savedInstanceState)
    }

    override fun onResume() {
        super.onResume()
        val size = resources.getDimensionPixelSize(R.dimen.size_80dp)
        dialog?.window?.setLayout(size, size)
    }
}

在styles.xml中创建样式

<style name="MainAlertDialog" parent="Theme.AppCompat.Light.Dialog.Alert">
    <item name="android:windowBackground">@drawable/bg_alert_dialog</item>
</style>

为对话框bg_alert_dialog.xml创建背景

<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="?attr/colorSecondary"/>
    <corners android:radius="@dimen/radius_10dp" />
</shape>

为对话框progress_dialog.xml创建布局

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/bg_alert_dialog"
    android:gravity="center"
    android:orientation="vertical"
    android:padding="@dimen/padding_16dp">

    <com.google.android.material.progressindicator.CircularProgressIndicator
        android:layout_width="@dimen/size_40dp"
        android:layout_height="@dimen/size_40dp"
        android:indeterminate="true"
        app:indicatorColor="?attr/colorPrimary" />

</LinearLayout>

调用片段中的对话框

private var progressDialog = BaseProgressDialog()
activity?.let {
   progressDialog.show(it.supportFragmentManager, BaseProgressDialog.DIALOG_TAG)
}

这是它看起来的样子:

你可以使用wasabeef库来使用SpotDialog,你可以从下面的链接找到完整的教程:

Android中的SpotsDialog示例

创建一个带有进度条和其他视图的xml文件,并使用此xml文件或Alertdialog派生类扩展派生Dialog类视图。在其他解决方案中已详细提供。 但是如果你想要一个解或者存在的库。我找到了这两个。

https://github.com/Livin21/MissMe https://github.com/skydoves/ProgressView

这些都是完美的,而且是根据需要来做的。

下面是我的不确定进度对话框版本:

layout_loading_dialog.xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    xmlns:tools="http://schemas.android.com/tools"
    android:orientation="horizontal"
    android:padding="20dp">

    <ProgressBar
        android:id="@+id/progressBar"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginEnd="10dp"
        android:layout_marginRight="10dp"
        android:layout_weight="1" />

    <TextView
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="4"
        android:gravity="center"
        android:textAlignment="textStart"
        android:id="@+id/message"
        tools:text="Please wait..." />
</LinearLayout>

IndeterminateProgressDialog.kt:

class IndeterminateProgressDialog(context: Context) : AlertDialog(context) {
    private val messageTextView: TextView

    init {
        val view = LayoutInflater.from(context).inflate(R.layout.layout_loading_dialog, null)
        messageTextView = view.findViewById(R.id.message)
        setView(view)
    }

    override fun setMessage(message: CharSequence?) {
        this.messageTextView.text = message.toString()
    }

}

用法:

   val dialog = IndeterminateProgressDialog(context)
                    dialog.setMessage("Please wait...")
                    dialog.setCanceledOnTouchOutside(false)
                    dialog.setCancelable(false)
                    dialog.show()