Frage Android: Wie bekomme ich einen Wert eines Attributs im Code?


Ich möchte den int-Wert von textApperanceLarge im Code abrufen. Ich glaube, dass der folgende Code in die richtige Richtung geht, aber nicht herausfinden kann, wie der Int-Wert aus dem TypedValue extrahiert wird.

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

76
2017-10-25 22:23


Ursprung


Antworten:


Ihr Code erhält nur die Ressourcen-ID des Stils, den Sie verwenden textAppearanceLarge Attributspunkte, nämlich TextAppearance.Large wie Reno darauf hinweist.

Um das zu bekommen Textgröße Attributwert aus dem Stil, fügen Sie einfach diesen Code hinzu:

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

Jetzt Textgröße wird die Textgröße in Pixel des Stils sein textApparanceLarge zeigt auf, oder -1, wenn es nicht festgelegt wurde. Dies wird angenommen typedValue.type war vom Typ TYPE_REFERENCE, damit Sie das zuerst überprüfen sollten.

Die Nummer 16973890 kommt von der Tatsache, dass es die Ressourcen-ID von ist TextAppearance.Large


112
2017-10-27 08:50



Verwenden

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

Für die Zeichenfolge:

typedValue.string
typedValue.coerceToString()

Für andere Daten:

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

In Ihrem Fall ist das, was es zurückgibt, der TYPE_REFERENCE.

Ich weiß, dass es darauf hinweisen sollte TextAppearance.Large

Welches ist :

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

Credit geht an Martin für die Lösung dieses Problems:

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



Es scheint eine Inquisition auf der @ user3121370 Antwort zu sein. Sie sind niedergebrannt. :O

Wenn Sie nur eine Dimension benötigen, wie eine Auffüllung, minHeight (mein Fall war: android.R.attr.listPreferredItemPaddingStart). Du kannst tun:

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

Genau wie die Frage und dann:

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

Genau wie die entfernte Antwort. Dadurch können Sie die Größe der Gerätepixel überspringen, da die Standardmetrik des Geräts verwendet wird. Die Rückgabe wird float sein, und Sie sollten nach int umwandeln.

Achten Sie auf den Typ, den Sie versuchen zu erhalten, wie zum Beispiel ressourceId.


3
2017-07-07 15:58



Das ist mein Code.

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