Piszę kilka niestandardowych widoków, które mają takie same atrybuty. W odpowiedniej <declare-styleable>
sekcji attrs.xml
chciałbym użyć tych samych nazw dla atrybutów:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="MyView1">
<attr name="myattr1" format="string" />
<attr name="myattr2" format="dimension" />
...
</declare-styleable>
<declare-styleable name="MyView2">
<attr name="myattr1" format="string" />
<attr name="myattr2" format="dimension" />
...
</declare-styleable>
</resources>
Pojawia się błąd, który to mówi myattr1
i myattr2
są już zdefiniowane. Uważam, że należy pominąć format
atrybut dla myattr1
i myattr2
na MyView2
, ale jeśli to zrobię, mogę uzyskać następujący błąd w konsoli:
[2010-12-13 23:53:11 - MyProject] ERROR: In <declare-styleable> MyView2, unable to find attribute
Czy jest jakiś sposób, aby to osiągnąć, może jakiś rodzaj przestrzeni nazw (tylko zgadywanie)?
myattr1
zostanie wprowadzony ciągMyView1
i liczba całkowitaMyView2
?ERROR: In <declare-styleable> com_app_view_widget, unable to find attribute customAttr
Za cały widok, za który staram się głosić. Jakieś pomysły?<attr name="myattr1" format="string|integer" />
. Pracuje dla mnie.Publikuję tę odpowiedź, ponieważ powyższe rozwiązanie nie zadziałało w moim przypadku w Android Studio. Muszę udostępnić moje niestandardowe atrybuty w moich niestandardowych widokach, więc wypróbowałem powyższe rozwiązanie w Android Studio, ale nie miałem szczęścia. Więc eksperymentuję i idę na to. Mam nadzieję, że może to pomóc komuś, kto szuka tego samego problemu.
To działa dla mnie całkowicie. Musimy ustawić styl nadrzędny, a następnie odziedziczyć styl nadrzędny. Na przykład, tak jak to zrobiłem powyżej: nadająca się do stylizacji nazwa MyView i odziedziczyła ją do moich innych stylowalnych, takich jak MyView1 i MyView2 odpowiednio.
źródło
MyView2
prawej:R.styleable.MyView2_myattr1
, źle:R.styleable.MyView_myattr1
)Jak odpowiedziała Priya Singhal, Android Studio wymaga zdefiniowania wspólnych nazw atrybutów w ramach własnej nazwy stylu. Nie mogą już być u podstaw.
Należy jednak zwrócić uwagę na kilka innych rzeczy (dlatego dodam również odpowiedź):
Przykład
Oto, co zrobiłem w ostatnim projekcie, który ma dwa niestandardowe widoki, które mają te same atrybuty. Tak długo, jak niestandardowe widoki nadal mają nazwy atrybutów i nie zawierają znaku a
format
, nadal mogę uzyskać do nich dostęp normalnie z kodu.Uproszczony przykład
W rzeczywistości nie muszę nawet umieszczać atrybutów pod niestandardową nazwą. Tak długo, jak je zdefiniuję (daję im
format
) dla co najmniej jednego niestandardowego widoku, mogę ich używać w dowolnym miejscu (bezformat
). Działa to również (i wygląda na czystsze):Jednak w przypadku dużego projektu może to być nieuporządkowane, a zdefiniowanie ich u góry w jednym miejscu może być lepsze (zgodnie z zaleceniem tutaj ).
źródło
parent
atrybutu, ale nie widziałem wielu postów sugerujących jego użycie.parent
. Myślę, że tylko mówiłem, że nie było to wymagane.Dzięki Lewis, miałem ten sam problem, a twoje rozwiązanie dziedziczenia dało mi wskazówkę, jak to zrobić poniżej i działa dobrze. Właśnie zadeklarowałem wspólne atrybuty powyżej i przepisałem je ponownie w treści deklaracji stylu bez formatowania. Mam nadzieję, że to komuś pomoże
źródło
Na wypadek, gdyby ktoś nadal tkwił w tym problemie po wypróbowaniu dostępnego rozwiązania. Utknąłem z
subtitle
atrybutem add zstring
formatem.Moim rozwiązaniem jest usunięcie formatu.
przed:
<attr name="subtitle" format="string"/>
po:
<attr name="subtitle"/>
źródło