material-components / material-components/material-components-android

[Exposed dropdown menus]: Layout expands to width of menu content, not the width of the text that will be displayed.

Offen
#4,375 0 Kommentare 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

feature request Widget: Menu
Vorherrschende Sprache
Java
Sterne
17.4k
Forks
3.2k
PR-Merge-Kennzahlen
Keine gemergten PRs in 30 T.

Beschreibung

Description: When using an adapter to provide more complex content to an exposed drop down menu, the width of the TextInputLayout is expanded to the width of the menu, not the width of the longest content that will be shown in TextInputLayout.

This is probably easier to explain with screenshots.

This is the screenshot of an exposed drop down menu with three items, "Show", "Warn", and "Hide", set using setOptions().

This is what I expect.

However, I want to show the user additional information about each choice. The labels are deliberately short because there isn't much screen real estate available. So I have a trivial adapter that uses a two-line view, like this:

    data class FilterDescription(val title: String, val descr: String) {
        override fun toString() = title
    }

    val adapter = object : ArrayAdapter<FilterDescription>(
        requireContext(),
            android.R.layout.simple_list_item_2,
            android.R.id.text1,
        ) {
            val items = listOf( /* FilterDescription objects here */ )

            init {
                addAll(items)
            }

            override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
                val view = super.getView(position, convertView, parent)
                val text1 = view.findViewById<TextView>(android.R.id.text1)
                val text2 = view.findViewById<TextView>(android.R.id.text2)
                getItem(position)?.let { item ->
                    text1.text = item.title
                    text2.text = item.descr
                }
                return view
            }
        }

If I set this adapter the menu displays two lines per item as expected. However, the width of the TextInputLayout is now the width of the longest descr. Like this with the menu open:

and this with the menu closed:

Expected behavior: The layout should be the maximum width of the content that will be shown in it, not the maximum width of the pop up menu.

Source code: As above.

Android API version: 31

Material Library version: 1.12.0

Device: Emulator

Beitragsleitfaden

Beitragsleitfaden öffnen

Erste Schritte

  1. Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
  3. Forke das Repository und arbeite in einem Branch.
  4. Öffne einen Pull Request, der die Issue-Nummer nennt.

Rechercherichtung

Beginne damit, das Problem auf Android API 31 mit Material Library 1.12.0 unter Verwendung des bereitgestellten Kotlin-Adapters und des Exposed-Dropdown-Menüs zu reproduzieren. Untersuche das Verhalten bei der Breitenmessung des Menüs; fertig ist es, wenn das geschlossene TextInputLayout auf die Breite seines angezeigten Inhalts und nicht auf die längeren Beschreibungen des Adapters bemessen wird, während das Menü weiterhin beide Zeilen anzeigt.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

Tech-Stack
android, kotlin
Bereich
mobile-dev
Issue-Typ
Bug
Schwierigkeit
3/5
Geschätzter Aufwand
1-2 Tage
Aktivitätsstatus
Veraltet
Klarheit
Größtenteils klar
Anfängerfreundlichkeit
42/100

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.