Utworzyłem niestandardowy widget i ogłaszam go w layout.xml. Dodałem także niestandardowe atrybuty w pliku attr.xml. Jednak gdy próbuję zadeklarować te atrybuty w stylu w styles.xml, daje mi toNo resource found that matches the given name: attr 'custom:attribute'.
Umieściłem xmlns:custom="http://schemas.android.com/apk/res/com.my.package"
we wszystkich tagach w styles.xml, w tym <?xml>
, <resources>
i <style>
, ale nadal daje mi ten sam błąd, że nie może znaleźć mojej niestandardowej przestrzeni nazw XML.
Mogę jednak użyć mojej przestrzeni nazw, aby ręcznie przypisać atrybuty do widoku w moim layout.xml, więc nie ma nic złego w przestrzeni nazw. Mój problem polega na uświadomieniu styles.xml mojego attr.xml.
android
android-layout
android-xml
android-styles
styler1972
źródło
źródło
cutsom:xmlns=...
?? nie powinno byćxmlns:cutsom=...
?Odpowiedzi:
Rozgryzłem to! Odpowiedź brzmi: NIE należy określać przestrzeni nazw w stylu.
źródło
declare-stylable
zamiast enum. Nie jestem pewien, dlaczego wyliczenia nie działały, ale to obejście było dla mnie wystarczająco dobre.powyższa odpowiedź jest dla mnie sprawdzona, próbowałem drobnej zmiany, deklaruję stylowy dla klasy element zasobów.
w declare-styleable The nazwa atrybutu odwołuje nazwę klasy, więc miałem widok klasy połączenia „com.my.package.name.VerticalView”, to stwierdzenie, że przedstawiciele muszą mieć zastosowanie w VerticalView lub podklas VerticalView. więc możemy zadeklarować styl w ten sposób:
dlatego nie zadeklarowaliśmy przestrzeni nazw w elemencie zasobów, nadal działa.
źródło
wartości / styles.xml
wartości / attrs.xml
wartości / kolory.xml
wartości / dimens.xml
Za pomocą
PRÓBNY
źródło
Modyfikacja Stylera i Vince'a działała dla mnie. Chciałem zauważyć, że wyjaśnienie @ vince'a może nie być całkowicie dokładne.
Aby przetestować hipotezę, że atrybut name
declare-styleable
pasujący do nazwy niestandardowej klasy widoku umożliwia nam dostęp do atrybutu niestandardowego bez przestrzeni nazw, zmieniłem nazwędeclare-styleable
(widok niestandardowy został nazwanyTestViewFont
:Następnie zmieniłem
obtainStyledAttributes
połączenie w widoku niestandardowym, aby odzwierciedlić to:Kod nadal działał. Więc nie sądzę, że jest to jakaś introspekcja
declare-styleable
klasy, od której pochodzi jej nazwa.W ten sposób jestem przekonany, że wszelkie niestandardowe atrybuty mogą być użyte do deklarowania stylu bez odwoływania się do przestrzeni nazw.
Niezależnie od tego, dzięki za pomoc, chłopaki rozwiązali mój problem.
źródło
declare-styleable
bloku, czy nie. (przepraszam, nie mogę znaleźć strony referencyjnej dla tego…) Z wyjątkiem atrybutów zandroid
przestrzeni nazw, powinieneś podać tylko nazwę atrybutu.Zdefiniuj niektóre atrybuty
Użyj go w pliku układu, takim jak
Na koniec użyj go w pliku stylu
Różnica między plikiem stylu a plikiem układu polega na tym, że nie dodajemy prefiksówapp:
Spróbuj, miłego dnia, to działa dla mnie.
źródło
Jeśli pomógłby komukolwiek innemu, mój błąd polegał na tym, że moja niestandardowa klasa widoku wywoływała AttributeSet.getAttributeValue np.
... co spowodowało, że mój niestandardowy atrybut nie został odczytany dla mojego widoku niestandardowego.
Poprawka polegała na użyciu
obtainStyledAttributes
w moim widoku niestandardowym:Wskazówka, że to działa poprawnie, polega na tym, że możesz Ctrl / Apple + kliknąć na,
R.styleable.MyTextViewStyleable_customFont
aby przejść bezpośrednio do definicji attrs.xml.Zajęło mi trochę czasu zauważenie tej krytycznej różnicy między moim kodem a innymi przykładami, ponieważ niestandardowy atrybut działał dobrze, gdy był przekazywany bezpośrednio przez układ XML (zamiast przez styl).
źródło