【问题标题】:How to change default ProgressBar circle color on Android如何在 Android 上更改默认 ProgressBar 圆圈颜色
【发布时间】:2015-11-10 10:57:43
【问题描述】:

我目前在通过 gradle 导入的 Android 项目中使用外部库。
这个库显示了一个带有 ProgressBar 圆圈的通知栏。 这是我在它的源代码中找到的代码:

<ProgressBar
            android:id="@+id/progress_bar"
            android:layout_height="match_parent"
            android:layout_marginBottom="4dp"
            android:layout_marginTop="4dp"
            style="@style/SuperActivityToast_Progress_ProgressBar"/>

关联的样式是这个:

<style name="SuperActivityToast_Progress_ProgressBar" parent="android:Widget.Holo.ProgressBar">
    <item name="android:layout_width">32dp</item>
    <item name="android:layout_marginLeft">8dp</item>
</style>

如果我理解正确的话,所示圆圈的颜色来自默认颜色(我手机上的绿色)。 我需要改变它!

现在,我无法修改源代码,而且库本身也不提供以编程方式设置样式的可能性。

有没有办法在应用级别更改默认样式或更好地覆盖此特定样式?

谢谢 大卫

【问题讨论】:

标签: android styles overriding geometry android-progressbar


【解决方案1】:

如果您使用的是 AppCompat 主题,它会使用 accentColor 为圆圈着色。

如果您想将其着色为与主题不同的颜色,则应考虑使用 ThemeOverylay。例如。如果你想让圆圈色调 red 你可以执行以下操作:

在你的styles.xml

<style name="RedAccent" parent="ThemeOverlay.AppCompat.Light">
    <item name="colorAccent">#F00</item>
</style>

在您的ProgressBar 中,将主题设置为RedAccent

<ProgressBar
            android:id="@+id/progress_bar"
            android:layout_width="32dp"
            android:layout_height="32dp"
            android:theme="@style/RedAccent"/>

你的圈子现在会变成红色!

【讨论】:

  • 谢谢!快速简便的解决方案,但仅在通过包含“@style”so android:theme="@style/RedAccent" 引用主题后才有效 - 谢谢
  • 是的@CliveSargeant,很好。它必须是'@style/',因为我们引用了样式。我已经更新了答案。
  • 这是一个非常有用的方法。我没有意识到我们可以用这种方式覆盖应用程序样式!
  • 你是传奇的定义
  • 这个解决方案对我不起作用,我必须按照下面的答案之一设置colorControlActivated
【解决方案2】:

经过多次尝试,我找到了解决方案:

ProgressBar progBar = (ProgressBar) context.getActivity().findViewById(R.id.progress_bar);
if (progBar != null) {
    progBar.setVisibility(View.VISIBLE);
    progBar.setIndeterminate(true);
    progBar.getIndeterminateDrawable().setColorFilter(0xFFFFFFFF, android.graphics.PorterDuff.Mode.MULTIPLY);
}

简单地说,我将获得由库创建的进度条对象的引用,并更改它的属性。 (在我的活动中,我必须在“OnStart”方法中执行此操作,否则为空) 最重要的部分是发挥神奇作用的“setColorFilter”。

【讨论】:

  • Mode.MULTIPLY 将颜色与进度条颜色相乘,如果有人想要纯纯色,请使用 PorterDuff.Mode.SRC_ATOP
【解决方案3】:

对于未来的参考,这个改变对我有用的是:

values/styles.xml 文件中更改 AppTheme 中的 colorControlActivated

 <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <!-- Main theme colors -->
    ....
    <!-- Color for circle in progress bar -->
    <item name="colorControlActivated">#DC0808</item>
</style>

使用这种方法,您无需对 xml 文件中的 &lt;ProgressBar/&gt; 标记执行任何操作。

【讨论】:

  • colorControlActivated 会影响其他东西吗?如果是这样,哪个?深色主题的行为是否有所不同?
  • @VivekPratapSingh 您是否在清单文件中设置了 AppTheme? &lt;application android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher" android:supportsRtl="true" android:theme="@style/AppTheme"&gt;
【解决方案4】:

只需在 ProgressBar 中添加颜色,如下所示:

    <ProgressBar
    android:id="@+id/progressbar"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerHorizontal="true"
    android:visibility="gone"
    android:indeterminateTint="@color/colorPrimary"  // add color here
    android:layout_centerVertical="true"/>

【讨论】:

  • 请注意,indeterminateTint 仅适用于 API 级别 21 及更高级别!
  • 像害虫一样保持质量
猜你喜欢
  • 2016-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-27
  • 1970-01-01
  • 2017-11-27
  • 1970-01-01
相关资源
最近更新 更多