ProgressDialog está en desuso. ¿Cuál es el alternativo para usar?

215

Me he dado cuenta de que ProgressDialogahora está en desuso. ¿Cuál sería una alternativa para usar en lugar de eso ProgressBar? Estoy usando la versión de Android Studio 2.3.3.

ProgressDialog progressDialog=new ProgressDialog(this);
progressDialog.show();
Sunil P
fuente
Posible duplicado de ProgressDialog está en desuso
Lalit Jadav

Respuestas:

196

Sí, está en API level 26desuso. En cambio, puedes usar progressBar.

Para crearlo mediante programación:

Primero obtenga una referencia al diseño raíz

RelativeLayout layout = findViewById(R.id.display);  //specify here Root layout Id

o

RelativeLayout layout = findViewById(this);

Luego agrega la barra de progreso

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

Para mostrar la barra de progreso

progressBar.setVisibility(View.VISIBLE);

Para ocultar la barra de progreso

progressBar.setVisibility(View.GONE);

Para deshabilitar la interacción del usuario solo necesita agregar el siguiente código

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

Para recuperar la interacción del usuario, solo necesita agregar el siguiente código

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

Solo para referencia futura, cambie el android.R.attr.progressBarStyleSmalla android.R.attr.progressBarStyleHorizontal.

El siguiente código solo funciona arriba API level 21

progressBar.setProgressTintList(ColorStateList.valueOf(Color.RED));

Para crearlo a través de xml:

<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"/>

En su actividad

progressBar = (ProgressBar) findViewById(R.id.progressbar);

Mostrar / ocultar la barra de progreso es lo mismo

 progressBar.setVisibility(View.VISIBLE); // To show the ProgressBar 
 progressBar.setVisibility(View.INVISIBLE); // To hide the ProgressBar

Aquí hay una imagen de muestra de cómo se vería:

Para más detalles:
1. Referencia uno
2. Referencia dos

Gowthaman M
fuente
Es como si estuvieras usando esto y digas que sí, finalmente, el diálogo de progreso está en desuso, por lo que puedo mostrar mi potencial al mundo: D, es broma, muchas gracias por esa respuesta detallada.
Mohamed Hajr
1
pero ¿cómo configurar el mensaje ()?
reverie_ss
actualice el código xml a "@android: color / white"
musterjunk
Para obtener la barra horizontal, utilice: ProgressBar progressBar = new ProgressBar (youractivity.this, null, android.R.attr.progressBarStyleHorizontal); progressBar.setIndeterminate (true);
taranjeetsapra
45

se puede utilizar AlertDialogcomo ProgressDialogreferencia por debajo de código para el ProgressDialog. A esta función debe llamar siempre que muestre un cuadro de diálogo de progreso.

Código:

    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);
    }
}

Salida:

ingrese la descripción de la imagen aquí

Kishan Donga
fuente
¿Cómo descartarlo?
Jay Dangar
1
haga una clase base como BaseActivity y luego, después de agregar este fragmento de código, también agregue un método para descartar el diálogo, pero para eso, debe definir el objeto 'AlertDialog dialog' globalmente
Kishan Donga
luego simplemente llame al método dialog.dismiss () dentro de su método de diálogo hide.
Kishan Donga
1
Todo está bien, pero al tocar cualquier parte del cuadro de diálogo de la pantalla se descarta. El servicio llama en curso y el suer puede descartarlo y jugar con la interfaz de usuario, lo que no es bueno, ¿alguna solución?
Vivek Kumar el
Puede configurarlo como no cancelable, pero si gira el dispositivo o usa la pantalla dividida, se descartaría de todos modos y el usuario puede interactuar con la interfaz de usuario que no está lista. Quizás AlertDialogno debería usarse aquí.
Meow Cat 2012
30

Esta clase fue desaprobada en el nivel 26 de API. ProgressDialog es un diálogo modal que evita que el usuario interactúe con la aplicación. En lugar de usar esta clase, debe usar un indicador de progreso como ProgressBar, que puede integrarse en la interfaz de usuario de su aplicación. Alternativamente, puede usar una notificación para informar al usuario del progreso de la tarea. enlace

Está en desuso Android Opor el Googlenuevo estándar de interfaz de usuario

Oussema Aroua
fuente
1
"Esta clase ha quedado en desuso en el nivel 26 de API" se utiliza en lugar de una fecha. No quieren que lo uses más. Sí, se debe a los nuevos estándares de UI, pero se aplican a todos los niveles de API ...
creativecreatorormaybenot
28
"Está en desuso en Android O debido al nuevo estándar de interfaz de usuario de Google" - enlace por favor nuevo estándar de interfaz de usuario
Ajay S
22
¿Y la razón para despreciarlo es porque bloquea la entrada del usuario? A veces me pregunto qué tipo de polvo están inhalando los ingenieros de Google. Es mucho más fácil usar un diálogo de bloqueo que tener que ocultar / deshabilitar los controles de entrada y luego habilitar una barra de progreso. Pensamiento tonto por parte de Google.
TheRealChx101
@ TheRealChx101 La interfaz de usuario de Android está diseñada para hacer que el usuario tenga una falsa sensación de libertad a costa de costosas soluciones para evitar errores fatales que resulten de ella. Espere hasta que obtenga los permisos y lo que los operadores hayan pagado a Google para decirle que puede y no puede acceder.
Carrito abandonado el
3
Supongo que están más interesados ​​en prevenir el abuso de los diálogos modales: a veces se muestra que hacen que el usuario espere el final de una operación en circunstancias en las que el usuario no debería tener que esperar, pero podría continuar haciendo otras cosas , por lo que hacerlos esperar innecesariamente degrada la experiencia del usuario. No obstante, hay muchas circunstancias en las que no hay otra opción para el usuario, sino esperar a que se complete una operación, por lo que estoy de acuerdo en que debería haber un método estándar no obsoleto para estos casos en lugar de obligar a cada desarrollador a implementar el suyo.
Fran Marzoa
26

Simplemente puede diseñar una interfaz xml para su barra de progreso y pasarla como una vista a AlertDialog, luego mostrar o descartar el diálogo en cualquier momento que lo desee.

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>

El código de código que muestra el cuadro de diálogo de progreso. Simplemente copie este código y péguelo en su fragmento.

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

Luego, simplemente llame al método cada vez que desee mostrar el diálogo de progreso y pase verdadero como argumento para mostrarlo o falso para descartar el diálogo.

DevMike01
fuente
2
@Alok Rajasukumaran parece que estás usando actividad, simplemente reemplázala thispara que se vea así AlertDialog.Builder builder = new AlertDialog.Builder(this);. Asegúrate de que estás copiando el código correcto.
DevMike01
1
layout_toEndOfse puede eliminar ya que no es paraLinearLayout
Marcar
21

ProgressBar es muy simple y fácil de usar, tengo la intención de hacer esto igual que el diálogo de progreso simple. el primer paso es que puede hacer un diseño xml del diálogo que desea mostrar, digamos que nombramos este diseño

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>

El siguiente paso es crear AlertDialog que mostrará este diseño con 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();

ahora todo lo que queda es mostrar y ocultar este diálogo en nuestros eventos de clic como este

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

y eso es todo, debería funcionar, como puede ver, es muy simple y fácil de implementar ProgressBar en lugar de ProgressDialog. ahora puede mostrar / descartar este cuadro de diálogo en Handler o ASyncTask, depende de su necesidad

Syed Naeem
fuente
Por favor, cambie progress_dialog.show();a builder.show();. Gracias.
Matheus Miranda el
2
He cambiado el nombre al objeto AlertDialog correcto en show()/ dismiss(), pero no lo puse builder.show()porque para descartarlo tendríamos que hacerlo, lo dialog.dismiss()cual es un poco confuso para alguien a quien le gusta mantener su código simple y fácil de entender, y también porque builder.show()devuelve el AlertDialogobjeto, y tendremos que guardar esa referencia como AlertDialog dialog = builder.show();luego dialog.dismiss(), es más fácil tener un builder.create()retorno en algún AlertDialogobjeto, y luego usar ese objeto para mostrar y ocultar el diálogo
Syed Naeem
Podemos usar "runOnUiThread (new Runnable () {@Override public void run () {dialog.show/dismiss ();}});", si el hilo que llama no es el hilo principal de la interfaz de usuario. (Útil cuando usamos para llamar desde WebView -. Métodos shouldoverride)
SHS
15

Sí, ProgressDialog está en desuso pero Dialog no.

Puede inflar su propio archivo XML (que contiene una barra de progreso y un texto de carga) en su objeto de diálogo y luego mostrarlo u ocultarlo usando las funciones show()y dismiss(). Aquí hay un ejemplo (Kotlin):

Clase 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>

En tu código : solo hazlovar dialog = ProgressDialog.progressDialog(context)

Mostrar: dialog.show()

Esconder: dialog.dismiss()

Han
fuente
11

Bueno, si realmente quiere ir en contra de su voluntad, aún puede usar Sweet Alert Dialog o crear uno por su cuenta.

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>

Código 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();
        }
Ramesh Jaya
fuente
2
He tenido experiencias terribles con SweetAlertDialog en un entorno de producción, tenga mucho cuidado ya que se escapa de una ventana a otra.
Jeremy
para mi HideProgressno hace nada.
Saeed Neamati
1
¿Por qué usar una biblioteca solo para mostrar un diálogo de progreso?
Khemraj
6

No necesita importar ninguna biblioteca personalizada.

Prefiero usar el moderno, AlertDialogasí que esta es la versión de Kotlin para la gran respuesta publicada por Kishan Donga en esta página.

Código de Kotlin:

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
}

Uso:

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

Salida:

ingrese la descripción de la imagen aquí

Alessandro Ornano
fuente
¿Cómo usar en fragmento? ¿Qué es el contexto fragmentado?
roghayeh hosseini
Por lo general, en su fragmento puede obtener su vista actual, por lo que el contexto debería ser:view!!.context
Alessandro Ornano
4

Como se menciona en la página de documentación, la alternativa es ProgressBar . ProgressDialogLa apariencia se puede replicar colocando ProgressBarunAlertDialog .

Todavía puede usarlo, pero Android no quiere que lo use, es por eso que está en desuso. Por lo tanto, debe considerar resolver su problema de otra manera, como incrustar un ProgressBaren su Layout.

creativecreatorormaybenot
fuente
@PeterHaddad Funciona "normalmente" en la API 28 en mi proyecto y lo mismo que en las API inferiores. Como sugiere la desaprobación, ya no es compatible y puede que no funcione en el futuro.
DMonkey
3

ProgressDialog quedó en desuso en el nivel 26 de API.

"Deprecated" se refiere a funciones o elementos que están en proceso de ser reemplazados por otros más nuevos.

ProgressDialog es un diálogo modal que evita que el usuario interactúe con la aplicación. En lugar de usar esta clase, debe usar un indicador de progreso como ProgressBar, que se puede incrustar en la interfaz de usuario de su aplicación.

Ventaja

Yo personalmente diría que ProgressBartiene la ventaja sobre los dos. ProgressBares un elemento de interfaz de usuario que indica el progreso de una operación. Mostrar barras de progreso a un usuario de manera no disruptiva . Muestra la barra de progreso en la interfaz de usuario de tu aplicación.

IntelliJ Amiya
fuente
2

Uso DelayedProgressDialog de https://github.com/Q115/DelayedProgressDialog Hace lo mismo que ProgressDialog con el beneficio adicional de un retraso si es necesario.

Usarlo es similar a ProgressDialog antes de Android O:

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

Puedes usar esta clase que escribí. Ofrece solo las funciones básicas. Si desea un ProgressDialog completamente funcional, utilice esta biblioteca ligera .

Configuración de Gradle

Agregue la siguiente dependencia al módulo / build.gradle:

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

¿Cómo usarlo?

El uso es similar al original ProgressDialog

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

NB : debe anular la actividadonBackPressed()

Implementación de Java8:

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

Implementación de Kotlin:

override fun onBackPressed() {
   progressDialog.onBackPressed { super.onBackPressed() }
}
Livin Mathew
fuente
1

Quizás esta guía te pueda ayudar.

Por lo general, prefiero hacer AlertDialogs personalizados con indicadores. Resuelve problemas como la personalización de la vista de la aplicación.

Dmitry Ushkevich
fuente
1

Puede ayudar a otras personas.

Muchas aplicaciones populares tienen un enfoque diferente para mostrar el progreso de cualquier cosa, como solicitud de red, carga de archivos, etc. Hay un período de incertidumbre que es malo en la perspectiva de UI / UX. Muchas aplicaciones populares (Facebook, Linkedin, etc.) han resuelto este problema al mostrar primero la interfaz de usuario básica. Luego, el contenido cargado se rellena gradualmente en la pantalla.

He usado el brillo para mis aplicaciones para resolver este problema.

Hay un buen artículo sobre esto que será beneficioso para otras personas.

Rajesh Khadka
fuente
0

En el diálogo de progreso, el usuario no puede hacer ningún tipo de trabajo. Todos los procesos en segundo plano se detienen durante el diálogo de progreso. Por lo tanto, es recomendable usar la barra de progreso del usuario en lugar del diálogo de progreso.

Nevil Ghelani
fuente