Muszę zaimplementować własne atrybuty jak w com.android.R.attr
Nie znalazłem nic w oficjalnej dokumentacji, więc potrzebuję informacji o tym, jak zdefiniować te attry i jak ich używać z mojego kodu.
android
android-resources
android-attributes
Alexander Oleynikov
źródło
źródło
Odpowiedzi:
Obecnie najlepszą dokumentacją jest źródło. Możesz na to spojrzeć tutaj (attrs.xml) .
Możesz zdefiniować atrybuty w górnym
<resources>
elemencie lub wewnątrz<declare-styleable>
elementu. Jeśli zamierzam użyć attr w więcej niż jednym miejscu, umieszczam go w elemencie głównym. Uwaga: wszystkie atrybuty mają tę samą globalną przestrzeń nazw. Oznacza to, że nawet jeśli utworzysz nowy atrybut w<declare-styleable>
elemencie, można go użyć poza nim i nie możesz utworzyć innego atrybutu o tej samej nazwie innego typu.<attr>
Element ma dwa atrybuty xmlname
iformat
.name
pozwala ci to nazwać czymś i tak w ten sposób ostatecznie odwołujesz się do niego w kodzie, npR.attr.my_attribute
.format
Atrybut może mieć różne wartości w zależności od typu „” atrybutu chcesz.Możesz ustawić format na wiele typów, używając
|
npformat="reference|color"
.enum
atrybuty można zdefiniować w następujący sposób:flag
atrybuty są podobne, z tym wyjątkiem, że wartości muszą zostać zdefiniowane, aby można je było bitować razem:Oprócz atrybutów istnieje
<declare-styleable>
element. Pozwala to zdefiniować atrybuty, których może używać widok niestandardowy. Robisz to poprzez określenie<attr>
elementu, jeśli został wcześniej zdefiniowany, nie określaszformat
. Jeśli chcesz ponownie użyć Androida ATTR, na przykład Android: grawitacja, możesz to zrobić wname
następujący sposób.Przykład niestandardowego widoku
<declare-styleable>
:Podczas definiowania niestandardowych atrybutów w formacie XML w widoku niestandardowym należy wykonać kilka czynności. Najpierw musisz zadeklarować przestrzeń nazw, aby znaleźć swoje atrybuty. Robisz to na elemencie układu głównego. Zwykle jest tylko
xmlns:android="http://schemas.android.com/apk/res/android"
. Musisz teraz również dodaćxmlns:whatever="http://schemas.android.com/apk/res-auto"
.Przykład:
Wreszcie, aby uzyskać dostęp do tego niestandardowego atrybutu, zwykle robi się to w konstruktorze niestandardowego widoku w następujący sposób.
Koniec. :)
źródło
View
: github.com/commonsguy/cw-advandroid/tree/master/Views/…xmlns:my="http://schemas.android.com/apk/lib/my.namespace"
- bez kopiowania attrs.xml. Uwaga: ścieżka identyfikatora URI przestrzeni nazw musi mieć postać / apk / * lib * not / apk / res.apk/lib
sztuczka nie działała dla mnie na niestandardowych atrybutach z formatem referencyjnym z projektu bibliotecznego. Co zrobił praca była do użytkuapk/res-auto
, jak zasugerowano w stackoverflow.com/a/13420366/22904 tuż poniżej, a także w stackoverflow.com/a/10217752enum
iflag
: pierwsza pozwala nam wybrać jedną i tylko jedną wartość, druga pozwala połączyć kilka. Napisałem dłuższą odpowiedź w podobnym pytaniu tutaj i po znalezieniu tego pytania pomyślałem, że będę z nim link.a.recycle()
jest bardzo ważne, aby zwolnić pamięćOdpowiedź Qberticusa jest dobra, ale brakuje jednego przydatnego szczegółu. Jeśli implementujesz je w bibliotece, zamień:
z:
W przeciwnym razie aplikacja korzystająca z biblioteki będzie miała błędy w czasie wykonywania.
źródło
Powyższa odpowiedź obejmuje wszystko bardzo szczegółowo, z wyjątkiem kilku rzeczy.
Po pierwsze, jeśli nie ma stylów,
(Context context, AttributeSet attrs)
do utworzenia preferencji zostanie użyta sygnatura metody. W takim przypadku wystarczy użyć,context.obtainStyledAttributes(attrs, R.styleable.MyCustomView)
aby uzyskać TypedArray.Po drugie, nie obejmuje to, jak radzić sobie z zasobami kamienia nazębnego (ciągi ilości). Nie można sobie z tym poradzić przy użyciu TypedArray. Oto fragment kodu z mojego SeekBarPreference, który ustawia podsumowanie preferencji formatując jego wartość zgodnie z wartością preferencji. Jeśli xml dla preferencji ustawia android: podsumowanie na ciąg tekstowy lub ciąg znaków resouce, wartość preferencji jest formatowana do ciągu (powinien zawierać% d, aby podnieść wartość). Jeśli Android: podsumowanie jest ustawione na zasób plaurals, to jest on używany do formatowania wyniku.
notifyChanged()
onDialogClosed
metodę preferencji .źródło
Tradycyjne podejście jest pełne kodu podstawowego i niezręcznej obsługi zasobów. Dlatego stworzyłem szkielet Spyglass . Aby zademonstrować, jak to działa, oto przykład pokazujący, jak utworzyć niestandardowy widok, który wyświetla tytuł String.
Krok 1: Utwórz niestandardową klasę widoku.
Krok 2: Zdefiniuj atrybut ciągu w
values/attrs.xml
pliku zasobów:Krok 3: Zastosuj
@StringHandler
adnotację dosetTitle
metody, aby poinformować środowisko Spyglass, aby kierowała wartość atrybutu do tej metody, gdy widok jest zawyżony.Teraz, gdy Twoja klasa ma adnotację Spyglass, struktura Spyglass wykryje ją w czasie kompilacji i automatycznie wygeneruje
CustomView_SpyglassCompanion
klasę.Krok 4: Użyj wygenerowanej klasy w
init
metodzie widoku niestandardowego :Otóż to. Teraz, gdy tworzysz instancję klasy z XML, towarzysz Spyglass interpretuje atrybuty i wykonuje wymagane wywołanie metody. Na przykład, jeśli napompujemy następujący układ,
setTitle
zostaniemy wywołani z"Hello, World!"
argumentem.Struktura nie ogranicza się do zasobów łańcuchowych i zawiera wiele różnych adnotacji do obsługi innych typów zasobów. Zawiera także adnotacje do definiowania wartości domyślnych i przekazywania wartości zastępczych, jeśli metody mają wiele parametrów.
Zobacz repozytorium Github, aby uzyskać więcej informacji i przykładów.
źródło
android:title="@{"Hello, world!"}"
.jeśli pominiesz
format
atrybut wattr
elemencie, możesz go użyć do odwołania się do klasy z układów XML.Refactor > Rename
PracujeFind Usages
Pracujenie określaj
format
atrybutu w ... / src / main / res / values / attrs.xmlużyj go w pliku układu ... / src / main / res / layout / activity__main_menu.xml
przeanalizuj klasę w kodzie inicjalizacji widoku ... / src / main / java /.../ MyCustomView.kt
źródło