как найти идентификатор большого количества представлений в цикле for с помощью kotlin?

#android #kotlin

Вопрос:

Я сделал собственный выбор дня подряд радио-кнопки внутри фрагмента, который содержит дни месяца и идентификатор каждого это что-то вроде этого @ id/day_01 , и @ id/day_02 я хочу добавить текст к каждому, кто говорит, что название дня недели, как Вэнь 05 Итак, прежде всего я хочу найти идентификаторы каждого из них в цикле for и изменить текст этой точки зрения в цикле, но не знаю, как сделать эту часть моего текущего кода в моем фрагменте:

 val c = Calendar.getInstance()
        
val year = c.get(Calendar.YEAR)
val month = c.get(Calendar.MONTH)
val currentDay = c.get(Calendar.DAY_OF_MONTH)

val hour = c.get(Calendar.HOUR_OF_DAY)
val minute = c.get(Calendar.MINUTE)
val daysInMonth = c.getActualMaximum(month)

fun getMonth() {
    if (daysInMonth==29) {
        view.day_31.visibility = View.GONE
        view.day_30.visibility = View.GONE
    } else if (daysInMonth==30) {
        view.day_31.visibility = View.GONE
    }
}

getMonth()

for (i in 1 .. daysInMonth) {
    val dayOfMonth = GregorianCalendar(year, month, i)
    val day = dayOfMonth.get(Calendar.DAY_OF_MONTH).toString()
    view.day_"i".text = day
}
 

Я не знаю, что делать с этой частью view.day_"i".text = day , но я хочу, например, когда
i=3 цикл делает что-то вроде этого view.day_03.text = "03"

если вы знаете лучший способ сделать пользовательский выбор даты, пожалуйста, покажите мне это

Комментарии:

1. Вы можете очень быстро найти ответ с помощью простого поиска в Google. Вы можете добраться сюда kotlinlang.org/docs/control-flow.html#for-loops . для ((индекс, значение) в массиве.withIndex()) { println(«элемент с индексом $равен значению$») }

2. Вы можете использовать radiogroup.setoncheckedchangedlistener , чтобы узнать, какой переключатель установлен в радиогруппе.

3. В любое время, когда вы обнаружите, что создаете более нескольких одинаковых представлений, вам следует остановиться и рассмотреть возможность использования RecyclerView вместо множества повторяющихся представлений с идентификаторами. Это не очень ремонтопригодно.

4. @РазванС. спасибо, но я знаю, как работать с циклами, то, что я ищу, — это как сделать то, что я сказал в последних 3 строках моего вопроса. как написать что-то вроде этого view.day_»я».текст

5. @VenkateshTalacheeru хорошо, спасибо, я должен это проверить

Ответ №1:

Существует getIdentifier() функция для получения представлений элементов по имени. Этот метод не рекомендуется, поскольку он использует отражение, что негативно влияет на производительность. С учетом того, что осталось всего 31 день, это, вероятно, нормально.

 for (i in 1 .. daysInMonth) {
    //...
    val dayViewId = resources.getIdentifier("day_$i", "id", packageName)
    view.findViewById<TextView>(dayViewId).text = day
}
 

Если вы находитесь во Фрагменте, используйте requireContext().packageName .

Кстати, класс Calendar устарел и не предназначен для использования в новых проектах. Смотрите здесь объяснение.

Комментарии:

1. спасибо, это сработало. однако я обдумываю то, что вы сказали о моем пути. на самом деле, я не нашел другого решения, чтобы сделать свой выбор даты, и, поскольку я не профессионал, в моем коде определенно много проблем, но сейчас я предпочитаю оставить все как есть и сделать его лучше в будущем