2012-01-09 10 views
33

Tôi có một kịch bản trong đó tôi muốn thiết lập một Drawable phụ thuộc vào chủ đề xác định.nguồn truy cập quy định tại chủ đề và attrs.xml android

Để giải thích điều này hơn nữa, đây là những gì tôi có trong mã:

\ res \ giá trị \ attrs.xml

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

res \ giá trị \ 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> 

Vì vậy, khi bạn đã nhận thấy tôi đang xác định homeIcon attr tùy chỉnh và đặt giá trị thuộc tính trong AppTheme.

Khi tôi xác định thuộc tính này trong một XML layout và cố gắng truy cập vào nó nó hoạt động trơn tru

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

và ám chỉ rằng Drawable ic_home trong một ImageView.

Nhưng tôi không thể tìm ra cách để truy cập Drawable lập trình.

Tôi cố gắng để làm điều này với một công trình xung quanh, bằng cách định nghĩa một người giữ LayerList Drawable, mà kết quả trong nguồn không tìm thấy ngoại lệ:

<?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> 

Tóm tắt tôi muốn truy cập các Drawable định nghĩa trong một tùy chỉnh được xác định Theme theo chương trình.

Trả lời

64

Tôi nghĩ rằng bạn có thể nhận được drawable với mã này:

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

Vui lòng đánh giá nếu nó phù hợp với bạn. – dmaxi

+0

Cảm ơn bạn :) nó đã hoạt động! – Shardul

+0

Làm việc cho tôi để ..! Cảm ơn! :) – DroidBee

9

Một cách khác có thể làm điều đó:

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; 
    } 

không cần phải tái chế bất cứ điều gì ở đây ...

sử dụng:

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

nó làm việc cho tôi. nhưng tại sao không cần tái chế? –

+1

@OlumideOyetoke Kiểm tra tài liệu: http://developer.android.com/reference/android/util/TypedValue.html. Không có chức năng tái chế ở đó ... –

2

tôi sử dụng dưới đây phương pháp để có được id hình thức tài nguyên thuộc tính style. Sau đó, nó có thể được sử dụng cho drawable, string, kích thước như vậy.

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

cổ vũ :-)

0

Đây là kết quả điều tra của tôi, liên quan đến chủ đề này. Nếu chúng tôi có declare-stylable thì chúng tôi có thể ghi đè các giá trị đó trong các chủ đề.

Cho đến nay, cách tốt nhất mà tôi tìm thấy cách nhận chúng là như sau.

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

Bằng cách sử dụng R.styleable.AppTheme_homeIcon chúng tôi đang tham chiếu chính xác thuộc tính mà chúng tôi muốn. Ví dụ, nếu chúng ta có sẽ có vài thuộc tính nhiều hơn chúng ta có thể tham khảo như sau:

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

Và nếu trong chủ đề hiện những thuộc tính đã không được định nghĩa bạn sẽ nhận được giá trị mặc định và không có ngoại lệ.

Các vấn đề liên quan