Динамически добавлять макеты в Linearlayout с некоторыми проблемами ID - PullRequest
0 голосов
/ 19 июня 2019

У меня есть LinearLayout внутри ScrollView (Root) Существует еще один Linearlayout (id = consultingTimeContainer), который находится внутри корневого линейного макета. Я раздул макет и добавил этот раздутый макет в линейный макет (consultingTimeContainer). Инфляция работает правильно. Но проблема в том, что когда я устанавливаю текст в 3-й надутой разметке, текст изменяется в первой раздувной макете.

Есть функция showTimePicker (viewId: Int). Функция показывает время выбора и устанавливает выбранное время для EditText с id = viewId.

Каждый раз, когда я пытаюсь установить время в завышенном представлении, которое не является первым завышенным представлением, время устанавливается в первом завышенном представлении!

fun addNewConsultingTime(firstOne: Boolean) {
        val inflatedView: View? =
            LayoutInflater.from(this)
                .inflate(R.layout.item_consulting_time, null)
        consultingTimeContainer.addView(inflatedView, consultingTimeContainer.childCount)
        val addNewConsultingTime = inflatedView?.findViewById<ImageView>(R.id.add)
        val consultingFrom = inflatedView?.findViewById<TextInputEditText>(R.id.consultingFrom)
        val consultingTo = inflatedView?.findViewById<TextInputEditText>(R.id.consultingTo)
        consultingFrom?.isFocusable = false
        consultingFrom?.isClickable = true
        consultingTo?.isClickable = true
        consultingTo?.isFocusable = false

        if (firstOne) {
            addNewConsultingTime?.setImageResource(R.drawable.plus_icon)
            addNewConsultingTime?.tag = "add"
        } else {
            addNewConsultingTime?.setImageResource(R.drawable.remove)
            addNewConsultingTime?.tag = "remove"
        }
        addNewConsultingTime?.setOnClickListener {
            if (addNewConsultingTime.tag == "add")
                addNewConsultingTime(false)
            else
                consultingTimeContainer.removeView(addNewConsultingTime.parent as View)
        }
        consultingTo?.setOnClickListener {
            showTimePicker(consultingTo.id)
        }
        consultingFrom?.setOnClickListener {
            showTimePicker(consultingFrom.id)
        }
    }
fun showTimePicker(viewId: Int) {
        val cal = Calendar.getInstance()
        val timeSetListener = TimePickerDialog.OnTimeSetListener { timePicker, hour, minute ->
            cal.set(Calendar.HOUR_OF_DAY, hour)
            cal.set(Calendar.MINUTE, minute)
            findViewById<EditText>(viewId).setText(SimpleDateFormat("HH:mm").format(cal.time))
        }
        TimePickerDialog(this, timeSetListener, cal.get(Calendar.HOUR_OF_DAY), cal.get(Calendar.MINUTE), true).show()
    }

Когда я устанавливаю время как 02:00 во втором завышенном виде, время фактически отображается в первом завышенном тексте редактирования как 02:00. Это неправильно.

Я думаю, что у каждого раздутого макета есть потомки с одинаковыми идентификаторами. Как преодолеть эту проблему?

1 Ответ

0 голосов
/ 20 июня 2019

Вы сказали: «Я думаю, что у каждого раздутого макета есть потомки с одинаковыми идентификаторами. Как преодолеть эту проблему?» Вы проверяли с помощью логов или в режиме отладки, что id просмотров соответствует хорошим представлениям? Кроме того, нельзя ли использовать макет в XML вместо раздувания в коде?

То, что я могу предложить, это не посылать идентификатор в параметре, а посмотреть

 consultingFrom?.setOnClickListener { v -> showTimePicker(v)}

и в showTimePicker

fun showTimePicker(edt: EditText) {
    val cal = Calendar.getInstance()
    val timeSetListener = TimePickerDialog.OnTimeSetListener { timePicker, hour, minute ->
        cal.set(Calendar.HOUR_OF_DAY, hour)
        cal.set(Calendar.MINUTE, minute)
        edt.setText(SimpleDateFormat("HH:mm").format(cal.time))
    }
    TimePickerDialog(this, timeSetListener, cal.get(Calendar.HOUR_OF_DAY), cal.get(Calendar.MINUTE), true).show()
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...