2011-01-03 12 views
20

Zacząłem bawić się stylami i podobnymi w moich aplikacjach na Androida, a wszystko działało do tej pory. Zrozumiałem "styl" section of the guide.Różnica między stylem deklarowalnym i stylem

Ale, rozglądając się, jak w this thread, nie mogę naprawdę dowiedzieć się różnicy między tymi dwoma (declare-stylable i style). Z mojegorozumienia declare-styleable przyjmuje atrybut określony w nim i określa go jako stylowy, a następnie z kodu zmienia się tak, jak chce.

Ale jeśli tak właśnie jest, czy nie byłoby prostszym zdefiniowanie atrybutu w układzie? Lub zadeklarować styl określający to?

Odpowiedz

52

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().

+0

wspaniała odpowiedź. Wezmę to do siebie kilka razy, jeśli będę mógł. –

+0

dokładnie o co mi chodziło, fajna odpowiedź –

+0

czyste wyjaśnienie, od razu do rzeczy. – VallaDanger

2

Sprawdź to thread.

Bez numeru declare-styleable nie można utworzyć nowego niestandardowego stanu losowania.

+0

Różnica polega na tym, że stylowanie-deklarowalne daje możliwość wprowadzenia nowych atrybutów, dzięki którym możesz tworzyć magię, jak na przykład stany rysowania (domyślam się, że muszą być inne zastosowania) i styl po prostu grupuje zestaw atrybutów już istniejący? Ma sens, dzięki. – Stephan

Powiązane problemy