Android: Kodda bir özelliğin değeri nasıl elde edilir?


84

TextApperanceLarge'ın koddaki int değerini almak istiyorum. Aşağıdaki kodun doğru yönde gittiğine inanıyorum, ancak TypedValue'dan int değerini nasıl çıkaracağımı bulamıyorum.

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

Yanıtlar:


129

Kodunuz yalnızca textAppearanceLarge özniteliğinin işaret ettiği stilin kaynak kimliğini alır , yani Reno'nun işaret ettiği TextAppearance.Large .

TextSize öznitelik değerini stilden almak için şu kodu eklemeniz yeterlidir :

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

Artık textSize , textApperanceLarge öğesinin işaret ettiği stilin piksel cinsinden metin boyutu veya ayarlanmamışsa -1 olacaktır. Bu, typedValue.type'ın başlamak için TYPE_REFERENCE türünde olduğunu varsayar , bu nedenle önce bunu kontrol etmelisiniz.

Numara 16973890 bunun kaynak kimliği olmasından gelir TextAppearance.Large


6
tıkır tıkır çalışıyor. neden bu kadar karmaşık olmak zorunda ... altı yıl sonra şimdiye kadar daha az anlaşılmaz bir yaklaşım yok mu?
Cee McSharpface

55

Kullanma

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

Dize için:

typedValue.string
typedValue.coerceToString()

Diğer veriler için:

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

Sizin durumunuzda döndürdüğü şey TYPE_REFERENCE.

TextAppearance.Large öğesini işaret etmesi gerektiğini biliyorum

Hangisi :

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

Kredi, sorunu çözmek için Martin'e gidiyor:

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

1
typedValue.data şu şekilde değerlendirilir: 16973890. Bu, metin boyutu için doğru görünmüyor.
ab11

@ ab11 metin boyutu değil. Boyutlar kaynağının tam sayısıdır.
Sevastyan Savanyuk

9

Veya kotlin'de:

fun Context.dimensionFromAttribute(attribute: Int): Int {
    val attributes = obtainStyledAttributes(intArrayOf(attribute))
    val dimension = attributes.getDimensionPixelSize(0, 0)
    attributes.recycle()
    return dimension
}

4

@ User3121370'in cevabı üzerine bir sorgulama gibi görünüyor. Yandılar. :Ö

Dolgu gibi bir boyuta ihtiyacınız varsa, minHeight (benim durumum: android.R.attr.listPreferredItemPaddingStart). Yapabilirsin:

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

Tıpkı sorunun yaptığı gibi ve sonra:

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

Tıpkı kaldırılan cevap gibi. Bu, varsayılan cihaz ölçüsünü kullandığı için cihaz piksel boyutlarını işlemeyi atlamanıza olanak tanır. Dönüş float olacaktır ve int'e çevirmelisiniz.

ResourceId gibi, almaya çalıştığınız türe dikkat edin.


1

bu benim kodum.

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.