私は上記の受け入れられた答えに完全に満足していなかったので、私は自分でいくつかの追加の調査をしました。
彼らが使用したと私が信じるトリックは、呼び出されたビュー階層のトップビューを取得しDecorView
、そこにプログレスバーを追加したことです。このように、プログレスバーはアクションバーとコンテンツ領域の両方に表示されます。SDの回答は、プログレスバーをコンテンツ領域に配置し、実際のコンテンツからスペースを「盗む」ことに注意してください。これにより、予期しない結果が生じる可能性があります。
この実装のサンプルスクリーンショット:
コード
onCreate
このコードをいくつかのアクティビティのメソッドに入れるだけで、機能するはずです。
// 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.removeOnGlobalLayoutListener(this);
}
});
LayoutParamsのheight引数を操作して、progressBarを広くまたは狭く設定できますが、-10
オフセットを調整する必要がある場合があります。
スタイリング
残念ながら、プログレスバーの醜い灰色の背景を見ることができます。それを削除するには、idで背景を検索し、それを非表示にしようとしても機能しません。背景を削除するには、システムバージョンと同じドローブルを作成し、背景アイテムを削除する必要がありました。
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バージョンは、かなり醜くて遅れています。と呼ばれる新しいスムーズなprogressBarをダウンロードできますButteryProgressBar
。グーグルで検索するだけです(私はここで新しいので、これ以上リンクを投稿できません:[)、クラスをプロジェクトに追加すると、以前の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);
私が助けてくれたことを願っています:)