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() }
}
- Consulte la aplicación de muestra para la implementación completa
- La documentación completa se puede encontrar here
link quedó en desuso en el nivel 26 de API.
refiere a funciones o elementos que están en proceso de ser reemplazados por otros más nuevos.
"Deprecated"
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 la mejor alternativa para ProgressDialog. Un elemento de la interfaz de usuario que indica el progreso de una operación.
Para obtener más información, consulte este documento de Google: https://developer.android.com/reference/android/widget/ProgressBar.html
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.
Puede usar SpotDialog utilizando la biblioteca wasabee, si puede encontrar el tutorial completo en el siguiente enlace:
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: