Hoe kan ik de breedte van de spinner gelijk maken aan de grootste beschikbare itembreedte

Ik realiseer me dat zelfs ik WRAP_CONTENTvoor mijn spinner gebruik (ik vermijd het gebruik van match_parentomdat ik de spinner niet te lang wil hebben), en gebruik match_parentvoor de itemweergave van de spinner en drop-down itemweergave,

Ik vind nog steeds dat de breedte van de spinner niet hetzelfde is als de breedte van het grootste item

Zoals je kunt zien, is de UnitedKingdomniet geschikt.

Dus als ik de UnitedKingdomselecteer, wordt alleen de grootte van de spinner aangepast

Hoe kan ik de grootte van de spinner aanpassen aan de grootste beschikbare itembreedte, zelfs zonder expliciet het grootste item te selecteren?

Mijn spinner-XML is

<Spinner
    android:id="@+id/spinner1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginBottom="10dp" /> 

en de XML-weergaven van mijn spinner zijn

<TextView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/text_view_0"
    style="?android:attr/spinnerItemStyle"
    android:singleLine="true"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:drawablePadding="10dp"
    android:gravity="center_vertical" />

<CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/checked_text_view_0"
    style="?android:attr/spinnerDropDownItemStyle"
    android:singleLine="true"
    android:layout_width="match_parent"
    android:layout_height="48dp"
    android:minHeight="48dp"
    android:drawablePadding="10dp" />

Antwoord 1, autoriteit 100%

U zou het gewenste effect moeten kunnen krijgen door de breedte van de vervolgkeuzelijst op te geven als WRAP_CONTENT:

<Spinner
    android:id="@+id/spinner1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginBottom="10dp"
    android:dropDownWidth="wrap_content"
    android:spinnerMode="dropdown" />

Dit meet maximaal 15 items in de adapter van de spinner om de breedte te bepalen die deze moet gebruiken.


Antwoord 2, autoriteit 47%

Ik “los” het probleem alleen maar op met

<Spinner
    android:id="@+id/country_spinner"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:minWidth="200dp"
    android:layout_marginBottom="10dp" />

200 dp is gewoon een try-n-error-waarde om ervoor te zorgen dat alle items in de vervolgkeuzelijst zichtbaar zijn.


Antwoord 3, autoriteit 16%

In dergelijke gevallen waarin u alle landen wilt vermelden of een grote lijst wilt hebben
Probeer: spinnerMode="dialog"zoals hieronder weergegeven:

<Spinner
    android:id="@+id/spinnerId"
    android:layout_width="wrap_content"
    android:dropDownWidth="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginBottom="10dp"
    android:spinnerMode="dialog"/>

Antwoord 4

Zet uw TextView in LineanLayout in Spinner Item XML,

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
<TextView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/text_view_0"
    style="?android:attr/spinnerItemStyle"
    android:singleLine="true"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:drawablePadding="10dp"
    android:gravity="center_vertical" />
</LinearLayout>

En geef de ID van uw TextView door aan de aangepaste adapterconstructor

CustomAdapter adapter = new CustomAdapter(this,R.layout.spinner_item,R.id.text_view_0,arraylist);

Constructeur

 public CustomAdapter(Context context, int resource, int textViewId, ArrayList<String> resultList) {
                super(context, resource, textViewId, resultList);
        ...
        ...
            }

Antwoord 5

Stel uw breedte in op 0dp en een lay-outgewicht van 1. Het volgende zal het formaat voor u aanpassen.

   <LinearLayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginTop="?android:attr/actionBarSize"
    android:gravity="center">
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/test label"/>
    <Spinner
        android:id="@+id/test_spinner"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:dropDownWidth="wrap_content"
        android:layout_weight="1"
        android:prompt="@string/test_prompt"
        android:spinnerMode="dropdown" />
</LinearLayout>

Antwoord 6

Je kunt spinnerMode="dialog"proberen, maar het is slechts een tijdelijke oplossing, niet het juiste antwoord. Omdat er een nieuw venster met een dialoogvenster wordt weergegeven.

Dus hier is de manier om het te doen. Het past automatisch bij de inhoud.

Het hangt er sterk van af hoe u uw aangepaste lay-out instelt. Mag ik je aanraden om je eigen xml-bestand myspinner_custom_dropdown.xmlte schrijven. De aanbevolen manier is nu ConstraintLayoutvan androidX.

<?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="wrap_content">
    <CheckedTextView
        android:id="@android:id/text1"
        style="?android:attr/spinnerDropDownItemStyle"
        android:layout_width="wrap_content"
        android:layout_height="50dp"
        android:layout_marginStart="8dp"
        android:layout_marginTop="8dp"
        android:ellipsize="marquee"
        android:singleLine="true"
        app:layout_constraintStart_toEndOf="@+id/item_image"
        app:layout_constraintTop_toTopOf="parent" />
    <ImageView
        android:id="@+id/item_image"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:layout_marginStart="8dp"
        android:layout_marginTop="8dp"
        android:src="@drawable/image"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

Belangrijk: u kunt uw aangepaste lay-out gebruiken met uw adapter

dataAdapter.setDropDownViewResource(R.layout.myspinner_custom_dropdown);

Dat is alles, je hebt sommige soorten hardcore-attributen niet nodig in je spinner-declaratie.

<Spinner
            android:id="@+id/my_spinner"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_marginStart="8dp"
            android:layout_marginTop="8dp" />

Antwoord 7

Probeer dit: android:layout_width="fill_parent"

Other episodes