progressbar indeterminate horizontal bar alternative android progressdialog android-progressbar

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



progress dialog alternative android (16)

Esta clase quedó en desuso 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. link

Está en desuso en Android O debido al nuevo estándar de interfaz de usuario de Google

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

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


Puedes usar esta class que escribí. Ofrece solo las funciones básicas. Si desea un ProgressDialog completamente funcional, utilice esta library 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 actividad onBackPressed()

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


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

"Deprecated" 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 https://developer.android.com/reference/android/widget/ProgressBar.html , que puede integrarse en la interfaz de usuario de su aplicación.

Ventaja

Yo personalmente diría que ProgressBar tiene ventaja sobre los dos. ProgressBar es 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.


Bueno, si realmente quieres ir en contra de su voluntad, aún puedes usar Sweet Alert Dialog o crear uno por tu 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(); }


Como se menciona en la link la alternativa es ProgressBar . El aspecto de ProgressDialog se puede replicar colocando un ProgressBar en un AlertDialog .

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 una ProgressBar en su Layout .


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.



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 cuadro de 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


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. El control de carga no muestra la cantidad de contenido que se ha cargado o queda por cargar. 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 mostrando primero las pantallas básicas de la interfaz de usuario. Luego, el contenido cargado se rellena gradualmente en la pantalla.

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

Hay un buen article sobre esto que será beneficioso para otras personas.



Quizás esta guide pueda ayudar.

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


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 de 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 su código : Just do var dialog = ProgressDialog.progressDialog(context)

Para mostrar: dialog.show()

Para ocultar: dialog.dismiss()


Sí, en el API level 26 está en desuso, puede usar la progressbar .

Use este código para crear mediante programación:

Diseño RelativeLayout = findViewById (R.id.display); // especifique aquí Id. de diseño raíz

(o)

Diseño relativo de diseño = findViewById (esto);

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

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 android.R.attr.progressBarStyleSmall a android.R.attr.progressBarStyleHorizontal .

El siguiente código de línea funciona solo por encima de API 21 progressBar.setProgressTintList (ColorStateList.valueOf (Color.RED));

Solución 2: otra forma

<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

Para más detalles:

1.Referencia uno

2 referencia dos

Espero que esto te pueda ayudar.


Simplemente puede diseñar una interfaz xml para su barra de progreso y pasarla como una vista a AlertDialog, luego mostrar o cerrar 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.

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

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.


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


puede usar AlertDialog como ProgressDialog consulte el código siguiente para 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: