【问题标题】:How should I share Activity related code between multiple activities?我应该如何在多个活动之间共享活动相关代码?
【发布时间】:2018-11-27 15:50:54
【问题描述】:

我的应用中有多个活动需要一些功能。他们需要能够访问 Activity 方法,并且在某些情况下会覆盖方法(例如,我有一些共享功能可以从需要处理 onRequestPermissionsResult 的图库中选择图片)。

其中任何一个都很简单 - 我可以创建一个 XXXBase 类,然后我的 Activity 可以从中派生。如果我在我的 Activity 中需要多个这些,我会受到继承机制的限制。

我可以将所有这些额外的功能放在一个重复使用的通用 Base 类中,但该类最终可能会变得非常庞大和笨重。

是否有我缺少的替代方法?我正在使用 Kotlin,如果这开辟了任何额外的可能性。

【问题讨论】:

  • 拥有一个实用类(通常是单例)或者你只是选择一个静态方法是很常见的。
  • 通常,我将我的可重用方法组织在一个 utils 类中,并让活动调用它们。如果您觉得课程越来越大,请尝试根据功能或主题将其拆分为更小的课程。
  • 在 Kotlin 中,您可以使用 Delegation PatternInterface with default implementation,具体取决于您的用例。
  • @pawel 具有默认实现的接口实际上似乎是一种很好的语言级别方法。在这种特殊情况下,下面的无头片段方法可能会更好一些,因为使用多个助手时传递的事件将自动工作,而不是必须在活动中实现,但我从你的回答中学到了,所以谢谢。

标签: android kotlin


【解决方案1】:

鉴于您需要重写某些框架方法,我认为这实际上是使用无头 Fragment 的一个很好的案例。使用Fragment,您可以启动Activitys、请求权限、处理结果等。使用此模式,此Fragment 可以附加到任何Activity(甚至是另一个Fragment 作为孩子) .您当然可以分解此无头 Fragment 在内部依赖的更多类,但我绝对建议研究基于 Fragment 的方法。

例如:

private const val REQUEST_CODE_PERMISSION: Int = 1

class MyUtilityFragment : Fragment() {
    override fun onCreate(savedInstanceState: Bundle?) {
        if (savedInstanceState == null) {
            // do permission request
        }
    }

    override fun onRequestPermissionsResult(
        requestCode: Int,
        permissions: Array<out String>,
        grantResults: IntArray
    ): {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults)
        // handle your permission result here
    }
}

然后在您的Activity 中,您可以将其附加到onCreate() 并让它做它的事情:

class MyActivity: AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        if (savedInstanceState == null) {
            supportFragmentManager.beginTransaction()
                .add(MyUtilityFragment(), "utility_fragment")
                .commitNow()
        }
    }
}

如果您需要将结果返回给主机,您可以在Fragment 中指定一个接口,并让主机父FragmentActivity 实现该接口,然后从无头@ 中检索它987654336@需要时:

private fun getCallback() : MyCallbackInterface {
    parentFragment?.takeIf { it is MyCallbackInterface }?.let { return it as MyCallbackInterface }
    return requireActivity() as MyCallbackInterface
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-25
    • 1970-01-01
    • 1970-01-01
    • 2011-07-13
    • 1970-01-01
    • 2019-01-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多