在运行时从 Android 主题获取默认属性值?

Posted

技术标签:

【中文标题】在运行时从 Android 主题获取默认属性值?【英文标题】:Obtain default attribute values from an Android theme at runtime? 【发布时间】:2012-05-13 00:24:03 【问题描述】:

我需要以编程方式找出默认情况下android 使用哪个drawable 来呈现ProgressBar。由于这取决于所使用的主题,因此我尝试了以下方法:

    TypedArray progressBarAttrs = context.getTheme().obtainStyledAttributes(
            new int[]  android.R.attr.indeterminateDrawable );
    progressDrawableId = progressBarAttrs.getResourceId(0, -1);

但这总是返回 -1。

这是因为android.R.attr.indeterminateDrawable 没有被声明为可样式化还是什么?有没有其他方法可以达到同样的目的?

【问题讨论】:

【参考方案1】:

如果您需要,很高兴在周一为您提供更多帮助(刚出门并注意到您的问题),

但请查看 Hackbods 的答案 https://***.com/a/2130528/726954 以及她指向示例项目的链接,这将允许您从主题中提取样式资源。

【讨论】:

【参考方案2】:

以下为我返回了一个drawable(反复试验,我当然不明白obtainStyledAttributes究竟是如何解决的):

 int[] attrs = new int[]  android.R.attr.indeterminateDrawable /* index 0 */;
 TypedArray ta = context.obtainStyledAttributes(android.R.style.Widget_ProgressBar, attrs);
 // ....
 ta.recycle();

但是,当将该可绘制对象分配给进度条时:

 progressBar.setIndeterminateDrawable(ta.getDrawable(0));

结果看起来不像默认的 ProgressBar 不确定微调器。它是 Android 微调器,但更大更厚。

我现在知道为什么了,但是请注意 Android 中的 ProgressBar.java,在检索到可绘制资源后,会对其进行处理:

drawable = tileifyIndeterminate(drawable);
setIndeterminateDrawable(drawable);

【讨论】:

以上是关于在运行时从 Android 主题获取默认属性值?的主要内容,如果未能解决你的问题,请参考以下文章

是否可以在运行时从 Android 应用程序动态加载库?

如何在 XML 中获取(参考)当前主题默认文本颜色

如何在 Android Studio 中将主题从 Darcula 恢复为默认值

如何在 Holo 主题 Api 11-17 Android 中以编程方式将 EditText 背景设置为默认值

如何在android报警时从待处理的意图中获取requestCode

Android 让反射变的简单