studio progressbar progreso llenar espera dialogo como cargando carga barra bar android progressdialog

android - progressbar - Cómo centrar el indicador de progreso en ProgressDialog fácilmente(cuando no se transfiere el título/texto)



progressbar no se ve android studio (8)

Hice algunas pruebas y creo que la mejor manera de lograrlo es haciendo un Dialog personalizado.

Aquí hay un ejemplo de lo que hice. Esto responderá a la pregunta número 2 pero le dará una idea de cómo solucionar la pregunta número 1.

public class MyProgressDialog extends Dialog { public static MyProgressDialog show(Context context, CharSequence title, CharSequence message) { return show(context, title, message, false); } public static MyProgressDialog show(Context context, CharSequence title, CharSequence message, boolean indeterminate) { return show(context, title, message, indeterminate, false, null); } public static MyProgressDialog show(Context context, CharSequence title, CharSequence message, boolean indeterminate, boolean cancelable) { return show(context, title, message, indeterminate, cancelable, null); } public static MyProgressDialog show(Context context, CharSequence title, CharSequence message, boolean indeterminate, boolean cancelable, OnCancelListener cancelListener) { MyProgressDialog dialog = new MyProgressDialog(context); dialog.setTitle(title); dialog.setCancelable(cancelable); dialog.setOnCancelListener(cancelListener); /* The next line will add the ProgressBar to the dialog. */ dialog.addContentView(new ProgressBar(context), new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); dialog.show(); return dialog; } public MyProgressDialog(Context context) { super(context, R.style.NewDialog); } }

Todos los métodos estáticos provienen de ProgressDialog.java enlace, nada extraño, pero la magia ocurre en el constructor. Comprueba que paso como parámetro un estilo. Ese estilo es el siguiente:

<?xml version="1.0" encoding="utf-8"?> <resources> <style name="NewDialog" parent="@android:Theme.Dialog"> <item name="android:windowFrame">@null</item> <item name="android:windowBackground">@android:color/transparent</item> <item name="android:windowIsFloating">true</item> <item name="android:windowContentOverlay">@null</item> <item name="android:windowTitleStyle">@null</item> <item name="android:windowAnimationStyle">@android:style/Animation.Dialog</item> <item name="android:windowSoftInputMode">stateUnspecified|adjustPan</item> <item name="android:backgroundDimEnabled">false</item> <item name="android:background">@android:color/transparent</item> </style> </resources>

El resultado de esto es un ProgressBar girando en el centro de la pantalla. Sin backgroundDim y sin el cuadro de Dialog .

Al llamar a progressDialog = ProgressDialog.show(this, null, null, true); por lo general, los desarrolladores solo desean mostrar la imagen de indicación de progreso, y normalmente esperarían estar centrados dentro de la ventana (al menos desde el punto de vista del diseño de la interfaz de usuario). Pero la imagen está demasiado a la izquierda, parece que todavía se está calculando un relleno / margen en el lado derecho para el texto (opcional) a la derecha, aunque no estamos pasando ningún texto como parámetro. Simplemente haría la vida un poco más fácil para un desarrollador :) Por lo tanto, no es necesario que creemos un cuadro de diálogo personalizado solo para que el indicador de progreso esté centrado de manera predeterminada.

(Presenté esto como una solicitud de función en http://code.google.com/p/android/issues/detail?id=9697 ; preste atención si también desea ver esto mejorado).

Ahora mis preguntas:

  1. ¿Cómo puedo centrar fácilmente la imagen de progreso sin tener que crear completamente mi propia clase de diálogo de alerta personalizada? ¿Algún parámetro que podría haber pasado por alto?

  2. Además, ¿cómo configurar el fondo a transparente?

También me estoy preguntando sobre esto: https://stackoverflow.com/questions/2866141/how-to-put-custom-animation-into-a-progressdialog No lo he probado aún, pero si no puedes crear un diseño personalizado animaciones, significa que si quieres un tipo de indicador de progreso animado, siempre necesitas extender la clase ProgressDialog? Sin embargo, al mirar la clase ProgressDialog, no encuentro nada más que drawables regulares ( ProgressDialog.java ), no están usando AnimatedDrawable allí.


Manera fácil y personalizable:

Definir animación: (res / drawable / loader_anim.xml)

<animated-rotate xmlns:android="http://schemas.android.com/apk/res/android" android:drawable="@drawable/image_for_rotation" android:pivotX="50%" android:pivotY="50%" />

o:

<animation-list xmlns:android="http://schemas.android.com/apk/res/android" > <item android:drawable="@drawable/img_loader_frame1" android:duration="150"/> ... <item android:drawable="@drawable/img_loader_frame2" android:duration="150"/> ... </animation-list>

luego, defina el diseño: (res / layout / loader.xml)

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/layout_root" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:layout_gravity="center_vertical|center_horizontal"> <ProgressBar android:layout_width="200dp" android:layout_height="200dp" android:indeterminateDrawable="@drawable/loader_anim" /> </LinearLayout>

y luego, cuadro de diálogo de progreso de instancia:

ProgressDialog dialog; ... dialog = ProgressDialog.show(this,null,null); dialog.setContentView(R.layout.loader); ... process(); ... dialog.dismiss();

Más información:


Si desea mostrar solo la barra de progreso indeterminada.

ProgressDialog progressDialog = ProgressDialog.show(this, null, null, true, false); progressDialog.setContentView(R.layout.progress_layout);

Y crea un archivo xml de diseño con el nombre "progress_layout.xml"

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <ProgressBar android:id="@+id/progressBar1" style="?android:attr/progressBarStyleLarge" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" /> </LinearLayout>


Siempre puede agregar una ProgressBar en todas sus actividades en las que le interese mostrar el ProgressDialog centrado. Use following en acitivity.xml como:

<ProgressBar android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/progressBar" android:layout_centerInParent="true" android:visibility="gone"/>

En su Acitivity.java, use

ProgressBar bar = new Progress(); bar = (ProgressBar) findViewById(R.id.progressBar);

Ahora, cuando quiera mostrar ProgressBar, simplemente configure su visibilidad como visible, y para cancelar, establezca la visibilidad como desaparecida.

bar.setVisibility(View.VISIBLE); bar.setVisibility(View.GONE);


Solo haga el método de abajo para hacerlo

En res-> valores-> estilos, agregue el siguiente código

<style name="MyGravity" parent="android:Theme.Material.Dialog" ></style>

A continuación, crea tu ProgressDialog como se menciona a continuación

ProgressDialog dialog = new ProgressDialog(ctx, R.style.MyGravity); dialog.getWindow().setBackgroundDrawableResource(android.R.color.transparent);


Usar ProgressBar y agregarlo a LinearLayout funcionó en mi caso de la siguiente manera:

ProgressBar mSpinner = new ProgressBar(this); mSpinner.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); mSpinner.setBackgroundResource(R.drawable.loading_1); mSpinner.setIndeterminate(true);


Utilizo lo siguiente, no requiere un archivo de diseño y coloca una barra de progreso de bloqueo centrada y sin bordes en el medio de la pantalla.

private ProgressDialog progressDialog; setUIToWait(true); ...long process... setUIToWait(false); private void setUIToWait(boolean wait) { if (wait) { progressDialog=ProgressDialog.show(this,null,null); progressDialog.setContentView(new ProgressBar(this)); } else { progressDialog.dismiss(); } }


//create Dialog by using below method @Override protected Dialog onCreateDialog(int id) { switch (id) { case DIALOG1_KEY: { Dialog dialog = new Dialog(this,R.style.NewDialog); dialog.setContentView(R.layout.progress); dialog.setCancelable(true); return dialog; } } return null; } //then in your onCreate () you can call like below @Override public void onCreate(Bundle savedInstatncestate) { final Handler mHandler = new Handler(); showDialog(DIALOG1_KEY); new Thread() { public void run() { try { sleep(3000); Runnable r = new Runnable() { public void run() { //do your background process dismissDialog(DIALOG1_KEY); } }; mHandler.post(r); } catch (Exception e) { } } }.start(); }