2

我对android很陌生,我正在尝试用kotlin学习它。在这段代码中

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

调用startActivity工作正常,但调用startActivityForResult. 该错误表明它是接收器类型不匹配,并且接收器应该是 anActivity或 a Fragment。另一方面,接收者StartActivity可以是 a Fragment、 aContext或 an AnkoContext<*>(无论是什么)。

当然,我可以通过构建Intent而不是使用来完成这项工作(我认为) anko.StartActivityForResult,但我想了解发生了什么。

我突然想到,也许我的代码组织错了。上面的代码是自定义ViewGroup的,将ImageButtonsmHelp 和 mSettings 作为子级,并context传递ContextViewGroup的主构造函数。我应该设置管理自定义的onClickListeners吗?如果没有,我该怎么打电话? ActivityViewGroupStartActivityForResult

4

1 回答 1

2

startActivityForResult只能在 an 上调用,Activity因为只有 anActivity才能从另一个 Finishing 接收结果Activity。有一些解决方案,可能最简单的方法是更改​​您的自定义ViewGroup,使其接受 anActivity而不仅仅是 a Context,或者,如果您知道您只会使用ViewGroupa Activity,只需将Contexta 转换为 a Activity

但是当您说您的代码可能可以更好地组织以完全规避这个问题时,您是对的。仅在关注点分离之后,您ViewGroup不应对应用程序中的导航操作负责。例如,ViewGroup可以允许侦听器注册现在触发导航操作的事件。这样,Activity可以注册该事件,自行进行导航并在ViewGroup.

于 2017-07-21T09:01:49.183 回答