No estaba completamente satisfecho con la respuesta aceptada anterior, así que investigué un poco más.
El truco que creo que usaron es que recuperaron la vista superior en la jerarquía de vista llamada DecorView
y agregaron la barra de progreso allí. De esa manera, la barra de progreso se muestra tanto sobre la barra de acción como sobre el área de contenido. Tenga en cuenta que la respuesta de la SD coloca la barra de progreso en el área de contenido y 'roba' espacio del contenido real, lo que puede conducir a resultados inesperados.
Capturas de pantalla de muestra de esta implementación:
Código
Simplemente ponga este código en el onCreate
método de alguna actividad y debería funcionar:
final ProgressBar progressBar = new ProgressBar(this, null, android.R.attr.progressBarStyleHorizontal);
progressBar.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, 24));
progressBar.setProgress(65);
final FrameLayout decorView = (FrameLayout) getWindow().getDecorView();
decorView.addView(progressBar);
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.removeOnGlobalLayoutListener(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 el -10
desplazamiento.
Estilismo
Desafortunadamente, puedes ver el feo fondo gris de la barra de progreso. Para eliminarlo, simplemente buscar el fondo por id 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 un archivo progress_horizontal_holo_no_background_light.xml
y pega este elemento de dibujo:
<?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 elementos de diseño .png apropiados de sdk/platforms/android-xx/data/res/drawable-xxx/
su proyecto y luego en el código puede agregar:
progressBar.setProgressDrawable(getResources().getDrawable(R.drawable.progress_horizontal_holo_no_background_light));
Extra: barra de progreso indeterminada
Las versiones anteriores a KitKat de barras de progreso indeterminadas son bastante feas y lentas. Puede descargar una nueva barra de progreso sin problemas llamada ButteryProgressBar
. Simplemente búsquelo en Google (no puedo publicar más enlaces, porque soy nuevo aquí: [), agregue la clase a su proyecto y simplemente puede reemplazar el ProgressBar anterior con este código y tener una barra de progreso indeterminada crujiente:
final ButteryProgressBar progressBar = new ButteryProgressBar(this);
progressBar.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, 24));
También es posible que deba 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 :)