Jestem nowy w Kotlin. Wśród innych bardzo interesujących rzeczy znalazłem rozszerzenia Androida, które, according to the documentation, powinny pozwolić mi korzystać z widoków działań bez potrzeby findViewById
.Konflikt własności syntetycznej Kotlina
Faktycznie działa bardzo dobrze, dodając tylko ten wiersz w moim importu:
import kotlinx.android.synthetic.main.<layout>.*
Problem jest wtedy, gdy dwa różne układy zawierają widget z tym samym identyfikatorem (czyli tej samej nazwy dla obiektu syntetycznych)
np. dwa różne TextView
s o identyfikatorze txtTitle
. Powiedzmy, że pierwszy jest na działaniu, a drugi należy do układu używanego wewnątrz adaptera.
Kiedy próbuję wywołać metodę w pierwszym widoku TextView (w przypadku działania), nie widzę oczekiwanego wyniku, tak jakby wywołanie odbywało się w innym widoku. Jako potwierdzenie tego, kiedy zadzwonię pod numer txtTitle.parent
, widzę rodzica i rodzeństwo innego txtTitle
, a nie tych, których się spodziewałem.
Czy robię coś nie tak? Jedyne sposoby znalazłem na ominięcie tego problemu jest stosowanie różnych nazw we wszystkich moich układów lub nadal korzystać findViewById
, ale byłoby szkoda tracić tę funkcję języka ...
Chciałbym polecić ci używanie bardziej złożonych nazw dla twoich identyfikatorów :) Zapobiega to "graniu" z importami w moim przypadku. – UneXp
Nie jestem pewien, czy to odpowiada na twoje pytanie, ale syntetyczne połączenia są tłumaczone na połączenia z 'findviewById' i ponieważ każda id ** nazwa ** jest odwzorowana na unikalną wartość, nie ma znaczenia * jakiego * importu używasz tak długo jak używasz jednego z poprawną nazwą. –
Wyobraziłem sobie, ale tak naprawdę działa źle. Mam działanie z txtTitle, wewnątrz tej działalności jest fragment z RecyclerView: wewnątrz RecyclerView są widoki z txtTitle.Właśnie widzę, co napisałem: kiedy używam txtTitle wewnątrz działania, to nie daje oczekiwanego wyniku (nie ustawia tekstu TextView); zamiast tego, jeśli użyję findViewById() z działania, działa poprawnie ... – Massimo