2017-07-20 2 views
0

Je suis assez nouveau pour Android, et j'essaie de l'apprendre avec kotlin. Dans ce codeImpossible d'appeler StartActivityForResult dans Anko

mHelp.setOnClickListener {context.startActivity<HelpActivity>()} 
mSettings.setOnClickListener { 
    context.startActivityForResult<LocalSettingsActivity>(
      LOCAL_SETTINGS_REQUEST, 
      "coords" to this.board.mCoords, 
      "drag" to this.mWhiteStones[0].drag) 
} 

l'appel à startActivity fonctionne très bien, mais je reçois une erreur de syntaxe sur l'appel à startActivityForResult. L'erreur indique qu'il s'agit d'une non-concordance de type de récepteur, et que le récepteur doit être un Activity ou un Fragment. D'autre part, le récepteur pour StartActivity peut être un Fragment, un Context ou un AnkoContext<*> (quel qu'il soit).

Bien sûr, je peux faire ce travail (je pense) en construisant le Intent et ne pas utiliser anko.StartActivityForResult, mais je voudrais comprendre ce qui se passe.

Il m'est venu à l'esprit que j'ai peut-être mal organisé mon code. Le code ci-dessus est dans un ViewGroup personnalisé qui a le ImageButtons mHelp et mSettings comme enfants, et context est le Context passé au constructeur principal ViewGroup. Devrais-je définir le onClickListeners dans le Activity qui gère le ViewGroup personnalisé? Si non, comment j'appellerais StartActivityForResult?

Répondre

1

startActivityForResult peut uniquement être appelée sur un Activity car seul un Activity peut recevoir un résultat d'une autre finition Activity. Il y a quelques solutions, probablement la plus simple serait de changer votre ViewGroup personnalisé pour qu'il accepte un Activity au lieu de seulement un Context, ou, si vous savez que vous n'utiliserez que ViewGroup à partir d'un Activity, il suffit de jeter le Context à un Activity .

Vous avez raison quand vous dites que votre code pourrait probablement être mieux organisé, pour contourner complètement ce problème. Juste après la séparation des préoccupations, votre ViewGroup ne devrait pas être responsable des actions de navigation dans votre application. Le ViewGroup pourrait par exemple permettre aux auditeurs de s'inscrire à l'événement qui déclenche maintenant l'action de navigation. De cette façon, le Activity peut s'inscrire à cet événement, faire la navigation lui-même et gérer le résultat en dehors du ViewGroup.

+1

Merci pour cette réponse éclairante. Je vais essayer la solution rapide-et-sale (lancer à l'activité) pour l'instant, parce que je dois obtenir une application fonctionnante pour montrer des personnes. Dès que c'est la porte, je vais essayer de tout refaire intelligemment. – saulspatz