2017-06-09 6 views
0

J'essaie d'utiliser Kotlin et le langage DSL d'Anko pour créer une boîte de dialogue d'alerte qui permet à un utilisateur de choisir une image, puis de la charger dans un ImageView. En ce moment j'essaye juste de faire fonctionner l'ImageView, donc j'ai le bouton cliquable pour charger une image présélectionnée d'une URL using Picasso.Problème de définition d'une image pour un DSL défini par Kotlin/Anko ImageView

Lorsque je clique sur le bouton dans la boîte de dialogue d'alerte, je reçois cette erreur:

kotlin.TypeCastException: null cannot be cast to non-null type android.widget.ImageView

Je devine que pour une raison quelconque le ImageView n'est pas chargé par findViewById. Est-ce que quelqu'un sait pourquoi cela pourrait être? Je suppose que DSL d'Anko a un comportement étrange que je ne connais pas.

fab.setOnClickListener { view -> 
      alert { 
       title = "New Post" 
       customView { 
        verticalLayout { 

         val subject = editText { 
          hint = "Subject" 
         } 
         imageView { 
          id = R.id.picked_image 
         } 
         linearLayout { 
          gravity = Gravity.CENTER 
          button("Choose Photo") { 
           onClick { 
            Picasso.with([email protected]) 
              .load("http://SomeUrl/image.jpg") 
              .into(findViewById(R.id.picked_image) as ImageView) 

           } 
          } 
          button("Choose Image") {} 
         } 


         positiveButton("Post") { } 
         negativeButton("Cancel") {} 
        } 
       } 
      }.show() 

Répondre

2

Vous pouvez obtenir une référence à l'ImageView comme celui-ci et éviter d'avoir à traiter avec des ID au total:

val iv = imageView() 
... 
    onClick { 
     Picasso.with([email protected]) 
       .load("http://SomeUrl/image.jpg") 
       .into(iv) 
    } 
... 
+0

Hé, ça fonctionne, merci! Le seul problème est si je veux accéder à imageView plus tard (en dehors de onClick), je ne sais toujours pas comment – Parker

+2

Vous pouvez créer une propriété dans le 'Activity' et affecter le' ImageView' à cela aussi. – zsmb13