Я создал пользовательский поворотный экран, к которому мне нужно прикрепить слушателя из моего фрагмента. Доступ ко всем другим дочерним элементам в представлении по id (или по kotlinx. android .syntheti c id) работает отлично. Тем не менее, это ноль, и я не могу понять, почему. Когда я смотрю на фрагмент в режиме отладки, я вижу его в mChildren, но его mKey равен -1, в то время как все другие представления имеют идентификаторы.
Уродливый обходной путь - найти его прямо так:
val c = layout.getChildAt(layout.childCount - 1) as RotaryKnobView
c.listener = this
, но прямой доступ к нему по id - rotaryKnob.listener - не работает. Конечно, этот подход не будет работать, когда я обновлю фрагмент, чтобы включить больше представлений.
В макете xml он определен следующим образом.
<geva.oren.android_kotlin_metronome.views.RotaryKnobView
android:id="@+id/rotaryKnob"
class="geva.oren.android_kotlin_metronome.views.RotaryKnobView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="32dp"
app:initialValue="130"
app:knobDrawable="@drawable/ic_rotary_knob"
app:layout_constraintStart_toStartOf="@+id/toneButton"
app:layout_constraintTop_toBottomOf="@+id/toneButton"
app:maxValue="220"
app:minValue="40" />
Также - если я установил Идентификатор явно работает, но не так, как нужно. Например:
val knob = layout.getChildAt(layout.childCount - 1) as RotaryKnobView
knob.id = 12345
val rotaryKnob = layout.findViewById<RotaryKnobView>(12345)
rotaryKnob.listener = this
setBpmText(rotaryKnob.value)
Чего мне не хватает?