如何在多个活动之间共享与活动相关的代码?

时间:2018-11-27 15:50:54

标签: android kotlin

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

其中任何一个都很简单-我可以创建一个XXXBase类,然后我的Activity可以从中继承。但是,如果我在Activity中需要这些功能中的一个以上,则受继承机制的限制。

我可以将所有这些额外的功能放在一个可以重复使用的通用基类中,但是该类最终可能变得很大而笨拙。

我是否缺少其他方法?我正在使用Kotlin,如果这样做会带来更多的可能性。

1 个答案:

答案 0 :(得分:1)

鉴于您需要重写某些框架方法,我认为这对于使用无头Fragment实际上是一个很好的例子。使用Fragment,您可以启动Activity,请求权限,处理结果等。使用此模式,可以将此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实现该接口,然后在需要时从无头Fragment检索它:

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