2017-01-23 1 views
5

Je suis nouveau à Kotlin. Parmi d'autres choses très intéressantes, j'ai trouvé les extensions Android qui, according to the documentation, devrait me permettre d'utiliser les vues des activités sans avoir besoin de findViewById.Les propriétés synthétiques de Kotlin entrent en conflit

En fait, il fonctionne très bien en ajoutant simplement cette ligne dans mes importations:

import kotlinx.android.synthetic.main.<layout>.* 

Le problème est lorsque deux mises en page différentes contiennent un widget avec le même identifiant (le même nom pour la propriété synthétique),
par exemple deux différents TextView s avec l'ID txtTitle. Dites le premier est sur une activité et le second appartient à la disposition utilisée à l'intérieur d'un adaptateur.

Lorsque j'essaie d'appeler une méthode sur le premier TextView (celui de l'activité), je ne peux pas voir le résultat attendu, comme si l'appel serait fait sur une autre vue. Comme confirmation de ceci, quand j'appelle txtTitle.parent, je vois le parent et les frères et soeurs de l'autre txtTitle plutôt que ceux prévus.

Est-ce que je fais quelque chose de mal? La seule façon que j'ai trouvé pour contourner ce problème est d'utiliser des noms différents dans toutes mes mises en page ou continuer à utiliser findViewById, mais il serait dommage de perdre cette fonction de la langue ...

+0

Je voudrais vous recommander d'utiliser des noms plus complexes pour vos identifiants :) Cela empêche également de "jouer" avec les imports dans mon cas. – UneXp

+0

Je ne sais pas si cela répond à votre question, mais les appels synthétiques sont traduits en appels à 'findviewById' et parce que chaque id ** nom ** est mappé à une valeur unique, peu importe * quelle * importation vous utilisez aussi longtemps comme vous en utilisez un avec le nom correct. –

+0

J'imaginais, mais en réalité ça marche mal. J'ai une activité avec un txtTitle, à l'intérieur de cette activité il y a un fragment avec un RecyclerView: à l'intérieur de RecyclerView il y a des vues avec un txtTitle.Je vois juste ce que j'ai écrit: quand j'utilise le txtTitle dans l'activité, il ne produit pas le résultat attendu (il ne définit pas le texte de TextView); au lieu de cela, si j'utilise findViewById() de l'activité cela fonctionne correctement ... – Massimo

Répondre

3

Le kotlin documentation on imports dit

S'il y a un conflit de nom, nous pouvons lever l'ambiguïté en utilisant as mot-clé pour renommer localement l'entité détonnant

vous pouvez essayer d'importer les mises en page avec différents alias:

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

Et utiliser les textviews avec le qualificatif correspondant: lActivity.txtTitle et lView.txtTitle

+0

Je ne peux pas utiliser le mot-clé "as" sur une instruction d'importation multiple, l'EDI (Android Studio) m'avertit avec le message "Impossible de renommer tous les éléments importés en un seul identificateur". De plus, dans mon activité je n'ai pas l'import de la mise en page, car elle est utilisée par un fragment (attaché à l'activité), et non par l'activité. – Massimo

0

Une autre solution possible à votre problème est d'importer un seul et omettre l'autre, en supposant que tous les ID dont vous avez besoin sont présents dans celui-là. À la fin de la journée, des identifiants similaires pointent vers la même chose, et cela n'a pas vraiment d'importance si elle a été importée d'une mise en page ou de l'autre.

espoir qui aide

-1

Vous pouvez ci-dessous chose pour avoir TextView même id de mise en page différente.

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

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

utilisation lActivity.text = "Some text" pour TextView de activity_main et lView.text = "Some text" pour TextView de extra_layout.