2017-01-23 20 views
5

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

+0

Chciałbym polecić ci używanie bardziej złożonych nazw dla twoich identyfikatorów :) Zapobiega to "graniu" z importami w moim przypadku. – UneXp

+0

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ą. –

+0

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

Odpowiedz

3

kotlin documentation on imports mówi

Jeśli istnieje nazwa zderzenie możemy disambiguate za pomocą słowa kluczowego as lokalnie zmiany nazwy podmiotu zderzeniu

Więc można spróbować zaimportować układy z różnymi pseudonimami:

import kotlinx.android.synthetic.main.<layoutActivity>.* as lActivity 
import kotlinx.android.synthetic.main.<layoutView>.* as lView 

i użyj TextView z odpowiednim kwalifikatorem: lActivity.txtTitle i lView.txtTitle

+0

Nie mogę użyć słowa kluczowego "as" w wielu instrukcjach importowania, IDE (Android Studio) ostrzega mnie z komunikatem "Nie można zmienić nazwy wszystkich zaimportowanych elementów na jeden identyfikator". Ponadto w mojej działalności nie mam importu układu, ponieważ jest on używany przez fragment (dołączony do działania), a nie przez działanie. – Massimo

0

Innym możliwym rozwiązaniem problemu jest po prostu importować jedną i drugą pominąć, przyjmując wszystkie identyfikatory potrzebne są obecne w jednym.

Pod koniec dnia podobne identyfikatory wskazują na to samo i nie ma to znaczenia, czy został zaimportowany z jednego układu, czy z drugiego.

nadzieję, że pomoże

-1

Można spróbować poniżej rzeczą dla TextView posiadające ten sam identyfikator z innego układu.

import kotlinx.android.synthetic.main.activity_main.text_hello as lActivity 

import kotlinx.android.synthetic.main.extra_layout.text_hello as lView 

użycie lActivity.text = "Some text" dla TextView z activity_main i lView.text = "Some text" dla TextView od extra_layout.