wake-up-neo.net

Greifen Sie auf die in den Themen theme und attrs.xml android definierten Ressourcen zu

Ich habe ein Szenario, in dem ich abhängig von dem definierten Design einen Drawableeinstellen möchte.

Um dies weiter zu erklären, habe ich Folgendes im Code:

\res\values ​​\ attrs.xml

<resources>
    <declare-styleable name="AppTheme">
        <attr name="homeIcon" format="reference" />
    </declare-styleable>
</resources>

res\values ​​\ styles.xml

<resources>
    <style name="AppTheme" parent="Android:style/Theme">
        <item name="attr/homeIcon">@drawable/ic_home</item>
    </style>
</resources>

AndroidManifest.xml

    <application Android:label="@string/app_name"
        Android:theme="@style/AppTheme">
        <activity Android:name=".MainActivity" Android:label="@string/app_name">
            <intent-filter>
                <action Android:name="Android.intent.action.MAIN" />
                <category Android:name="Android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

Wie Sie bemerkt haben, definiere ich ein benutzerdefiniertes attr homeIcon und setze den Attributwert in AppTheme.

Wenn ich dieses Attribut in einem XML-Layout definiere und versuche, darauf zuzugreifen, funktioniert es reibungslos

<ImageView Android:id="@+id/img"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:layout_gravity="center"
        Android:src="?attr/homeIcon" />

und rendert das Drawableic_home in einem ImageViewname__.

Ich kann jedoch nicht herausfinden, wie ich programmgesteuert auf Drawablezugreifen kann.

Ich habe versucht, dies mit einer Umgehung zu tun, indem ich einen Besitzer LayerList Drawable definierte, der dazu führt, dass die Ressource nicht gefunden wurde.

<?xml version="1.0" encoding="utf-8"?>
<layer-list
    xmlns:Android="http://schemas.Android.com/apk/res/Android" >
    <item
        Android:drawable="?attr/homeIcon" />
</layer-list>

Zusammenfassung Ich möchte programmgesteuert auf den Drawablezugreifen, der in einem benutzerdefinierten Themedefiniert ist.

33
Shardul

Ich denke, dass Sie das Drawable mit diesem Code bekommen können:

TypedArray a = getTheme().obtainStyledAttributes(R.style.AppTheme, new int[] {R.attr.homeIcon});     
int attributeResourceId = a.getResourceId(0, 0);
Drawable drawable = getResources().getDrawable(attributeResourceId);
a.recycle();
68
dmaxi

Eine andere Möglichkeit, dies zu tun:

  public static int getResIdFromAttribute(final Activity activity,final int attr)
    {
    if(attr==0)
      return 0;
    final TypedValue typedvalueattr=new TypedValue();
    activity.getTheme().resolveAttribute(attr,typedvalueattr,true);
    return typedvalueattr.resourceId;
    }

hier müssen Sie nichts recyceln ...

verwendungszweck:

int drawableResId=getResIdFromAttribute(this,R.attr.homeIcon);
Drawable drawable = getResources().getDrawable(drawableResId);
9

Ich habe die Methode unten verwendet, um das Formattribut des Ressourcen-ID-Formats zu erhalten. Dann kann es für Drawable, String, Dimension usw. verwendet werden.

TypedArray typedArray = context.getTheme().obtainStyledAttributes(new int[] { R.attr.attrName });   
int resourceId = typedArray.getResourceId(0, defaultResourceId);
typedArray.recycle();

prost :-)

2
dheeran

Wenn Sie die Support-/Design-Bibliothek verwenden, ist der einfachere Weg, Drawables jetzt zu erhalten,

Context.getDrawable(int)

oder 

ContextCompat.getDrawable(Context, int)

referenz - https://plus.google.com/+BenjaminWeiss/posts/M1dYFaobyBM

1
Parag Naik

Hier sind Ergebnisse meiner Untersuchung zu diesem Thema. Wenn wir declare-stylable haben, können wir diese Werte in Themen überschreiben.

Der beste Weg, wie ich sie finden konnte, ist der folgende.

TypedArray a = context.getTheme().obtainStyledAttributes(R.styleable.AppTheme);
a.getDrawable(R.styleable.AppTheme_homeIcon);

Mit R.styleable.AppTheme_homeIcon referenzieren wir genau das Attribut, das wir wollen. Wenn wir zum Beispiel etwas mehr Attribute hätten, als wir sie wie folgt referenzieren können:

a.getColor(R.styleable.AppTheme_color,defaultValue);
a.getDimension(R.styleable.AppTheme_width,defaultWidth);

Wenn diese Attribute im aktuellen Design nicht definiert wurden, erhalten Sie Standardwerte und keine Ausnahmen.

0
Lemberg