在静态字段警告中使用Android上下文类声明一个枚举

时间:2019-05-22 02:47:06

标签: android kotlin enums

我希望在我的活动中添加一个枚举。 该枚举将包含一个EditText类。

我在枚举中收到此警告:

Do not place Android context classes in static fields (static reference to Day which has field editText pointing to EditText); this is a memory leak

这是我的代码:

enum class Day(val num: Int, var editText: EditText?, val rStringInt: Int) {
    mon(2, null, R.string.lmon),
    tue(3, null, R.string.ltue),
    wed(4, null, R.string.lwed),
    thurs(5, null, R.string.lthurs),
    fri(6, null, R.string.lfri),
    sat(7, null, R.string.lsat),
    sun(1, null, R.string.lsun)
}

在我的活动中,我有一个onCreate方法,该方法手动分配每一天的editText值。我似乎无法在这里得到一种单线的东西:

Day.mon.editText = mon
Day.tue.editText = tue
Day.wed.editText = wed
Day.thurs.editText = thurs
Day.fri.editText = fri
Day.sat.editText = sat
Day.sun.editText = sun

如何做到这一点,以便在Day枚举中不会收到此错误?我曾尝试将枚举放入我的Activity类中,但仍然会给我一个警告。

编辑:对不起,这是警告,不是错误。

2 个答案:

答案 0 :(得分:2)

您不应将视图传递给默认情况下为静态的枚举字段。视图绑定到“活动”的生命周期,并且静态字段持续整个应用程序过程的生命周期。因此,将视图分配给枚举字段可防止在不再使用该活动时对相关活动进行垃圾收集。这就是警告的意思。

如果您只想使用一种简单的方法来访问视图,则只需使用视图绑定器将它们包装起来即可。这将根据您的XML布局生成一个绑定类。

https://codelabs.developers.google.com/codelabs/android-databinding/#0

通过上述内容,您可以轻松地从自动生成的绑定类(例如代码实验室中的示例)访问视图。

val binding : PlainActivityBinding =
DataBindingUtil.setContentView(this, R.layout.plain_activity)

binding.name = "Your name"
binding.lastName = "Your last name"

答案 1 :(得分:0)

我采取了以下解决方案:

使用嵌套的Day类创建一个单独的Days类,如下所示:

class Days {
    val mon: Day = Day(2, null)
    val tue: Day = Day(3, null)
    val wed: Day = Day(4, null)
    val thurs: Day = Day(5, null)
    val fri: Day = Day(6, null)
    val sat: Day = Day(7, null)
    val sun: Day = Day(1, null)

    data class Day(val num:Int, var editText: EditText?)
}

然后,在我的活动中,我将其实例化:

private val days: Days = Days()

然后像这样引用它:

days.mon.editText = mon
days.tue.editText = tue
days.wed.editText = wed
days.thurs.editText = thurs
days.fri.editText = fri
days.sat.editText = sat
days.sun.editText = sun

这样,由于它不是像枚举一样静态的,因此会随活动一起收集垃圾。

如果您想知道,则建立此问题的上下文是为了遍历枚举(现在是对象)。这可以通过我的Days对象内部实现:

val days: Array<Day> = arrayOf(mon, tue, wed, thurs, fri, sat, sun)