Câu hỏi Android: làm thế nào để có được giá trị của một thuộc tính trong mã?


Tôi muốn lấy giá trị int của textApperanceLarge trong mã. Tôi tin rằng mã dưới đây đang đi đúng hướng, nhưng không thể tìm ra cách trích xuất giá trị int từ TypedValue.

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

76
2017-10-25 22:23


gốc


Tương tự như Truy cập attrs trong AttributeSet cho các thành phần tùy chỉnh - Suragch


Các câu trả lời:


Mã của bạn chỉ nhận được ID tài nguyên của kiểu mà textAppearanceLarge điểm thuộc tính, cụ thể là TextAppearance.Large như Reno chỉ ra.

Để có được cỡ chữ giá trị thuộc tính từ kiểu, chỉ cần thêm mã này:

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();

Hiện nay cỡ chữ sẽ là kích thước văn bản theo pixel của kiểu textApperanceLarge trỏ đến, hoặc -1 nếu nó không được đặt. Đây là giả định typedValue.type thuộc loại TYPE_REFERENCE để bắt đầu, vì vậy bạn nên kiểm tra điều đó trước tiên.

Con số 16973890 xuất phát từ thực tế rằng đó là ID tài nguyên của TextAppearance.Large


112
2017-10-27 08:50



hoạt động như một sự quyến rũ. tại sao nó lại phức tạp đến thế ... bây giờ không còn ít người biết đến, sáu năm sau? - dlatikay


Sử dụng

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

Đối với chuỗi:

typedValue.string
typedValue.coerceToString()

Đối với dữ liệu khác:

typedValue.resourceId
typedValue.data  // (int) based on the type

Trong trường hợp của bạn, những gì nó trả về là của TYPE_REFERENCE.

Tôi biết nó nên trỏ đến TextAppearance.Large

Đó là:

<style name="TextAppearance.Large">
    <item name="android:textSize">22sp</item>
    <item name="android:textStyle">normal</item>
    <item name="android:textColor">?textColorPrimary</item>
</style>

Tín dụng đi đến Martin để giải quyết vấn đề này:

int[] attribute = new int[] { android.R.attr.textSize };
TypedArray array = context.obtainStyledAttributes(typedValue.resourceId, attribute);
int textSize = array.getDimensionPixelSize(0, -1);

43
2017-10-26 02:54



typedValue.data đánh giá thành: 16973890. Điều này có vẻ không đúng, đối với kích thước văn bản. - ab11


Nó có vẻ là một sự suy luận về câu trả lời của @ user3121370. Chúng bị đốt cháy. : O

Nếu bạn chỉ cần có được một chiều, giống như một padding, minHeight (trường hợp của tôi là: android.R.attr.listPreferredItemPaddingStart). Bạn có thể làm:

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

Cũng giống như câu hỏi đã làm, và sau đó:

final DisplayMetrics metrics = new android.util.DisplayMetrics();
WindowManager wm = (WindowManager)mContext.getSystemService(Context.WINDOW_SERVICE);
wm.getDefaultDisplay().getMetrics(metrics);
int myPaddingStart = typedValue.getDimension( metrics );

Cũng giống như câu trả lời đã xóa. Điều này sẽ cho phép bạn bỏ qua các kích thước pixel thiết bị xử lý, bởi vì nó sử dụng số liệu thiết bị mặc định. Sự trở lại sẽ được thả nổi, và bạn nên cast vào int.

Becareful đến loại bạn đang cố gắng để có được, như resourceId.


3
2017-07-07 15:58





đây là mã của tôi.

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

0
2017-08-30 07:49