Android:如何获取代码中的属性值?

我想在代码中检索textApperanceLarge的int值。 我相信下面的代码是正确的方向,但不知道如何从TypedValue提取int值。

TypedValue typedValue = new TypedValue(); ((Activity)context).getTheme().resolveAttribute(android.R.attr.textAppearanceLarge, typedValue, true); 

Solutions Collecting From Web of "Android:如何获取代码中的属性值?"

您的代码只获取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