Android:如何获取代码中的属性值?
我想在代码中检索textApperanceLarge的int值。 我相信下面的代码是正确的方向,但不知道如何从TypedValue提取int值。
TypedValue typedValue = new TypedValue(); ((Activity)context).getTheme().resolveAttribute(android.R.attr.textAppearanceLarge, typedValue, true);
您的代码只获取textAppearanceLarge属性指向的样式的资源ID,即Reno指出的TextAppearance.Large 。
要从样式中获取textSize属性值,只需添加以下代码:
int[] textSizeAttr = new int[] { android.R.attr.textSize }; int indexOfAttrTextSize = 0; TypedArray a = context.obtainStyledAttributes(typedValue.data, textSizeAttr); int textSize = a.getDimensionPixelSize(indexOfAttrTextSize, -1); a.recycle();
现在, textSize将是textApperanceLarge指向的样式的文本大小(以像素为单位),如果未设置,则为-1。 这是假设typedValue.type是typesTYPE_REFERENCE开始,所以你应该先检查。
数字16973890来自TextAppearance.Large的资源ID
运用
TypedValue typedValue = new TypedValue(); ((Activity)context).getTheme().resolveAttribute(android.R.attr.textAppearanceLarge, typedValue, true);
对于string:
typedValue.string typedValue.coerceToString()
对于其他数据:
typedValue.resourceId typedValue.data // (int) based on the type
在你的情况下它返回的是TYPE_REFERENCE
。
我知道它应该指向TextAppearance.Large
这是:
<style name="TextAppearance.Large"> <item name="android:textSize">22sp</item> <item name="android:textStyle">normal</item> <item name="android:textColor">?textColorPrimary</item> </style>
信贷去马丁解决这个问题:
int[] attribute = new int[] { android.R.attr.textSize }; TypedArray array = context.obtainStyledAttributes(typedValue.resourceId, attribute); int textSize = array.getDimensionPixelSize(0, -1);
这似乎是@ user3121370的答案调查。 他们烧毁了。 :o
如果你只是需要得到一个维度,像填充,minHeight(我的情况是:android.R.attr.listPreferredItemPaddingStart)。 你可以做:
TypedValue typedValue = new TypedValue(); ((Activity)context).getTheme().resolveAttribute(android.R.attr.listPreferredItemPaddingStart, typedValue, true);
就像问题一样,然后:
final DisplayMetrics metrics = new android.util.DisplayMetrics(); WindowManager wm = (WindowManager)mContext.getSystemService(Context.WINDOW_SERVICE); wm.getDefaultDisplay().getMetrics(metrics); int myPaddingStart = typedValue.getDimension( metrics );
就像删除的答案。 这将允许您跳过处理设备像素大小,因为它使用默认的设备指标。 返回值将是float,并且您应该转换为int。
对于你正在试图获得的types,比如resourceId。
这是我的代码。
public static int getAttributeSize(int themeId,int attrId, int attrNameId) { TypedValue typedValue = new TypedValue(); Context ctx = new ContextThemeWrapper(getBaseContext(), themeId); ctx.getTheme().resolveAttribute(attrId, typedValue, true); int[] attributes = new int[] {attrNameId}; int index = 0; TypedArray array = ctx.obtainStyledAttributes(typedValue.data, attributes); int res = array.getDimensionPixelSize(index, 0); array.recycle(); return res; } // getAttributeSize(theme, android.R.attr.textAppearanceLarge, android.R.attr.textSize) ==> return android:textSize