20

Mając to widok niestandardowy MyView zdefiniować niektóre niestandardowe atrybuty:uzyskać identyfikator zasobu dla rozciągliwej odniesienia stosowane w stylizujące atrybut

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <declare-styleable name="MyView"> 
     <attr name="normalColor" format="color"/> 
     <attr name="backgroundBase" format="integer"/> 
    </declare-styleable> 
</resources> 

i przypisać je w następujący sposób w XML układ:

<com.example.test.MyView 
     android:id="@+id/view1" 
     android:text="@string/app_name" 
     . . . 
     app:backgroundBase="@drawable/logo1" 
     app:normalColor="@color/blue"/> 

Na początku pomyślałem, że mogę pobrać niestandardowy atrybut backgroundBase przy użyciu:

TypedArray a = context.getTheme().obtainStyledAttributes(attrs, R.styleable.MyView, defStyle, 0); 
int base = a.getInteger(R.styleable.MyView_backgroundBase, R.drawable.blank); 

Działa tylko wtedy, gdy atrybut nie jest przypisany i zwracana jest wartość domyślna R.drawable.blank.
Kiedy app:backgroundBase jest przypisany jest wyjątek „nie można przekonwertować na liczbę całkowitą typu = 0xn” ponieważ, chociaż format niestandardowy atrybut deklaruje ją jako liczbę całkowitą, to naprawdę odwołuje się Drawable i powinny być pobierane w sposób następujący:

Drawable base = a.getDrawable(R.styleable.MyView_backgroundBase); 
if(base == null) base = BitMapFactory.decodeResource(getResources(), R.drawable.blank); 

To działa.
Teraz moje pytanie:
ja naprawdę nie chcę uzyskać Drawable z TypedArray, chcę id całkowitą odpowiadającą app:backgroundBase (w powyższym przykładzie byłoby R.drawable.logo1). Jak mogę to dostać?

Odpowiedz

36

Okazuje się, że odpowiedź była tam:

TypedArray a = context.getTheme().obtainStyledAttributes(attrs, R.styleable.MyView, defStyle, 0); 
int base = a.getResourceId(R.styleable.MyView_backgroundBase, R.drawable.blank); 
+3

pewne wyjaśnienia, które pomogły mi: the 'R.drawable.blank' jest domyślnym zasobem w przypadku wniosek taki nie istnieje – HaydenKai

Powiązane problemy