如何在代码中获取 attr 引用?
Posted
技术标签:
【中文标题】如何在代码中获取 attr 引用?【英文标题】:How to get the attr reference in code? 【发布时间】:2012-03-13 00:08:39 【问题描述】:我希望通过代码从属性中获取指向引用。在我的 xml 布局中,我可以像这样轻松获得引用的可绘制对象:
android:background="?attr/listItemBackground"
属性引用由我的主题设置。我正在寻找是否可以通过代码获取引用的可绘制对象。
我可以通过创建样式 attr 并读取自定义视图中的值来解决此问题,但在这种情况下,我想弄清楚这是否可能不做所有这些。我认为这是可能的,但我还没有找到获取该属性引用的方法。
谢谢!
【问题讨论】:
【参考方案1】:你不应该使用:
android:background="@drawable/listItemBackground"
然后:
myImageButton.getBackgroundDrawable()
或者我没听懂……
【讨论】:
我的想法是我想从 attr/listItemBackground 访问引用的资源,该资源通过 theme.xml 设置了正确的引用 从视图中获取已经设置的背景不是问题 :) 好的,知道了!我认为可以通过尝试从 context.getResources() 直接获取“?attr/listItemBackground”。但我也认为有比引用drawable更好的解决方案。我们可以讨论一下主要思想吗? (如果你认为这个解决方案是最好的,或者不是) 嗯,我的应用程序有一个复杂但有条理的主题。但是这个案例我想看看它是否可能以及如何使用它。您会认为 res.getDrawable(R.attr.listItemBackground) 会这样做,因为资源已经正确设置为当前设置的主题并指向正确的资源。但它比看起来要复杂一些...... 是的,res.getDrawable(R.attr.listItemBackground) 是我的想法……您正在使用引用,以便在更改主题时,所有内容都在您的 attr 资源中配置?为此,我将创建一个自定义 View/Drawable,它从当前主题中选择值。类似:android:background="myCustomView"
我不记得怎么写了,但想法就在这里【参考方案2】:
这就是你的做法:
// Create an array of the attributes we want to resolve
// using values from a theme
int[] attrs = new int[] R.attr.listItemBackground /* index 0 */;
// Obtain the styled attributes. 'themedContext' is a context with a
// theme, typically the current Activity (i.e. 'this')
TypedArray ta = themedContext.obtainStyledAttributes(attrs);
// To get the value of the 'listItemBackground' attribute that was
// set in the theme used in 'themedContext'. The parameter is the index
// of the attribute in the 'attrs' array. The returned Drawable
// is what you are after
Drawable drawableFromTheme = ta.getDrawable(0 /* index */);
// Finally, free the resources used by TypedArray
ta.recycle();
【讨论】:
感谢您的回答。这似乎是唯一的方法。 我试过了,但它不能使用索引 0,而是 1(这是getIndex(0)
返回的内容。
我必须用 R.attr.selectableItemBackground 替换 R.attr.listItemBackground 才能编译
Android 代码如此复杂且不直观。我认为谷歌应该由天才组成。完成最简单最明显的事情几乎是不可能的。
@slashdottir 告诉我以上是关于如何在代码中获取 attr 引用?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用兼容库获取“?android:attr/actionBarSize”