Android Раскрывающийся материал: выбранный выпадающий элемент отображается как toString вместо определенного View - PullRequest
1 голос
/ 11 апреля 2020

Я пытаюсь использовать android стиль материала для компонентов TextInputLayout с AutoCompleteTextView. Я хочу, чтобы выбранный элемент был представлен так же, как в выпадающем списке: изображение и текст.

Я пробовал с Spinner в TextInputLayout и Spinner и AutoCompleteTextView без TextInputLayout. Все комбинации работают, но первая - нет (стили материалов не применяются для этих комбинаций).

Выбранный элемент представлен как toString объекта, который я использую для своего настраиваемого адаптера.

Что я делаю не так?

PS: я использую SVG Drawables для изображений.

main_activity. xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <com.google.android.material.textfield.TextInputLayout
        android:id="@+id/language_from"
        style="@style/Widget.MaterialComponents.TextInputLayout.FilledBox.ExposedDropdownMenu"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginStart="8dp"
        android:layout_marginTop="32dp"
        android:layout_marginEnd="8dp"
        android:layout_marginBottom="8dp"
        android:hint="from"
        app:layout_constraintBottom_toTopOf="@+id/language_to"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent">

        <AutoCompleteTextView
            android:id="@+id/language_from_view"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:inputType="none" />

    </com.google.android.material.textfield.TextInputLayout>

    <com.google.android.material.textfield.TextInputLayout
        android:id="@+id/language_to"
        style="@style/Widget.MaterialComponents.TextInputLayout.FilledBox.ExposedDropdownMenu"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginStart="8dp"
        android:layout_marginTop="8dp"
        android:layout_marginEnd="8dp"
        android:hint="to"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/language_from">

        <AutoCompleteTextView
            android:id="@+id/language_to_view"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:inputType="none"/>

    </com.google.android.material.textfield.TextInputLayout>

    <com.google.android.material.textfield.TextInputLayout
        android:id="@+id/searchInputLayout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginStart="8dp"
        android:layout_marginTop="16dp"
        android:layout_marginEnd="8dp"
        android:hint="label"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/language_to">

        <com.google.android.material.textfield.TextInputEditText
            android:id="@+id/searchInput"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

    </com.google.android.material.textfield.TextInputLayout>

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recyclerView"
        android:layout_width="412dp"
        android:layout_height="531dp"
        android:layout_marginStart="8dp"
        android:layout_marginTop="16dp"
        android:layout_marginEnd="8dp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@id/searchInputLayout">

    </androidx.recyclerview.widget.RecyclerView>

</androidx.constraintlayout.widget.ConstraintLayout>

MainActivity.kt

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val languageList = createLanguages()
        val adapter = LanguageAdapter(this, languageList)

        val languageFromDropdown = findViewById<AutoCompleteTextView>(R.id.language_from_view)
        val languageToDropdown = findViewById<AutoCompleteTextView>(R.id.language_to_view)

        languageFromDropdown.setAdapter(adapter)
        languageToDropdown.setAdapter(adapter)
    }

    private fun createLanguages(): List<LanguageDropdownItem>
            = listOf(LanguageDropdownItem(Language.POLISH, R.drawable.ic_polish_flag),
                     LanguageDropdownItem(Language.ENGLISH, R.drawable.ic_english_flag),
                     LanguageDropdownItem(Language.GERMAN, R.drawable.ic_german_flag),
                     LanguageDropdownItem(Language.FRENCH, R.drawable.ic_french_flag),
                     LanguageDropdownItem(Language.ITALIAN, R.drawable.ic_italian_flag),
                     LanguageDropdownItem(Language.SWISS, R.drawable.ic_swiss_flag))

}

language_dropdown_item. xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ImageView
        android:id="@+id/flag_image"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginStart="8dp"
        android:layout_marginTop="2dp"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:srcCompat="@drawable/ic_english_flag" />

    <TextView
        android:id="@+id/language_name"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginStart="8dp"
        android:layout_marginTop="8dp"
        android:layout_marginEnd="8dp"
        android:text="TextView"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toEndOf="@+id/flag_image"
        app:layout_constraintTop_toTopOf="parent"
        android:ellipsize="end"
        android:maxLines="1"
        android:textAppearance="?attr/textAppearanceSubtitle1" />


</androidx.constraintlayout.widget.ConstraintLayout>

LanguageDropdownItem. kt

data class LanguageDropdownItem(val language: Language, val drawableFlag: Int)

LanguageAdapter.kt

class LanguageAdapter(val mContext: Context,
                      val mLanguages: List<LanguageDropdownItem>)
    : ArrayAdapter<LanguageDropdownItem>(mContext, 0, mLanguages) {

    override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
        var dropdownItemView = convertView

        if (dropdownItemView == null)
            dropdownItemView = LayoutInflater.from(mContext)
                                .inflate(R.layout.language_dropdown_item, parent,false)

        val language = mLanguages[position]

        val flagImage: ImageView = dropdownItemView!!.findViewById(R.id.flag_image)
        flagImage.setImageResource(language.drawableFlag)

        val langTextView: TextView = dropdownItemView.findViewById(R.id.language_name)
        langTextView.text = language.language.name

        return dropdownItemView
    }
}

И язык - это enum класс с именами языков.

screenshot of my dropdown and selected result

...