不推荐使用ProgressDialog。使用的替代方法是什么?

时间:2017-07-28 12:01:27

标签: android progressdialog android-progressbar

我看到ProgressDialog现已弃用。除了ProgressBar之外,还有什么可以替代使用它。 我正在使用android studio版本2.3.3。

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

20 个答案:

答案 0 :(得分:155)

是的,在API level 26已弃用,您可以使用progressbar

使用此代码以编程方式创建:

  

RelativeLayout layout = findViewById(R.id.display); //在此指定根布局ID

     

<强>(或)

     

RelativeLayout layout = findViewById(this);

progressBar = new ProgressBar(youractivity.this,null,android.R.attr.progressBarStyleLarge);
 RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(100,100);
 params.addRule(RelativeLayout.CENTER_IN_PARENT);
 layout.addView(progressBar,params);
 progressBar.setVisibility(View.VISIBLE);  //To show ProgressBar
 progressBar.setVisibility(View.GONE);     // To Hide ProgressBar

要禁用用户互动,您只需添加以下内容即可  代码

getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE,
                           WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);

要恢复用户互动,您只需添加以下代码

  

getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);

仅供将来参考,将 android.R.attr.progressBarStyleSmall 更改为 android.R.attr.progressBarStyleHorizontal

  

以下行代码仅适用于API 21          的 progressBar.setProgressTintList(ColorStateList.valueOf(Color.RED));

解决方案2:另一种方式

<ProgressBar
        android:id="@+id/progressbar"
        style="?android:attr/progressBarStyleHorizontal"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:indeterminate="true"
        android:max="100"
        android:backgroundTint="@color/white"
        android:layout_below="@+id/framelauout"
        android:indeterminateTint="#1a09d6"
        android:layout_marginTop="-7dp"/>

<强> Activity.java

progressBar = (ProgressBar) findViewById(R.id.progressbar);
 `progressBar.setVisibility(View.VISIBLE);`// To Show ProgressBar 
 `progressBar.setVisibility(View.INVISIBLE);` //To Hide ProgressBar

  

了解更多详情:

1.Reference one

   

2.Reference Two

我希望这对你有所帮助。

答案 1 :(得分:27)

  

此类在API级别26中已弃用.ProgressDialog是一种模式   对话框,阻止用户与应用程序交互。代替   使用这个类,你应该使用像这样的进度指示器   ProgressBar,可以嵌入到您应用的UI中。或者,   您可以使用通知来通知用户任务的进度。 link

由于Android O新的用户界面标准

,它已在Google弃用

答案 2 :(得分:17)

您可以简单地为进度条设计一个xml界面,并将其作为视图传递给AlertDialog,然后随时显示或关闭对话框。

<强> progress.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:padding="13dp"
    android:layout_centerHorizontal="true"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">

    <ProgressBar
        android:id="@+id/loader"
        android:layout_marginEnd="5dp"
        android:layout_width="45dp"
        android:layout_height="45dp" />
    <TextView
        android:layout_width="wrap_content"
        android:text="Loading..."
        android:textAppearance="?android:textAppearanceSmall"
        android:layout_gravity="center_vertical"
        android:id="@+id/loading_msg"
        android:layout_toEndOf="@+id/loader"
        android:layout_height="wrap_content" />

</LinearLayout>

显示进度对话框的代码。只需复制此代码并将其粘贴到您的片段中即可。

   private void setDialog(boolean show){
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        //View view = getLayoutInflater().inflate(R.layout.progress);
        builder.setView(R.layout.progress);
        Dialog dialog = builder.create();
        if (show)dialog.show();
        else dialog.dismiss();
    }

然后只要你想要显示progressdialog就调用该方法,并将true作为参数传递给它来显示它,或者将false传递给false以关闭对话框。

答案 3 :(得分:13)

您可以AlertDialog使用ProgressDialog作为ProgressDialog的以下代码。每当您显示进度对话框时,都需要调用此函数。

<强>代码:

    public void setProgressDialog() {

    int llPadding = 30;
    LinearLayout ll = new LinearLayout(this);
    ll.setOrientation(LinearLayout.HORIZONTAL);
    ll.setPadding(llPadding, llPadding, llPadding, llPadding);
    ll.setGravity(Gravity.CENTER);
    LinearLayout.LayoutParams llParam = new LinearLayout.LayoutParams(
            LinearLayout.LayoutParams.WRAP_CONTENT,
            LinearLayout.LayoutParams.WRAP_CONTENT);
    llParam.gravity = Gravity.CENTER;
    ll.setLayoutParams(llParam);

    ProgressBar progressBar = new ProgressBar(this);
    progressBar.setIndeterminate(true);
    progressBar.setPadding(0, 0, llPadding, 0);
    progressBar.setLayoutParams(llParam);

    llParam = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,
            ViewGroup.LayoutParams.WRAP_CONTENT);
    llParam.gravity = Gravity.CENTER;
    TextView tvText = new TextView(this);
    tvText.setText("Loading ...");
    tvText.setTextColor(Color.parseColor("#000000"));
    tvText.setTextSize(20);
    tvText.setLayoutParams(llParam);

    ll.addView(progressBar);
    ll.addView(tvText);

    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setCancelable(true);
    builder.setView(ll);

    AlertDialog dialog = builder.create();
    dialog.show();
    Window window = dialog.getWindow();
    if (window != null) {
        WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams();
        layoutParams.copyFrom(dialog.getWindow().getAttributes());
        layoutParams.width = LinearLayout.LayoutParams.WRAP_CONTENT;
        layoutParams.height = LinearLayout.LayoutParams.WRAP_CONTENT;
        dialog.getWindow().setAttributes(layoutParams);
    }
}

<强>输出:

enter image description here

答案 4 :(得分:12)

ProgressBar非常简单易用, 我打算使它与简单进度对话框相同。 第一步是您可以为要显示的对话框设置xml布局,假设我们将此布局命名为

  

layout_loading_dialog.xml

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

    <TextView
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="4"
        android:gravity="center"
        android:text="Please wait! This may take a moment." />
</LinearLayout>

下一步是创建AlertDialog,它将使用ProgressBar显示此布局

AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setCancelable(false); // if you want user to wait for some process to finish,
builder.setView(R.layout.layout_loading_dialog);
AlertDialog dialog = builder.create();

现在剩下的就是在单击事件中显示和隐藏此对话框 像这样

dialog.show(); // to show this dialog
dialog.dismiss(); // to hide this dialog

就这样,它应该可以工作,因为您可以看到,实现ProgressBar而不是ProgressDialog非常简单容易。 现在您可以在Handler或ASyncTask中显示/关闭此对话框,具体取决于您的需求

答案 5 :(得分:11)

如果你真的想违背他们的意愿,你仍然可以使用Sweet Alert Dialog或自己创建一个。

progress_dialog_layout

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TableRow
        android:layout_centerInParent="true"
        android:layout_width="match_parent"
        android:layout_height="64dp" >

        <ProgressBar
            android:id="@+id/progressBar2"
            style="?android:attr/progressBarStyle"
            android:layout_width="wrap_content"
            android:layout_height="match_parent" />

        <TextView
            android:gravity="center|left"
            android:id="@+id/textView9"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:textColor="@color/black"
            android:textSize="18sp"
            android:text="Downloading data. Please wait.." />
    </TableRow>
</RelativeLayout>

Java代码:

AlertDialog b;
AlertDialog.Builder dialogBuilder;

public void ShowProgressDialog() {
dialogBuilder = new AlertDialog.Builder(DataDownloadActivity.this);
LayoutInflater inflater = (LayoutInflater) getSystemService( Context.LAYOUT_INFLATER_SERVICE );
            View dialogView = inflater.inflate(R.layout.progress_dialog_layout, null);
            dialogBuilder.setView(dialogView);
            dialogBuilder.setCancelable(false);
            b = dialogBuilder.create();
            b.show();
        }

        public void HideProgressDialog(){

            b.dismiss();
        }

答案 6 :(得分:8)

是的,不推荐使用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"
    android:layout_above="@+id/no_jobs_pickups"/>
<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()

答案 7 :(得分:6)

ProgressBar是ProgressDialog的最佳替代方案。 用于指示操作进度的用户界面元素。

有关详细信息,请参阅 Google doc: https://developer.android.com/reference/android/widget/ProgressBar.html

答案 8 :(得分:4)

documentation page所述,替代 ProgressBar。可以通过将ProgressDialog放入ProgressBar来复制AlertDialog的外观。

你仍然可以使用它,但Android不希望你使用它,这就是它被弃用的原因。因此,您应该考虑以其他方式解决问题,例如将ProgressBar嵌入Layout

答案 9 :(得分:3)

您不需要导入任何自定义库。

我更喜欢使用现代的AlertDialog,所以这是{strong> Kotlin 版本,用于解决Kishan Donga在此页面中发布的出色答案。

科特琳代码:

fun setProgressDialog(context:Context, message:String):AlertDialog {
    val llPadding = 30
    val ll = LinearLayout(context)
    ll.orientation = LinearLayout.HORIZONTAL
    ll.setPadding(llPadding, llPadding, llPadding, llPadding)
    ll.gravity = Gravity.CENTER
    var llParam = LinearLayout.LayoutParams(
                  LinearLayout.LayoutParams.WRAP_CONTENT,
                  LinearLayout.LayoutParams.WRAP_CONTENT)
    llParam.gravity = Gravity.CENTER
    ll.layoutParams = llParam

    val progressBar = ProgressBar(context)
    progressBar.isIndeterminate = true
    progressBar.setPadding(0, 0, llPadding, 0)
    progressBar.layoutParams = llParam

    llParam = LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,
                        ViewGroup.LayoutParams.WRAP_CONTENT)
    llParam.gravity = Gravity.CENTER
    val tvText = TextView(context)
    tvText.text = message
    tvText.setTextColor(Color.parseColor("#000000"))
    tvText.textSize = 20.toFloat()
    tvText.layoutParams = llParam

    ll.addView(progressBar)
    ll.addView(tvText)

    val builder = AlertDialog.Builder(context)
    builder.setCancelable(true)
    builder.setView(ll)

    val dialog = builder.create()
    val window = dialog.window
    if (window != null) {
        val layoutParams = WindowManager.LayoutParams()
        layoutParams.copyFrom(dialog.window?.attributes)
        layoutParams.width = LinearLayout.LayoutParams.WRAP_CONTENT
        layoutParams.height = LinearLayout.LayoutParams.WRAP_CONTENT
                dialog.window?.attributes = layoutParams
    }
    return dialog
}

用法:

val dialog = setProgressDialog(this, "Loading..")
dialog.show()

输出:

enter image description here

答案 10 :(得分:3)

  API级别26中已弃用

ProgressDialog

"Deprecated" 指的是正在被新版本替换的函数或元素。

  

ProgressDialog是一个模式对话框,可以防止用户与之交互   该应用程序。您应该使用进度而不是使用此类   像ProgressBar这样的指标,可以嵌入到您的应用中   UI。

优势

我个人会说 ProgressBar 优于两者。 ProgressBar 是一个用户界面元素,用于指示操作。以非中断方式向用户显示进度条。在应用的用户界面中显示进度条。

答案 11 :(得分:3)

也许这guide可以帮到你。

通常我更喜欢使用指标制作自定义AlertDialogs。它解决了诸如自定义App视图之类的问题。

答案 12 :(得分:2)

  

您可以使用我写的class。它只提供基本功能   功能。如果您想要一个功能齐全的ProgressDialog,那么请使用   这个轻量级library

Gradle Setup

将以下依赖项添加到module / build.gradle:

compile 'com.lmntrx.android.library.livin.missme:missme:0.1.5'

如何使用它?

用法类似于原始ProgressDialog

ProgressDialog progressDialog = new 
progressDialog(YourActivity.this);
progressDialog.setMessage("Please wait");
progressDialog.setCancelable(false);
progressDialog.show();
progressDialog.dismiss();

NB :您必须覆盖活动onBackPressed()

Java8实现:

@Override
public void onBackPressed() {
    progressDialog.onBackPressed(
            () -> {
                super.onBackPressed();
                return null;
            }
    );
}

Kotlin实施:

override fun onBackPressed() {
   progressDialog.onBackPressed { super.onBackPressed() }
}
  • 有关完整实施的信息,请参阅Sample App
  • 可以找到完整的文档here

答案 13 :(得分:1)

我使用来自https://github.com/Q115/DelayedProgressDialog的DelayedProgressDialog它与ProgressDialog的作用相同,如果有必要,还会带来延迟的好处。

使用它类似于Android O之前的ProgressDialog:

DelayedProgressDialog progressDialog = new DelayedProgressDialog();
progressDialog.show(getSupportFragmentManager(), "tag");

答案 14 :(得分:1)

这对其他人有帮助。

许多流行的应用程序都有不同的方法来显示网络请求,文件加载等任何内容的进度。加载微调器没有显示已加载或剩余加载的内容量。从UI / UX的角度来看,存在一段不确定的时期。许多流行的应用程序(Facebook,Linkedin等)通过首先显示裸机UI显示解决了这个问题。然后,在屏幕上逐渐填充加载的内容。

我已将[{3}}用于我的应用来解决此问题。

关于此问题有一个很好的shimmer,对其他人有益

答案 15 :(得分:0)

使用这个简单的技巧

//初始化

val dialog : Dialog = Dialog(this)

//设置布局

dialog.setContentView(R.layout.view_loading)

//显示对话框

dialog.show()

//去除白色背景

dialog.window.setbackgroundDrawable(ColorDrawable(0))

答案 16 :(得分:0)

这是@Han 建议的 ProgressDialog 类的 kotlin 版本

class ProgressDialog(context: Context) : Dialog(context) {
    init {
        @SuppressLint("InflateParams")
        val inflate = LayoutInflater.from(context).inflate(R.layout.dialog_progress, null)
        setContentView(inflate)
        setCancelable(false)
        window!!.setBackgroundDrawable(
            ColorDrawable(Color.TRANSPARENT)
        )
    }
}

答案 17 :(得分:0)

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

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

答案 18 :(得分:0)

在进度对话框中,用户无法执行任何类型的工作。在进度对话框期间,所有后台进程均已停止。因此,建议使用用户进度条而不是进度对话框。

答案 19 :(得分:0)

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

  

SpotsDialog Example in Android