У меня есть AutoCompleteTextView внутри AlertDialog (пользовательский вид). Я зарегистрировал событие onItemClick.
Когда я набираю данные, появляется выпадающий список вариантов. Однако когда я щелкаю один из элементов, обработчик события onItemClick никогда не срабатывает.
Я хочу знать, что не так с моим кодом и почему он не запускает обработчик событий.
Я попытался отследить код AutoCompleteTextView и не могу найти, где даже существует код, который запускает обработчики событий. Я подтвердил, что обработчик зарегистрирован .
Я посмотрел каждый пример ACTV, который я могу найти в Интернете. Я просмотрел так много сообщений об этом, и ни один из них не помог или не был на месте.
package com.foobar.weightlifting.ui
import android.app.AlertDialog
import android.app.Dialog
import android.os.Bundle
import android.util.Log
import android.view.View
import android.widget.AdapterView
import android.widget.ArrayAdapter
import android.widget.AutoCompleteTextView
import androidx.databinding.DataBindingUtil
import androidx.fragment.app.DialogFragment
import androidx.lifecycle.MutableLiveData
import com.foobar.weightlifting.R
import kotlinx.android.synthetic.main.lift_selector.*
class LiftDialog : DialogFragment(), AdapterView.OnItemSelectedListener, AdapterView.OnItemClickListener {
companion object {
private const val TAG = "LiftDialog"
private const val POSITIVE_LABEL = "Select"
private const val NEGATIVE_LABEL = "Cancel"
}
private val model = Model(MutableLiveData())
private lateinit var that: LiftDialog
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
that = this
return activity?.let {
val inflater = requireActivity().layoutInflater
val binding : com.foobar.weightlifting.databinding.LiftSelectorBinding = DataBindingUtil.inflate(inflater, R.layout.lift_selector, null, false)
binding.model = model
val view = binding.root
// Setup autocomplete search bar
val liftChoices = resources.getStringArray(R.array.lift_list)
val adapter = ArrayAdapter<String>(context, R.layout.lift_selector, liftChoices)
val autocompleteView: AutoCompleteTextView = view.findViewById(R.id.lift_search_bar)
autocompleteView.setAdapter(adapter)
// autocompleteView.onItemSelectedListener = that
// autocompleteView.onItemClickListener = that
autocompleteView.setOnItemClickListener { parent, view, position, id ->
Log.d(TAG, "info: $position $id")
}
val builder = AlertDialog.Builder(it)
builder.apply {
setTitle("Describe the lift")
setView(view)
setPositiveButton(POSITIVE_LABEL) { dialog, which ->
Log.d(TAG, "user pressed the $POSITIVE_LABEL button: $which ; model: ${model.searchText.value}")
}
setNegativeButton(NEGATIVE_LABEL) { dialog, which ->
Log.d(TAG, "user pressed the $NEGATIVE_LABEL button: $which")
}
}
builder.create()
} ?: throw IllegalStateException("Blah")
}
override fun onNothingSelected(parent: AdapterView<*>?) {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
override fun onItemSelected(parent: AdapterView<*>?, view: View?, position: Int, id: Long) {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
override fun onItemClick(parent: AdapterView<*>?, view: View?, position: Int, id: Long) {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
data class Model(val searchText: MutableLiveData<String>)
}
и XML-файл макета
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:tools="http://schemas.android.com/tools"
xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable name="model"
type="com.foobar.weightlifting.ui.LiftDialog.Model"/>
</data>
<AutoCompleteTextView android:layout_width="wrap_content"
android:id="@+id/lift_search_bar"
android:text="@={model.searchText}"
android:hint="@string/select_lift_hint"
android:dropDownWidth="match_parent"
android:layout_height="wrap_content"/>
</layout>
Если я поставлю точку останова в onItemClick
, я ожидаю, что она сломается, когда я нажму на элемент из выпадающего списка автозаполнения. Вместо этого ничего не происходит, кроме одинокого D/EGL_emulation: eglMakeCurrent: 0xea5462e0: ver 3 0 (tinfo 0xcf6cc040)
зарегистрированного.
Я пытался отследить код AutoCompleteTextView, но даже не могу найти, где когда-либо вызывался обработчик события onItemClick, который я зарегистрировал. Я подтвердил, что обработчик событий зарегистрирован в экземпляре AutoCompleteTextView.