So passen Sie einen Spinner in Android an

140

Ich möchte dem Dropdown-Menü eine benutzerdefinierte Höhe hinzufügen Spinner, z. B. 30 dp, und ich möchte die Teiler der Dropdown-Liste von ausblenden Spinner.

Bisher habe ich versucht, folgenden Stil zu implementieren Spinner:

<style name="spinner_style">
        <item name="android:paddingLeft">0dp</item>
        <item name="android:dropDownWidth">533dp</item>
        <item name="android:showDividers">none</item>
        <item name="android:dividerHeight">0dp</item>
        <item name="android:popupBackground">@drawable/new_bg</item>
        <item name="android:dropDownHeight">70dp</item>
        <item name="android:scrollbarAlwaysDrawVerticalTrack">true</item>
        <item name="android:dropDownSelector">@android:color/white</item>
 </style>

und der Code meines Spinners lautet:

<Spinner
            android:id="@+id/pioedittxt5"
            android:layout_width="543dp"
            android:layout_height="63dp"
            android:layout_toRightOf="@+id/piotxt5"
            android:background="@drawable/spinner"
            style="@style/spinner_style"
            android:dropDownVerticalOffset="-53dp"
            android:spinnerMode="dropdown"
            android:drawSelectorOnTop="true"
            android:entries="@array/travelreasons"
            android:prompt="@string/prompt" />

Aber nichts scheint zu funktionieren.

Shruti
quelle
Keiner der Stile wird angewendet? popupBackGround oder sonst was? Seltsam.
Chintan Soni
@Houcine: Ich habe diese Beispiele bereits ausprobiert. Ich möchte die Höhe der Dropdown-Liste anpassen
Shruti
@ shree202: kein Stil gilt
Shruti
1
@ComeIn, es ist kein Android-Stil, sondern ein benutzerdefinierter, den er erstellt hat. Deshalb hat er nur "style ="
CyberClaw

Antworten:

194

Erstellen Sie einen benutzerdefinierten Adapter mit einem benutzerdefinierten Layout für Ihren Spinner.

Spinner spinner = (Spinner) findViewById(R.id.pioedittxt5);
ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this,
        R.array.travelreasons, R.layout.simple_spinner_item);
adapter.setDropDownViewResource(R.layout.simple_spinner_dropdown_item);
spinner.setAdapter(adapter);

R.layout.simple_spinner_item

<TextView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@android:id/text1"
    style="@style/spinnerItemStyle"
    android:maxLines="1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:ellipsize="marquee" />

R.layout.simple_spinner_dropdown_item

<CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@android:id/text1"
    style="@style/spinnerDropDownItemStyle"
    android:maxLines="1"
    android:layout_width="match_parent"
    android:layout_height="?android:attr/dropdownListPreferredItemHeight"
    android:ellipsize="marquee" />

Fügen Sie in Stilen Ihre benutzerdefinierten Abmessungen und Höhen gemäß Ihren Anforderungen hinzu.

 <style name="spinnerItemStyle" parent="android:Widget.TextView.SpinnerItem">

  </style>

  <style name="spinnerDropDownItemStyle" parent="android:TextAppearance.Widget.TextView.SpinnerItem">

  </style>
Tarun
quelle
3
Versuchen Sie, <item name="android:height"> zu<item name="android:layout_height">
Tarun
1
Danke für die Antwort .. versucht, aber ohne Wirkung ... in den letzten 3-4 Tagen
ein-
5
@Tarun, brauchen Sie nicht android:id="@+android:id/text1"in der Datei simple_spinner_dropdown_item.xml?
Batbrat
1
Ändern Sie in R.layout.simple_spinner_dropdown_item den Wert für android: layout_height in "? Attr / dropdownListPreferredItemHeight", oder Sie erhalten die Fehlermeldung: "Fehler: Attribut ist nicht öffentlich"
Loenix
9
Für zukünftige Besucher dieser Antwort : Schließen Sie TextView und CheckedTextview nicht in ein Layout ein . Veröffentlichen Sie es direkt in Ihrer Datei layout_file.xml. Ich saß einige Stunden hier fest, bis ich den Fehler fand.
Francisco Romero
95

Sie können ein vollständig benutzerdefiniertes Spinner-Design wie as erstellen

Schritt 1: Erstellen Sie im Zeichenordner background.xml für einen Rand des Spinners.

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="@android:color/transparent" />
<corners android:radius="5dp" />
<stroke
android:width="1dp"
   android:color="@android:color/darker_gray" />
</shape>

Schritt 2: Verwenden Sie für das Layout-Design des Spinners dieses Dropdown-Symbol oder ein beliebiges Bild drop.png Geben Sie hier die Bildbeschreibung ein

 <RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginRight="3dp"
    android:layout_weight=".28"
    android:background="@drawable/spinner_border"
    android:orientation="horizontal">

    <Spinner
        android:id="@+id/spinner2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        android:layout_gravity="center"
        android:background="@android:color/transparent"
        android:gravity="center"
        android:layout_marginLeft="5dp"
        android:spinnerMode="dropdown" />

    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_centerVertical="true"
        android:layout_gravity="center"
        android:src="@mipmap/drop" />

</RelativeLayout>

Endlich sieht es so aus wie unter dem Bild und es ist überall im runden Bereich anklickbar und es muss kein Klick-Lister für imageView geschrieben werden.

Geben Sie hier die Bildbeschreibung ein

Schritt 3: Entfernen Sie für das Dropdown-Design die Linie aus der Dropdown-Listenansicht und ändern Sie die Hintergrundfarbe. Erstellen Sie einen benutzerdefinierten Adapter wie folgt

Spinner spinner = (Spinner) findViewById(R.id.spinner1);
String[] years = {"1996","1997","1998","1998"};
ArrayAdapter<CharSequence> langAdapter = new ArrayAdapter<CharSequence>(getActivity(), R.layout.spinner_text, years );
langAdapter.setDropDownViewResource(R.layout.simple_spinner_dropdown);
mSpinner5.setAdapter(langAdapter);

Erstellen Sie im Layoutordner R.layout.spinner_text.xml

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:layoutDirection="ltr"
android:id="@android:id/text1"
style="@style/spinnerItemStyle"
android:singleLine="true"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ellipsize="marquee"
android:paddingLeft="2dp"
/>

Erstellen Sie im Layoutordner die Datei simple_spinner_dropdown.xml

<?xml version="1.0" encoding="utf-8"?>
<CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/text1"
style="@style/spinnerDropDownItemStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ellipsize="marquee"
android:paddingBottom="5dp"
android:paddingLeft="10dp"
android:paddingRight="10dp"
android:paddingTop="5dp"
android:singleLine="true" />

In Stilen können Sie benutzerdefinierte Abmessungen und Höhen gemäß Ihren Anforderungen hinzufügen.

<style name="spinnerItemStyle" parent="android:Widget.TextView.SpinnerItem">
</style>

<style name="spinnerDropDownItemStyle" parent="android:TextAppearance.Widget.TextView.SpinnerItem">
</style>

Endlich sieht es so aus

Geben Sie hier die Bildbeschreibung ein

Je nach Anforderung können Sie die Hintergrundfarbe und den Text der Dropdown-Farbe ändern, indem Sie die Hintergrundfarbe oder die Textfarbe von simple_spinner_dropdown.xml ändern

Binesh Kumar
quelle
meinst du im ersten abgeschnittenen Code android: height = "1dp" in Zeile 6?
Willi Mentzel
Aus Versehen schreibe zweimal android: width = "1dp"
Binesh Kumar
2
Kein Problem, ich wollte es einfach nicht selbst bearbeiten, da ich nicht sicher war, ob Sie die Höhe mit "1dp" angeben wollten oder ob es sich nur um ein Duplikat handelte. Gute Antwort. :)
Willi Mentzel
@BineshKumar Hey, darf ich wissen, wo Sie CheckedTextView deklariert haben? Denn als ich den Code
einfügte
2
Mann, du hättest Namen in deinen Layouts und Zeichnungen verwenden können, ich habe eine halbe Stunde verbracht und immer noch keine Ahnung, was ich tun soll. Minus für schlechte Antwort.
Anton Kizema
21

Die eleganteste und flexibelste Lösung, die ich bisher gefunden habe, ist hier: http://android-er.blogspot.sg/2010/12/custom-arrayadapter-for-spinner-with.html

Befolgen Sie grundsätzlich die folgenden Schritte:

  1. Erstellen Sie eine benutzerdefinierte Layout-XML-Datei für Ihr Dropdown-Element. Nehmen wir an, ich werde sie spinner_item.xml nennen
  2. Erstellen Sie eine benutzerdefinierte Ansichtsklasse für Ihren Dropdown-Adapter. In dieser benutzerdefinierten Klasse müssen Sie Ihr benutzerdefiniertes Dropdown-Elementlayout in den Methoden getView () und getDropdownView () überschreiben und festlegen. Mein Code ist wie folgt:

    public class CustomArrayAdapter extends ArrayAdapter<String>{
    
    private List<String> objects;
    private Context context;
    
    public CustomArrayAdapter(Context context, int resourceId,
         List<String> objects) {
         super(context, resourceId, objects);
         this.objects = objects;
         this.context = context;
    }
    
    @Override
    public View getDropDownView(int position, View convertView,
        ViewGroup parent) {
        return getCustomView(position, convertView, parent);
    }
    
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
      return getCustomView(position, convertView, parent);
    }
    
    public View getCustomView(int position, View convertView, ViewGroup parent) {
    
    LayoutInflater inflater=(LayoutInflater) context.getSystemService(  Context.LAYOUT_INFLATER_SERVICE );
    View row=inflater.inflate(R.layout.spinner_item, parent, false);
    TextView label=(TextView)row.findViewById(R.id.spItem);
     label.setText(objects.get(position));
    
    if (position == 0) {//Special style for dropdown header
          label.setTextColor(context.getResources().getColor(R.color.text_hint_color));
    }
    
    return row;
    }
    
    }
  3. Verwenden Sie in Ihrer Aktivität oder Ihrem Fragment den benutzerdefinierten Adapter für Ihre Spinner-Ansicht. Etwas wie das:

    Spinner sp = (Spinner)findViewById(R.id.spMySpinner);
    ArrayAdapter<String> myAdapter = new CustomArrayAdapter(this, R.layout.spinner_item, options);
    sp.setAdapter(myAdapter);

Dabei ist Optionen die Liste der Dropdown-Elementzeichenfolgen.

Tony Vu
quelle
Der Trick für mich war, getDropDownView zu überschreiben, getView zu überschreiben, aber nicht zu erkennen, dass ich diese Methode überschreiben musste.
Estebanuri
7

Versuche dies

Ich hatte viele Probleme, als ich eine andere Lösung ausprobierte. Nach viel Forschung und Entwicklung bekam ich jetzt eine Lösung

  1. Erstellen Sie die Datei custom_spinner.xml im Layoutordner und fügen Sie diesen Code ein

     <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/colorGray">
    <TextView
    android:id="@+id/tv_spinnervalue"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:textColor="@color/colorWhite"
    android:gravity="center"
    android:layout_alignParentLeft="true"
    android:textSize="@dimen/_18dp"
    android:layout_marginTop="@dimen/_3dp"/>
    <ImageView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentRight="true"
    android:background="@drawable/men_icon"/>
    </RelativeLayout>
  2. in Ihrer Tätigkeit

    Spinner spinner =(Spinner)view.findViewById(R.id.sp_colorpalates);
    String[] years = {"1996","1997","1998","1998"};
    spinner.setAdapter(new SpinnerAdapter(this, R.layout.custom_spinner, years));
  3. Erstellen Sie eine neue Adapterklasse

    public class SpinnerAdapter extends ArrayAdapter<String> {
    private String[] objects;
    
    public SpinnerAdapter(Context context, int textViewResourceId, String[] objects) {
        super(context, textViewResourceId, objects);
        this.objects=objects;
    }
    
    @Override
    public View getDropDownView(int position, View convertView, @NonNull ViewGroup parent) {
        return getCustomView(position, convertView, parent);
    }
    
    @NonNull
    @Override
    public View getView(int position, View convertView, @NonNull ViewGroup parent) {
        return getCustomView(position, convertView, parent);
    }
    
    private View getCustomView(final int position, View convertView, ViewGroup parent) {
        View row = LayoutInflater.from(parent.getContext()).inflate(R.layout.custom_spinner, parent, false);
        final TextView label=(TextView)row.findViewById(R.id.tv_spinnervalue);
        label.setText(objects[position]);
        return row;
    }
    }
Sunil
quelle
Dies gab mir das men_icon-Bild auf allen Gegenständen, nachdem ich auf den Spinner geklickt hatte, was nicht das war, wonach ich suchte. Wenn Sie nicht möchten, dass das men_icon-Bild (oder andere Anpassungen) in allen Zeilen angezeigt wird, nachdem Sie auf den Drehknopf geklickt haben, entfernen Sie die Überschreibung "getDropDownView".
Brettins
2

Das hat bei mir funktioniert:

ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(),R.layout.simple_spinner_item,areas);
            Spinner areasSpinner = (Spinner) view.findViewById(R.id.area_spinner);
            areasSpinner.setAdapter(adapter);

und in meinem Layoutordner habe ich erstellt simple_spinner_item:

<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/text1"
android:layout_width="match_parent"
// add custom fields here 
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceListItemSmall"
android:gravity="center_vertical"
android:paddingStart="?android:attr/listPreferredItemPaddingStart"
android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
android:minHeight="?android:attr/listPreferredItemHeightSmall"
android:paddingLeft="?android:attr/listPreferredItemPaddingLeft"
android:paddingRight="?android:attr/listPreferredItemPaddingRight" />
Zizoujab
quelle
0

Ich habe ein kleines Demo-Projekt darauf aufgebaut, das Sie sich ansehen können. Link zum Projekt

Vivek Barai
quelle