Ich war mit der oben akzeptierten Antwort nicht ganz zufrieden und habe selbst einige Nachforschungen angestellt.
Der Trick, den sie meiner Meinung nach verwendet haben, besteht darin, dass sie die Draufsicht in der aufgerufenen Ansichtshierarchie abgerufen DecorView
und dort den Fortschrittsbalken hinzugefügt haben. Auf diese Weise wird der Fortschrittsbalken sowohl über der Aktionsleiste als auch im Inhaltsbereich angezeigt. Beachten Sie, dass die Antwort des SD den Fortschrittsbalken in den Inhaltsbereich versetzt und dem tatsächlichen Inhalt Speicherplatz "stiehlt", was zu unerwarteten Ergebnissen führen kann.
Beispiel- Screenshots dieser Implementierung:
Code
Fügen Sie diesen Code einfach in die onCreate
Methode einer Aktivität ein und es sollte funktionieren:
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);
}
});
Sie können mit dem Höhenargument von LayoutParams spielen, um die progressBar breiter oder schmaler einzustellen -10
. Möglicherweise müssen Sie jedoch den Versatz anpassen .
Styling
Leider können Sie den hässlichen grauen Hintergrund des Fortschrittsbalkens sehen. Um es zu entfernen, funktioniert es nicht, einfach anhand der ID nach dem Hintergrund zu suchen und zu versuchen, ihn auszublenden. Um den Hintergrund zu entfernen, musste ich einen identischen Drawble der Systemversion erstellen und das Hintergrundelement entfernen.
TL; DR: Erstellen Sie eine Datei progress_horizontal_holo_no_background_light.xml
und fügen Sie diese Zeichnungsdatei ein:
<?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>
Kopieren Sie die entsprechenden PNG-Zeichen sdk/platforms/android-xx/data/res/drawable-xxx/
in Ihr Projekt und fügen Sie sie im Code hinzu:
progressBar.setProgressDrawable(getResources().getDrawable(R.drawable.progress_horizontal_holo_no_background_light));
Extra: Unbestimmter Fortschrittsbalken
Pre-KitKat-Versionen unbestimmter Fortschrittsbalken sind ziemlich hässlich und verzögert. Sie können neue glatte progressBar namens herunterladen ButteryProgressBar
. Suchen Sie einfach auf Google danach (ich kann keine weiteren Links posten, da ich neu hier bin: [), fügen Sie die Klasse zu Ihrem Projekt hinzu und Sie können einfach die vorherige ProgressBar durch diesen Code ersetzen und haben einen knusprigen unbestimmten Fortschrittsbalken:
final ButteryProgressBar progressBar = new ButteryProgressBar(this);
progressBar.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, 24));
Möglicherweise müssen Sie diesen Code auch vereinfachen:
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();
}
zu diesem Code:
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)
Hoffe ich habe geholfen :)