首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android/Kotlin:将不同的活动“特征”组合到一个活动中

Android/Kotlin:将不同的活动“特征”组合到一个活动中
EN

Stack Overflow用户
提问于 2019-12-29 19:43:53
回答 1查看 348关注 0票数 7

我正在寻找一种方法来结合不同的功能在Android活动,应该是可重用的不同的活动类。具体地说,这个问题是由于覆盖了开放方法而引起的,在开放方法中也必须调用超级的实现。

代码语言:javascript
复制
open class FirstActivity : FragmentActicity() {
  override fun onStart() {
    super.onStart()
    doSomething()
  }
}

这很简单,但它不能重用。例如,我可能希望使用不同的基本活动类具有相同的行为:

代码语言:javascript
复制
open class SecondActivity : AppCompatActivity() {
  override fun onStart() {
    super.onStart()
    doSomething()
  }
}

在那里我必须复制代码。如果我有一个非常基本的功能,比如跟踪活动的状态,我会或多或少地希望我的所有活动都有不同的基类。当我想要创建更多可以组合的特性时,情况会变得更糟:

代码语言:javascript
复制
open class ThirdActivity : FragmentActivity() {
  override fun onResume() {
    super.onResume()
    doSomeResuming()
  }
}

open Class FirstActivityAgain : ThirdActivity {
  override fun onStart() {
    super.onStart()
    doSomething()
  }
}

class MyFragmentActivity : FirstActivity() {
  override fun onStop() {
    doSomethingElse()
    super.onStop()
  }
}

class MyFragmentActivityWithResuming : FirstActivityAgain() {
  override fun onStop() {
    doSomethingElse()
    super.onStop()
  }
}

class MyTopBarActivity : SecondActivity() {
  override fun onStop() {
    doSomethingElse()
    super.onStop()
  }
}

In Scala I can use Traits来做这件事的stackable modification,它允许非常灵活的功能混合。甚至可以一遍又一遍地修改相同的方法,只需小心linearization order即可。这在Kotlin中是不可能的,因为Scala特征既不等同于Kotlin抽象类,也不等同于Kotlin接口。

对于Kotlin的代表来说,这似乎也不可能。我还考虑过使用泛型,在我有限的想象力中可能是这样的:

代码语言:javascript
复制
open class FirstActivity<BaseActivity : Activity> : BaseActivity() {
  ...
}

当然这也是不可能的。

有什么我没注意到的吗?用Dagger可以做到吗?

EN

回答 1

Stack Overflow用户

发布于 2020-01-23 05:03:22

你在Kotlin中提到的东西被称为interfaces,并与一些基本的delegation结合使用。

代码语言:javascript
复制
interface Base {
    fun printMessage()
    fun printMessageLine()
}

class BaseImpl(val x: Int) : Base {
    override fun printMessage() { print(x) }
    override fun printMessageLine() { println(x) }
}

class Derived(b: Base) : Base by b {
    override fun printMessage() { print("abc") }
}

fun main() {
    val b = BaseImpl(10)
    Derived(b).printMessage()
    Derived(b).printMessageLine()
}

尽管它不会将你从super问题中解救出来,因为它是Android框架的问题,而不是Kotlin语言的问题。

对于你的情况,我会这样做

代码语言:javascript
复制
interface BaseActivityContainer{
 var activity: Activity
}

class MainActivity: BaseActivityContainer{

override var activity: Activity = this

}

interface BaseDoable: BaseActivityContainer{

fun doActivityStuff(){
 activity.getString(...)
}

}

interface BaseDoableSecond: BaseActivityContainer{

fun doActivityStuff(){
 activity.getDrawable(...)
}

}

class SomeActivity: MainActivity, BaseDoableSecond by this

借助Android Lifecycle处理Lyfecycle事件

这篇文章并不完整,功能也不强,但我希望它能帮你弄清楚一些东西。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59519088

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档