Myślę, że istnieje tylko jedna różnica między deklarowaniem atrybutu jako nadającego się do stylu lub nie.
W attrs.xml można zadeklarować atrybuty niestandardowe, bezpośrednio w sekcji „zasoby” lub w „deklarują-styleable”:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<attr name="attrib1" format="string" />
<declare-styleable name="blahblah">
<attr name="attrib2" format="string" />
</declare-styleable>
Więc teraz mamy zdefiniowany jako „attrib1” non-styleable i " attrib2 "jako stylowy.
W layout/someactivity.xml
możemy bezpośrednio korzystać z tych atrybutów (nie potrzebne nazw):
<com.custom.ViewClass attrib1="xyz" attrib2="abc"/>
Można użyć "styleable" atrybut "attrib2" w deklaracji style.xml
. Ponownie, tutaj nie jest wymagana przestrzeń nazw (nawet jeśli w układzie XML użyto przestrzeni nazw).
<style name="customstyle" parent="@android:style/Widget.TextView">
<item name="attrib2">text value</item>
<!-- customize other, standard attributes too: -->
<item name="android:textColor">@color/white</item>
</style>
Następnie można również ustawić atrybuty dla każdego stylu.
<com.custom.CustomView attrib1="xyz" style="@style/customstyle"/>
Załóżmy, że mamy to zrobić: ustawiamy attrib1
bezpośrednio w formacie XML, a my ustawić attrib2
w stylu.
Gdzie indziej widziałem opisy stwierdzające, że "blahblah
" musi być nazwą niestandardowej klasy widoku, która używa tych atrybutów, i że należy użyć przestrzeni nazw w celu odniesienia do niestandardowych atrybutów w układzie XML. Ale nic z tego nie wydaje się konieczne.
Różnica między styleable i braku styleable wydaje się, że:
- Można użyć styleable atrybuty „
style.xml
” deklaracji.
- Konstruktor klasy niestandardowej musi odczytywać atrybuty stylów i nie-stylów w inny sposób: atrybuty stylu z atrybutami
obtainStyledAttributes()
i niepowiązane atrybuty z attr.getAttributeValue()
lub podobnym.
W większości samouczków i przykładów, które widziałem w Internecie, użyto tylko wersji obtainStyledAttributes()
.Nie działa to jednak w przypadku atrybutów zadeklarowanych bezpośrednio w układzie, bez użycia stylu. Jeśli wykonasz obtainStyledAttributes()
, jak pokazano w większości samouczków, w ogóle nie otrzymasz atrybutu attrib1
; dostaniesz tylko attrib2
, ponieważ został zadeklarowany w stylu. Metoda bezpośredniego korzystania attr.getAttributeValue()
prace:
public CustomView(Context context, AttributeSet attrs) {
super(context, attrs);
String attrib1 = attrs.getAttributeValue(null, "attrib1");
// do something with this value
}
Ponieważ używaliśmy żadnych nazw zadeklarować „attrib1
” mijamy null
jako argument przestrzeni nazw w getAttributeValue()
.
wspaniała odpowiedź. Wezmę to do siebie kilka razy, jeśli będę mógł. –
dokładnie o co mi chodziło, fajna odpowiedź –
czyste wyjaśnienie, od razu do rzeczy. – VallaDanger