¿La mejor manera de mostrar un indicador de carga / progreso?


147

¿Cuál es la mejor manera de mostrar un control de carga mientras la aplicación espera una respuesta del servidor?

¿Se puede hacer esto mediante programación? ¿Para que no tenga que agregar el control de carga en el archivo xml?

Respuestas:


293

ProgressDialog está en desuso de Android Oreo. Use ProgressBar en su lugar

ProgressDialog progress = new ProgressDialog(this);
progress.setTitle("Loading");
progress.setMessage("Wait while loading...");
progress.setCancelable(false); // disable dismiss by tapping outside of the dialog
progress.show();
// To dismiss the dialog
progress.dismiss();

O

ProgressDialog.show(this, "Loading", "Wait while loading...");

Leer más aquí.

Por cierto, Spinner tiene un significado diferente en Android. (Es como el menú desplegable de selección en HTML)


1
Desde el sitio web para desarrolladores de Android: STYLE_SPINNER Crea un ProgressDialog con una barra de progreso circular y giratoria.
Tequilaman

34
Esto funciona, pero cuando probé esto, pude cerrar el diálogo tocando la pantalla fuera de él o presionando el botón Atrás . Lo arreglé agregando una llamada a progress.setCancelable(false);.
Sam

1
Gracias por el comentario de abajo. Me estaba volviendo loco porque estaba tratando de hacer que 'spinner' funcione por una hora.
Can Poyrazoğlu

excelente, ahora puedo usar el diálogo de progreso
Faisal

10

17

ProgressDialog ha quedado en desuso desde el nivel API 26 https://developer.android.com/reference/android/app/ProgressDialog.html

Incluyo una barra de progreso en mi diseño

   <ProgressBar
        android:layout_weight="1"
        android:id="@+id/progressBar_cyclic"
        android:visibility="gone"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:minHeight="40dp"
        android:minWidth="40dp" />

y cambie su visibilidad a .GONE | .VISIBLE según el caso de uso.

    progressBar_cyclic.visibility = View.VISIBLE

No estoy seguro, pero ¿la barra de progreso se ejecuta siempre en segundo plano (solo oculta de la interfaz de usuario) después de hacerla invisible?
Shambhu

16

Utilizar ProgressDialog

ProgressDialog.show(Context context, CharSequence title, CharSequence message);

ingrese la descripción de la imagen aquí

Sin embargo, esto se considera como un anti patrón hoy (2013): http://www.youtube.com/watch?v=pEGWcMTxs3I


12
@artworkad シ Entonces, ¿qué aspecto de esto se considera malo? ¿Es la respuesta aceptada un ejemplo del mismo antipatrón? ¿Y qué se recomienda hacer en su lugar? Vincular a un video externo sobre múltiples problemas de UX realmente no mejora esta respuesta.
LarsH


9

En realidad, si está esperando la respuesta de un servidor, debe hacerse mediante programación. Puede crear un cuadro de diálogo de progreso y descartarlo, pero, de nuevo, esa no es "la forma de Android".

Actualmente el método recomendado es usar un DialogFragment :

public class MySpinnerDialog extends DialogFragment {

    public MySpinnerDialog() {
        // use empty constructors. If something is needed use onCreate's
    }

    @Override
    public Dialog onCreateDialog(final Bundle savedInstanceState) {

        _dialog = new ProgressDialog(getActivity());
        this.setStyle(STYLE_NO_TITLE, getTheme()); // You can use styles or inflate a view
        _dialog.setMessage("Spinning.."); // set your messages if not inflated from XML

        _dialog.setCancelable(false);  

        return _dialog;
    }
}

Luego, en su actividad, configure su administrador de fragmentos y muestre el cuadro de diálogo una vez que se inició la espera para el servidor:

FragmentManager fm = getSupportFragmentManager();
MySpinnerDialog myInstance = new MySpinnerDialog();
}
myInstance.show(fm, "some_tag");

Una vez que su servidor haya respondido completo, lo descartará:

myInstance.dismiss()

Recuerde que el diálogo de progreso es un control giratorio o una barra de progreso según los atributos, lea más en la guía de la API


ProgressDialog.show (contexto de contexto, título de CharSequence, mensaje de CharSequence); Pasar el parámetro de título como una cadena vacía elimina el título: ProgressDialog.show (contexto, "", "Cargando ..");
Rajendra

1
Buen ejemplo, aunque todavía era posible para mí usar el botón Atrás. Creo que se debe a su variable dlgAlert (¿y de dónde viene eso por cierto? :)). De todos modos, ya que está extendiendo el fragmento de diálogo, puede llamar a setCancelable (falso) y funcionará.
Lasse

Confirmar transacciones fragmentarias en un momento indeterminado cuando el servidor devuelve una respuesta no parece ser infalible. Por ejemplo, cuando vuelve la respuesta, la actividad que aloja el fragmento puede estar en un estado incorrecto. ¿Alguna solución?
Jonas

Asegúrese de importar android.support.v4.app.DialogFragment y no android.app.DialogFragment, o no puede usar getSupportFragmentManager (consulte stackoverflow.com/questions/27514338/… )
StCleezy


6

Así es como lo hice para que solo se pueda abrir un cuadro de diálogo de progreso a la vez. Basado en la respuesta de Suraj Bajaj

private ProgressDialog progress;



public void showLoadingDialog() {

    if (progress == null) {
        progress = new ProgressDialog(this);
        progress.setTitle(getString(R.string.loading_title));
        progress.setMessage(getString(R.string.loading_message));
    }
    progress.show();
}

public void dismissLoadingDialog() {

    if (progress != null && progress.isShowing()) {
        progress.dismiss();
    }
}

También tuve que usar

protected void onResume() {
    dismissLoadingDialog();
    super.onResume();
}

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.