私のアプリの最小APIレベルは19(KitKat)で、水平ProgressBar
のレイアウトが含まれています。 Android:progressTint
属性を使用して、バーをカスタムカラーに色付けしています。 Lollipop(API 21)以降ではかなりうまく機能しますが、それ以下(たとえばAPI 19)では機能しません。別の色で表示されます。その理由は、この属性
aPIレベル21以上でのみ使用されます
Android Studioの状態。
ですから、Lollipop以前のデバイスでもProgressBar
を着色するための良い代替手段になるのではないかと思っています。 XMLでレイアウトファイル内に作成できますか?または、これは別の方法で行う必要がありますか?
編集#1:私のProgressBarは、具体的な値をパーセントで表示するために使用され、レイアウトがロードされていることを示すためではありません。 Kuldeep Kulkarniが以下に書いたものを試した後、私のバーはマテリアルロードインジケーターのように見えたので、これを明確にしたいと思います(もちろん、Lollipopデバイスでは、KitKatデバイスで目に見える結果はありません)。
皆からの提案をありがとう! :)
私にとって有効な解決策は、<layer-list>
ルート要素を使用してカスタムのドローアブルXMLファイルを作成することです。そこで、ネイティブAndroid IDs @Android:id/background
and @Android:id/progress
]を使用して2つのレイヤーアイテムを定義しています。この後、目的の形状と色のリソースを定義できますこのソリューションは this SO質問に対する一般的な回答です。
res/drawable/progressbar.xml
ファイルの内容:
<layer-list xmlns:Android="http://schemas.Android.com/apk/res/Android">
<item Android:id="@Android:id/background">
<shape>
<corners Android:radius="2dip" /> <!--optional-->
<gradient
Android:angle="270"
Android:endColor="@color/gray"
Android:startColor="@color/gray" />
</shape>
</item>
<item Android:id="@Android:id/progress">
<clip>
<shape>
<corners Android:radius="2dip" /> <!--optional-->
<gradient
Android:angle="270"
Android:endColor="@color/blue"
Android:startColor="@color/blue" />
</shape>
</clip>
</item>
</layer-list>
レイアウトXMLファイルでprogressDrawable
のProgressBar
として定義:
<ProgressBar
Android:id="@+id/progress_bar"
Android:layout_width="0dp"
Android:layout_height="@dimen/progress_bar_height"
Android:progressDrawable="@drawable/progressbar" />
API 19の下でテストする機会はありませんでしたが、このレベル以上では完全に動作します。
ProgressBar indeterminateDrawable
のpre-Lollipop
メソッドでラップできます。
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Lollipop) {
Drawable drawableProgress = DrawableCompat.wrap(progressBar.getIndeterminateDrawable());
DrawableCompat.setTint(drawableProgress, ContextCompat.getColor(getContext(), Android.R.color.holo_green_light));
progressBar.setIndeterminateDrawable(DrawableCompat.unwrap(drawableProgress));
} else {
progressBar.getIndeterminateDrawable().setColorFilter(ContextCompat.getColor(getContext(), Android.R.color.holo_green_light), PorterDuff.Mode.SRC_IN);
}
progress.getProgressDrawable().setColorFilter(color, PorterDuff.Mode.SRC_IN);
これは私のために働く
<ProgressBar
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:theme="@style/progressBarBlue" />
次に、style.xml
定義progressBarBlue
<style name="progressBarWhite" parent="@style/Theme.AppCompat">
<item name="colorAccent">@color/blue</item>
</style>
プログラムで実行したい場合は、これを試してください
public static void setSeekbarTint(SeekBar seekbar, int color) {
PorterDuff.Mode porterDuffMode = PorterDuff.Mode.SRC_IN;
if (seekbar.getIndeterminateDrawable() != null)
seekbar.getIndeterminateDrawable().setColorFilter(color, porterDuffMode);
if (seekbar.getProgressDrawable() != null &&
seekbar.getProgressDrawable() instanceof LayerDrawable) {
LayerDrawable layerDrawable = (LayerDrawable) seekbar.getProgressDrawable();
GradientDrawable gradientDrawable = (GradientDrawable) layerDrawable.findDrawableByLayerId(Android.R.id.background);
layerDrawable.setColorFilter(color, porterDuffMode);
seekbar.setProgressDrawable(layerDrawable);
gradientDrawable.setColorFilter(Color.WHITE, porterDuffMode);
} else if (seekbar.getProgressDrawable() != null &&
seekbar.getProgressDrawable() instanceof ClipDrawable) {
ClipDrawable clipDrawable = (ClipDrawable) seekbar.getProgressDrawable();
clipDrawable.setColorFilter(color, porterDuffMode);
seekbar.setProgressDrawable(clipDrawable);
}
}