studio android android-actionbar android-progressbar

webview android studio 2017



ProgressBar en Action Bar (6)

Resumen de la pregunta: ¿Cómo puedo integrar ProgressBar dentro de ActionBar , como en la aplicación Chrome?

Detalles: mira esta captura de pantalla de Chrome:

Quiero crear una barra de acción como esta. Justo debajo de la barra de acción, hay una barra de progreso que se llena según la carga de la página. He visto este ejemplo de muchas aplicaciones, como Feedly, pero no he podido crear mi propia implementación. Intenté usar las propias API de Android para crearlo:

@Override protected void onCreate(Bundle savedInstanceState) { //Request Permission to display the Progress Bar... this.requestWindowFeature(Window.FEATURE_PROGRESS); this.setWindowContentView(R.layout.activity_main) super.onCreate(savedInstanceState); this.setProgressBarIndeterminate(true); }

Pero este código solo hace que ProgressBar se muestre en la barra de acciones, así:

Entonces, ¿cómo puedo hacer que mi ProgressBar aparezca debajo de la barra de acciones, como en la aplicación de Chrome?


Bueno, hice algo similar para una de mis aplicaciones para mascotas y no estoy seguro de si esa es la única forma o la mejor manera de hacerlo, pero definitivamente funciona.

Para empezar, use una barra de acción de superposición y luego establezca el fondo dibujable en "nulo" para que la barra de acción de superposición sea transparente.

Ahora en su diseño de actividad, establezca el margen superior para su vista raíz en "altura de la barra de acciones". Puede hacerlo así.

<RelativeLayout ... android:layout_marginTop="?android:attr/actionBarSize" />

Ahora la acción no va a ocultar el contenido de tu actividad.

Lo siguiente que debe hacer ahora es agregar una vista de encabezado en la parte superior de su vista raíz con una altura igual a la barra de acciones. Establecer un color de fondo para él. Este sería ahora el color de su barra de acción y dado que la barra de acción se alinea perfectamente en la parte superior de la vista de encabezado.

Ahora puede colocar fácilmente una barra de progreso en la vista de encabezado y alinearla en la parte inferior de la vista de encabezado. Para el usuario, esto parecería que la barra de progreso está en la barra de acciones en sí, al igual que Chrome.


Este es ahora un comportamiento nativo que se puede obtener usando SwipeRefreshLayout .

Puede ajustar su vista desplazable con un SwipeRefreshLayout y luego solo tiene que escuchar los eventos de actualización :

@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); swipeLayout = (SwipeRefreshLayout) findViewById(R.id.swipe_container); swipeLayout.setOnRefreshListener(this); swipeLayout.setColorScheme(android.R.color.holo_blue_bright, android.R.color.holo_green_light, android.R.color.holo_orange_light, android.R.color.holo_red_light); } @Override public void onRefresh() { new Handler().postDelayed(new Runnable() { @Override public void run() { swipeLayout.setRefreshing(false); } }, 5000); }

Un tutorial agradable y simple se puede encontrar en este blog .


Extienda las Actividades de la siguiente clase para tener una Barra de progreso en la parte superior (debajo de Barra de acciones) de cada una, y un método getProgressBar() :

Clase de padres:

public abstract class ProgressActivity extends Activity { private ProgressBar mProgressBar; @Override public void setContentView(View view) { init().addView(view); } @Override public void setContentView(int layoutResID) { getLayoutInflater().inflate(layoutResID,init(),true); } @Override public void setContentView(View view, ViewGroup.LayoutParams params) { init().addView(view,params); } private ViewGroup init(){ super.setContentView(R.layout.progress); mProgressBar = (ProgressBar) findViewById(R.id.activity_bar); return (ViewGroup) findViewById(R.id.activity_frame); } protected ProgressBar getProgressBar(){ return mProgressBar; } }

Diseño (progress.xml):

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <ProgressBar android:id="@+id/activity_bar" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="-8dp" style="@android:style/Widget.DeviceDefault.ProgressBar.Horizontal" /> <FrameLayout android:id="@+id/activity_frame" android:layout_width="match_parent" android:layout_height="fill_parent" /> </LinearLayout>


He compilado el código de este hilo y de otros hilos en y he creado un proyecto que puede utilizarse para implementar ButteryProgessbar y también "desplegar para actualizar". https://github.com/pauldmps/Gmail-like-Pull-Down-to-Refresh

Siéntase libre de usar el código en su aplicación.

Muchas gracias a ustedes, muchachos.


No estaba completamente satisfecho con la respuesta aceptada anteriormente, por lo que investigué un poco más.

El truco que creo que utilizaron es que recuperaron la vista superior en la jerarquía de vistas llamada DecorView y agregaron la barra de progreso allí. De esta forma, la barra de progreso se muestra tanto en la barra de acciones como en el área de contenido. Tenga en cuenta que la respuesta de la SD pone la barra de progreso en el área de contenido y "roba" espacio del contenido real, lo que puede conducir a resultados inesperados.

Ejemplos de capturas de pantalla de esta implementación:

Código

Simplemente ponga este código en el método onCreate de alguna actividad y debería funcionar:

// create new ProgressBar and style it final ProgressBar progressBar = new ProgressBar(this, null, android.R.attr.progressBarStyleHorizontal); progressBar.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, 24)); progressBar.setProgress(65); // retrieve the top view of our application final FrameLayout decorView = (FrameLayout) getWindow().getDecorView(); decorView.addView(progressBar); // Here we try to position the ProgressBar to the correct position by looking // at the position where content area starts. But during creating time, sizes // of the components are not set yet, so we have to wait until the components // has been laid out // Also note that doing progressBar.setY(136) will not work, because of different // screen densities and different sizes of actionBar ViewTreeObserver observer = progressBar.getViewTreeObserver(); observer.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { @Override public void onGlobalLayout() { View contentView = decorView.findViewById(android.R.id.content); progressBar.setY(contentView.getY() - 10); ViewTreeObserver observer = progressBar.getViewTreeObserver(); observer.removeGlobalOnLayoutListener(this); } });

Puede jugar con el argumento de altura de LayoutParams para establecer la barra de progreso más ancha o más estrecha, pero es posible que tenga que ajustar la compensación de -10 .

Estilo

Desafortunadamente, puedes ver el feo fondo gris de la barra de progreso. Para eliminarlo, simplemente buscar el fondo por identificación e intentar ocultarlo no funciona. Para eliminar el fondo, tuve que crear un dibujo idéntico de la versión del sistema y eliminar el elemento de fondo.

TL; DR: crea el archivo progress_horizontal_holo_no_background_light.xml y pega este dibujable:

<?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@android:id/secondaryProgress"> <scale android:scaleWidth="100%" android:drawable="@drawable/progress_secondary_holo_light" /> </item> <item android:id="@android:id/progress"> <scale android:scaleWidth="100%" android:drawable="@drawable/progress_primary_holo_light" /> </item> </layer-list>

Copie los .png drawables apropiados de sdk/platforms/android-xx/data/res/drawable-xxx/ a su proyecto y luego en el código que puede agregar:

progressBar.setProgressDrawable(getResources().getDrawable(R.drawable.progress_horizontal_holo_no_background_light));

Extra: barra de progreso indeterminada

Las versiones Pre-KitKat de barras de progreso indeterminadas son bastante feas y lacias. Puede descargar la nueva progressBar sin problemas llamada ButteryProgressBar . Simplemente búscalo en google (no puedo publicar más enlaces, porque soy nuevo aquí: [), agrega la clase a tu proyecto y simplemente puedes reemplazar la barra ProgressBar anterior con este código y tener una barra de progreso indefinida crujiente:

final ButteryProgressBar progressBar = new ButteryProgressBar(this); progressBar.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, 24));

También podría necesitar simplificar este código:

final TypedArray ta = c.obtainStyledAttributes(attrs, R.styleable.ButteryProgressBar); try { mBarColor = ta.getColor(R.styleable.ButteryProgressBar_barColor, c.getResources().getColor(android.R.color.holo_blue_light)); mSolidBarHeight = ta.getDimensionPixelSize( R.styleable.ButteryProgressBar_barHeight, Math.round(DEFAULT_BAR_HEIGHT_DP * mDensity)); mSolidBarDetentWidth = ta.getDimensionPixelSize( R.styleable.ButteryProgressBar_detentWidth, Math.round(DEFAULT_DETENT_WIDTH_DP * mDensity)); } finally { ta.recycle(); }

a este código:

mBarColor = c.getResources().getColor(android.R.color.holo_blue_light); mSolidBarHeight = Math.round(DEFAULT_BAR_HEIGHT_DP * mDensity); mSolidBarDetentWidth = Math.round(DEFAULT_DETENT_WIDTH_DP * mDensity);

Espero haber ayudado :)


Por favor use el código a continuación. solo use un estilo predeterminado en la barra de progreso como style="?android:attr/progressBarStyleHorizontal"

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/hello_world" /> <ProgressBar android:layout_width="match_parent" android:layout_height="wrap_content" style="?android:attr/progressBarStyleHorizontal" android:indeterminate="true" /> </RelativeLayout>