2017-07-20 2 views
0

Ich bin ziemlich neu in Android, und ich versuche, es mit Kotlin zu lernen. In diesem CodeKann StartActivityForResult in Anko nicht anrufen

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

der Aufruf von startActivity funktioniert gut, aber ich habe einen Syntaxfehler auf dem Aufruf von startActivityForResult. Der Fehler besagt, dass es sich um einen Fehlertyp des Empfängers handelt und dass der Empfänger ein Activity oder ein Fragment sein sollte. Andererseits kann der Empfänger für StartActivity ein Fragment, ein Context oder ein AnkoContext<*> (was auch immer das ist) sein.

Natürlich kann ich diese Arbeit machen (denke ich), indem ich Intent baue und nicht anko.StartActivityForResult benutze, aber ich würde verstehen, was vor sich geht.

Es ist mir eingefallen, dass ich vielleicht meinen Code falsch geordnet habe. Der obige Code ist in einer benutzerdefinierten ViewGroup, die die ImageButtons mHelp und mSettings als Kinder hat, und context ist die Context an den primären Konstruktor ViewGroup übergeben. Sollte ich vielleicht die onClickListeners in der Activity setzen, die die benutzerdefinierte ViewGroup verwaltet? Wenn nicht, wie würde ich StartActivityForResult anrufen?

Antwort

1

startActivityForResult kann nur unter Activity aufgerufen werden, da nur ein Activity ein Ergebnis von einem anderen Abschluss Activity empfangen kann. Es gibt ein paar Lösungen, wahrscheinlich die einfachste wäre, Ihre benutzerdefinierte ViewGroup zu ändern, so dass es eine Activity anstelle von nur Context akzeptiert, oder, wenn Sie wissen, dass Sie nur ViewGroup von Activity verwenden, werfen Sie einfach Context auf Activity .

Sie haben jedoch recht, wenn Sie sagen, dass Ihr Code wahrscheinlich besser organisiert werden könnte, um dieses Problem vollständig zu umgehen. Nach der Trennung von Bedenken sollte Ihre ViewGroup nicht für Navigationsaktionen in Ihrer App verantwortlich sein. Die ViewGroup könnte zum Beispiel Hörern erlauben, sich für das Ereignis zu registrieren, das gerade die Navigationsaktion auslöst. Auf diese Weise kann sich die Activity für dieses Ereignis registrieren, die Navigation selbst durchführen und das Ergebnis außerhalb der ViewGroup behandeln.

+1

Vielen Dank für diese aufschlussreiche Antwort. Ich werde die schnell-und-schmutzige Lösung (Casting zu Activity) vorerst versuchen, da ich eine funktionierende App brauche, um Leute zu zeigen. Sobald das draußen ist, werde ich alles intelligent umgestalten. – saulspatz

Verwandte Themen