【问题标题】:Can't Call StartActivityForResult in AnkoAnko 中无法调用 StartActivityForResult
【发布时间】:2023-03-22 05:48:02
【问题描述】:

我对 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 时出现语法错误。该错误表明它是接收器类型不匹配,并且接收器应该是ActivityFragment。另一方面,StartActivity 的接收者可以是 FragmentContextAnkoContext&lt;*&gt;(不管是什么)。

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

我突然想到,也许我的代码组织错了。上面的代码在一个自定义的ViewGroup 中,它有ImageButtons mHelp 和mSettings 作为孩子,contextContext 传递给ViewGroup 的主要构造函数。我是否应该在管理自定义ViewGroupActivity 中设置onClickListeners?如果没有,我怎么称呼StartActivityForResult

【问题讨论】:

    标签: android kotlin anko


    【解决方案1】:

    startActivityForResult 只能在 Activity 上调用,因为只有 Activity 可以接收来自另一个完成 Activity 的结果。有一些解决方案,可能最简单的方法是更改​​您的自定义ViewGroup,使其接受Activity 而不仅仅是Context,或者,如果您知道您只会使用@ 中的ViewGroup 987654329@,只需将Context 转换为Activity

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

    【讨论】:

    • 感谢您的启发性回答。我现在要尝试快速而简单的解决方案(投射到 Activity),因为我需要一个可以工作的应用程序来向人们展示。一旦完成,我将尝试智能地重构所有内容。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多