AutoCompleteTextView onItemClickListener не срабатывает - PullRequest
0 голосов
/ 14 мая 2019

У меня есть 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.

Ответы [ 2 ]

0 голосов
/ 14 мая 2019

Когда вы создаете адаптер, предполагается, что макет, на который вы ссылаетесь, является макетом для отдельного элемента с автоподстановкой, а не макетом, содержащим ACTV.

Таким образом, изменение строки создания экземпляра адаптера на:

val adapter = ArrayAdapter<String>(context, android.R.layout.simple_dropdown_item_1line, liftChoices)

устраняет проблему.При этом используется встроенный образец шаблона раскрывающегося списка Android.

0 голосов
/ 14 мая 2019

по умолчанию, android: атрибут clickable атрибута TextView имеет значение false. Вы должны сделать это кликабельным, поместив эту строку в свой XML:

android:clickable="true"

Edit: как вы можете найти детали в этой ссылке

слушатели будут звонить в нисходящем порядке. Вы можете установить OnFocusChangeListener вашего представления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...