Объявите перечисление с классом контекста Android в предупреждении статического поля - PullRequest
0 голосов
/ 22 мая 2019

Я хочу добавить перечисление к моей деятельности.Это перечисление будет содержать класс 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?Я пытался поместить enum в свой класс Activity, но он все равно дает мне предупреждение.

Редактировать: Извините, это предупреждение, а не ошибка.

Ответы [ 2 ]

2 голосов
/ 22 мая 2019

Вы не должны передавать представления в перечисляемые поля, которые по умолчанию являются статическими. Представления привязаны к жизненному циклу операций, а статические поля сохраняют время жизни всего процесса приложения. Таким образом, назначение представления полю enum предотвращает сбор мусора для связанной операции, когда эта деятельность больше не используется. В этом смысл предупреждения.

Если вам нужен простой способ доступа к вашим представлениям, просто оберните их связывателем видов. Это создаст класс привязки на основе вашего макета 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"
0 голосов
/ 23 мая 2019

Редактировать: Тем не менее, это может привести к утечке памяти, когда ваш фрагмент будет воссоздан.20 setonclicklisteners?посчитайте меня, я нашел еще один метод с ресурсами.

Редактировать: Эти данные должны храниться во фрагменте, так как он требует ссылки на представление.Следовательно, данные представления не должны храниться в другом классе или в перечислении.Тем не менее, другой класс по-прежнему является хорошим вариантом для хранения статических переменных, которые не будут меняться (например, ссылки из целого числа в строку).Когда представление воссоздается, вам потребуется преобразовать любые внесенные изменения ... еще больше усложнить ваш код.это кажется непрактичным для тех нескольких строк, которые вы «сохранили». Один из вариантов - не редактировать предыдущие данные и просто не использовать предыдущие представления, которые были инкапсулированы, тем не менее позволяя вам сохранить несколько строк для настройки прослушивателей щелчков.

Я прибег кследующее решение:

Создайте отдельный класс Days с вложенным классом Day, который выглядит следующим образом:

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

Таким образом, поскольку он не является статичным, как перечисление, он собирает мусор вместе с действием.

В случае, если выМне было интересно, контекст этого вопроса был создан для того, чтобы перебрать enum (теперь объект).Это достижимо через это в моем объекте Дней:

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