Nie byłem w pełni zadowolony z zaakceptowanej odpowiedzi powyżej, więc sam przeprowadziłem dodatkowe badania.
Uważam, że sztuczka, której użyli, polega na tym, że pobrali widok z góry w wywołanej hierarchii widoków DecorView
i dodali tam pasek postępu. W ten sposób pasek postępu wyświetla się zarówno nad paskiem akcji, jak i obszarem zawartości. Zwróć uwagę, że odpowiedź SD umieszcza pasek postępu w obszarze zawartości i „kradnie” miejsce z rzeczywistej treści, co może prowadzić do nieoczekiwanych wyników.
Przykładowe zrzuty ekranu tej implementacji:
Kod
Po prostu wstaw ten kod do onCreate
metody jakiejś aktywności i powinno zadziałać:
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);
}
});
Możesz grać z argumentem wysokości LayoutParams, aby ustawić pasek postępu na szerszy lub węższy, ale może być konieczne dostosowanie -10
przesunięcia.
Stylizacja
Niestety widać brzydkie szare tło paska postępu. Aby go usunąć, po prostu wyszukując tło według identyfikatora i próbując go ukryć, nie działa. Aby usunąć tło, musiałem stworzyć identyczny rysunek wersji systemu i usunąć element tła.
TL; DR: Utwórz plik progress_horizontal_holo_no_background_light.xml
i wklej to do rysowania:
<?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>
Skopiuj odpowiednie rysunki .png z sdk/platforms/android-xx/data/res/drawable-xxx/
do swojego projektu, a następnie w kodzie możesz dodać:
progressBar.setProgressDrawable(getResources().getDrawable(R.drawable.progress_horizontal_holo_no_background_light));
Dodatkowo: nieokreślony pasek postępu
Wersje nieokreślonych pasków postępu sprzed KitKata są dość brzydkie i opóźnione. Możesz pobrać nowy płynny pasek postępu o nazwie ButteryProgressBar
. Po prostu wyszukaj go w google (nie mogę już dodawać linków, ponieważ jestem nowy tutaj: [), dodaj klasę do swojego projektu i możesz po prostu zastąpić poprzedni ProgressBar tym kodem i mieć chrupiący nieokreślony pasek postępu:
final ButteryProgressBar progressBar = new ButteryProgressBar(this);
progressBar.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, 24));
Konieczne może być również uproszczenie tego kodu:
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();
}
do tego kodu:
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)
Mam nadzieję, że pomogłem :)