Pertanyaan Android: bagaimana cara mendapatkan nilai atribut dalam kode?


Saya ingin mengambil nilai int textApperanceLarge dalam kode. Saya percaya bahwa kode di bawah ini berjalan ke arah yang benar, tetapi tidak dapat mencari cara mengekstrak nilai int dari TypedValue.

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

76
2017-10-25 22:23


asal


Jawaban:


Kode Anda hanya mendapat ID sumber daya dari gaya yang textAppearanceLarge menunjuk ke atribut, yaitu TextAppearance.Large seperti yang ditunjukkan Reno.

Untuk mendapatkan ukuran teks nilai atribut dari gaya, cukup tambahkan kode ini:

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

Sekarang ukuran teks akan menjadi ukuran teks dalam piksel gaya itu textApperanceLarge menunjuk ke, atau -1 jika tidak ditetapkan. Ini diasumsikan typedValue.type adalah tipe TYPE_REFERENCE untuk memulainya, jadi Anda harus memeriksanya terlebih dahulu.

Nomor 16973890 berasal dari fakta bahwa itu adalah ID sumber daya TextAppearance.Large


112
2017-10-27 08:50



Menggunakan

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

Untuk string:

typedValue.string
typedValue.coerceToString()

Untuk data lain:

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

Dalam kasus Anda apa yang dikembalikan adalah dari TYPE_REFERENCE.

Saya tahu itu harus menunjuk ke TextAppearance.Large

Yang mana :

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

Kredit pergi ke Martin untuk menyelesaikan ini:

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



Tampaknya menjadi inkuisisi pada jawaban @ user3121370. Mereka terbakar habis. :HAI

Jika Anda hanya perlu mendapatkan dimensi, seperti padding, minHeight (kasus saya adalah: android.R.attr.listPreferredItemPaddingStart). Anda dapat melakukan:

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

Sama seperti pertanyaan itu, dan kemudian:

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

Sama seperti jawaban yang dihapus. Ini akan memungkinkan Anda melewati penanganan ukuran piksel perangkat, karena menggunakan metrik perangkat default. Pengembalian akan mengambang, dan Anda harus mentransmisikan ke int.

Hati-hati dengan jenis yang Anda coba dapatkan, seperti resourceId.


3
2017-07-07 15:58



ini adalah kode saya.

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