Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在静态字段警告中声明具有Android上下文类的枚举_Android_Kotlin_Enums - Fatal编程技术网

在静态字段警告中声明具有Android上下文类的枚举

在静态字段警告中声明具有Android上下文类的枚举,android,kotlin,enums,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类

我在我的枚举上收到以下警告:

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
我怎样才能使它在我的天枚举中不会收到此错误?我已尝试将枚举放入我的活动类中,但它仍然给我一个警告


编辑:抱歉,这是一个警告,不是错误。

您不应该将视图传递给默认为静态的枚举字段。视图绑定到活动的生命周期,静态字段将持续整个应用程序流程的生命周期。因此,将视图分配给枚举字段可以防止相关活动在不再使用时被垃圾收集。这就是警告的意义

如果您只是想用一种简单的方式访问视图,那么就用视图活页夹将它们包装起来。这将根据XML布局生成绑定类

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

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

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

您不应该将视图传递给默认为静态的枚举字段。视图绑定到活动的生命周期,静态字段将持续整个应用程序流程的生命周期。因此,将视图分配给枚举字段可以防止相关活动在不再使用时被垃圾收集。这就是警告的意义

如果您只是想用一种简单的方式访问视图,那么就用视图活页夹将它们包装起来。这将根据XML布局生成绑定类

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

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

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

编辑:但是,当片段被重新创建时,这会导致内存泄漏。 20个setonclicklisteners?把我算在内 不过,我确实找到了另一种利用资源的方法

编辑:这个数据应该保存在片段中,因为它需要引用一个视图。因此,视图数据不应保存在另一个类或“enum”中。 但是,另一个类仍然是保存不会更改的静态变量(如从整数到字符串的引用)的好选项。 重新创建视图时,需要您转换所做的任何更改。。使代码更加复杂。这样做对于您“保存”的几行来说似乎不切实际。一种替代方法是不编辑以前的数据,只是不使用以前封装的视图,仍然可以保存几行以设置单击侦听器

我采取了以下解决办法:

使用嵌套的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
这样,因为它不像枚举那样是静态的,所以它会随着活动一起收集垃圾

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

val days: Array<Day> = arrayOf(mon, tue, wed, thurs, fri, sat, sun)
val-days:Array=arrayOf(周一、周二、周三、周四、周五、周六、周日)

编辑:但是,当重新创建片段时,这会导致内存泄漏。 20个setonclicklisteners?把我算在内 不过,我确实找到了另一种利用资源的方法

编辑:这个数据应该保存在片段中,因为它需要引用一个视图。因此,视图数据不应保存在另一个类或“enum”中。 但是,另一个类仍然是保存不会更改的静态变量(如从整数到字符串的引用)的好选项。 重新创建视图时,需要您转换所做的任何更改。。使代码更加复杂。这样做对于您“保存”的几行来说似乎不切实际。一种替代方法是不编辑以前的数据,只是不使用以前封装的视图,仍然可以保存几行以设置单击侦听器

我采取了以下解决办法:

使用嵌套的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
这样,因为它不像枚举那样是静态的,所以它会随着活动一起收集垃圾

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

val days: Array<Day> = arrayOf(mon, tue, wed, thurs, fri, sat, sun)
val-days:Array=arrayOf(周一、周二、周三、周四、周五、周六、周日)

但是,这并没有解决将视图放入枚举的问题。既然枚举是静态的,那么我创建嵌套类怎么样?如果我在嵌套类中持有一个视图,垃圾收集器会处理这些吗?或者仅仅是activityStill之外的另一个类,这并没有解决将视图放入枚举的问题。既然枚举是静态的,那么我创建嵌套类怎么样?如果我在嵌套类内持有一个视图,或者仅仅是活动外的另一个类,那么垃圾收集器会处理这些视图吗