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ć?
pewne wyjaśnienia, które pomogły mi: the 'R.drawable.blank' jest domyślnym zasobem w przypadku wniosek taki nie istnieje – HaydenKai