Pytanie Android: jak uzyskać wartość atrybutu w kodzie?


Chciałbym pobrać wartość int textApperanceLarge w kodzie. Wierzę, że poniższy kod idzie w dobrym kierunku, ale nie może dowiedzieć się, jak wyodrębnić wartość int z TypedValue.

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

76
2017-10-25 22:23


pochodzenie


Podobny do Dostęp do attrs w AttributeSet dla komponentów niestandardowych - Suragch


Odpowiedzi:


Twój kod otrzymuje tylko identyfikator zasobu stylu, który textAppearanceDuży przypisywać punkty, mianowicie TextAppanceance.Large jak wskazuje Reno.

Aby uzyskać rozmiar czcionki wartość atrybutu ze stylu, po prostu dodaj ten kod:

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

Teraz rozmiar czcionki będzie rozmiar tekstu w pikselach stylu, który textApperanceLarge wskazuje na, lub -1, jeśli nie został ustawiony. Zakłada się typedValue.type był na początku typem TYPE_REFERENCE, więc powinieneś to najpierw sprawdzić.

Numer 16973890 pochodzi z faktu, że jest to identyfikator zasobu TextAppanceance.Large


112
2017-10-27 08:50



działa jak marzenie. tylko dlaczego to musi być tak skomplikowane ... czy nie ma teraz mniej niejasnego podejścia, sześć lat później? - dlatikay


Za pomocą

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

Dla ciągu znaków:

typedValue.string
typedValue.coerceToString()

W przypadku innych danych:

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

W twoim przypadku to, co zwraca, jest z TYPE_REFERENCE.

Wiem, że powinno to wskazywać TextAppanceance.Large

Który jest :

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

Podziękowania należą się Martinowi za rozwiązanie tego problemu:

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 wynosi: 16973890. To nie wydaje się poprawne, jeśli chodzi o rozmiar tekstu. - ab11


Wydaje się, że jest to inkwizycja na odpowiedź @ user3121370. Spłonęły. : O

Jeśli potrzebujesz tylko wymiaru, np. Wypełnienia, minHeight (mój przypadek to: android.R.attr.listPreferredItemPaddingStart). Możesz to zrobić:

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

Tak jak pytanie, a następnie:

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

Podobnie jak usunięta odpowiedź. Umożliwi to pominięcie pikselów urządzeń obsługujących, ponieważ używa domyślnych danych urządzenia. Zwrot będzie unosił się i powinieneś rzucić na int.

Staje się typem, który próbujesz zdobyć, np. ResourceId.


3
2017-07-07 15:58





to jest mój kod.

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