Я не був повністю задоволений прийнятою відповіддю вище, тому сам зробив додаткове дослідження.
Я вважаю, що фокус у тому, що вони отримали вид зверху в викликаній ієрархії подання DecorView
та додали туди панель прогресу. Таким чином, панель виконання відображається як над панеллю дій, так і над областю вмісту. Зверніть увагу, що відповідь SD поміщає індикатор прогресу в область вмісту та «краде» простір у фактичного вмісту, що може призвести до несподіваних результатів.
Приклади скріншотів цієї реалізації:
Код
Просто введіть цей код у onCreate
метод певної діяльності, і він повинен працювати:
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);
}
});
Ви можете пограти з аргументом висоти LayoutParams, щоб встановити progressBar ширшим або вужчим, але, можливо, вам доведеться відрегулювати -10
зміщення.
Укладання
На жаль, ви бачите потворний сірий фон індикатора прогресу. Щоб видалити його, просто пошук фону за ідентифікатором та спроба приховати його не працює. Щоб видалити фон, мені довелося створити однаковий малюнок версії системи та видалити елемент фону.
TL; DR: Створіть файл progress_horizontal_holo_no_background_light.xml
і вставте цей малюнок:
<?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>
Скопіюйте відповідні файли .png sdk/platforms/android-xx/data/res/drawable-xxx/
у свій проект, а потім у код можна додати:
progressBar.setProgressDrawable(getResources().getDrawable(R.drawable.progress_horizontal_holo_no_background_light));
Додатково: невизначений прогрес
Версії невизначених індикаторів виконання Pre-KitKat досить потворні та відсталі. Ви можете завантажити нову плавну програму під назвою ButteryProgressBar
. Просто знайдіть його в google (я не можу більше розміщувати посилання, бо я тут новачок: [), додайте клас у свій проект, і ви можете просто замінити попередній ProgressBar цим кодом і мати чіткий невизначений рядок виконання:
final ButteryProgressBar progressBar = new ButteryProgressBar(this);
progressBar.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, 24));
Можливо, вам також доведеться спростити цей код:
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();
}
до цього коду:
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)
Сподіваюся, я допоміг :)