web-dev-qa-db-de.com

Spinner Dropdown-Symbol ändern

Die Lösungen, die ich gefunden habe, um das Spinner-Dropdown-Symbol zu ändern, wo alle:

1. ein benutzerdefiniertes Zeichen erstellen

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <item Android:drawable="@drawable/vector_drawable_ic_dropdown_black" Android:state_focused="true" Android:state_pressed="false" />
    <item Android:drawable="@drawable/vector_drawable_ic_dropdown_black" Android:state_focused="true" Android:state_pressed="true" />
    <item Android:drawable="@drawable/vector_drawable_ic_dropdown_black" Android:state_focused="false" Android:state_pressed="true" />
    <item Android:drawable="@drawable/vector_drawable_ic_dropdown_black" />
</selector>

2. Legen Sie das Drawable als Spinnerhintergrund fest:

<Spinner
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
    Android:layout_marginBottom="16dp"
    Android:background="@drawable/custom_spinner_icon"
    Android:gravity="center"
    Android:paddingBottom="8dp"
    Android:paddingTop="8dp"
    Android:textColor="@color/textcolorprimary" />

Und das Ergebnis ist:

 enter image description here

Wie Sie sehen, ist dies keine akzeptable Lösung, da das Symbol richtig ausgerichtet und nicht gestreckt sein muss.

Was kann ich tun, damit das Symbol nicht gedehnt und richtig ausgerichtet wird?

EDIT

Da es noch keine funktionierenden Lösungen gibt, denke ich, muss ich meine Frage spezifizieren ... So sieht mein Spinner mit dem Standardthema aus:

<Spinner
    Android:id="@+id/products_download_spinner_language"
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
    Android:layout_marginBottom="16dp"
    Android:gravity="center"
    Android:paddingBottom="8dp"
    Android:paddingTop="8dp"
    Android:textColor="@color/textcolorprimary"
    Android:theme="@Android:style/Theme.Holo.Light.DarkActionBar" />

 enter image description here

Und alles, was ich will (es ist wirklich nicht viel, denke ich), verändert den Pfeil. Ich möchte nicht, dass der Pfeil in der rechten unteren Ecke angezeigt wird. Ich möchte, dass dieser Pfeil vertikal zentriert auf der rechten Seite angezeigt wird:

 enter image description here

Und jede Lösung, die ich bisher ausprobiert habe:

Spinner Dropdownpfeil

Wie setze ich den Dropdown-Pfeil im Spinner?

einfach gearbeitet haben. Sie hatten die Symbole ausgedehnt oder die Endlinie fehlte oder etwas anderes lief völlig schief. Ich will nur noch einen Pfeil.

30
Mulgard

Versuchen Sie, den folgenden Stil mit Ihrem Spinner anzuwenden

style="@style/SpinnerTheme"

// Spinner Style :

<style name="SpinnerTheme" parent="Android:Widget.Spinner">
    <item name="Android:background">@drawable/bg_spinner</item>
</style>

// bg_spinner.xml Ersetzen Sie den arrow_down_gray durch Ihren Pfeil

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">

    <item>

        <layer-list>

            <item>
                <shape>
                    <gradient Android:angle="90" Android:endColor="#ffffff" Android:startColor="#ffffff" Android:type="linear" />

                    <stroke Android:width="0.33dp" Android:color="#0fb1fa" />

                    <corners Android:radius="0dp" />

                    <padding Android:bottom="3dp" Android:left="3dp" Android:right="3dp" Android:top="3dp" />
                </shape>
            </item>

            <item Android:right="5dp">

                <bitmap Android:gravity="center_vertical|right" Android:src="@drawable/arrow_down_gray" />

            </item>

        </layer-list>

    </item>

</selector>
79
Pehlaj

Hierfür können Sie .9 Patch Image verwenden und es einfach in den Hintergrund stellen.

Android:background="@drawable/spin"

Hier gebe ich dir .9patch Bild. versuche es mit diesem.

 enter image description here  enter image description here

Klicken Sie mit der rechten Maustaste auf das Bild und klicken Sie auf "Bild speichern unter"

legen Sie den Bildnamen wie folgt fest: anyname.9.png und klicken Sie auf "Speichern".

Viel Spaß beim .. Coading. :)

14
Ronak Selarka

Sie müssen einen benutzerdefinierten Hintergrund wie folgt erstellen:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">

    <item>
        <layer-list>
            <item>
                <shape>
                    <gradient Android:angle="90" Android:endColor="#ffffff" Android:startColor="#ffffff" Android:type="linear"/>

                    <stroke Android:width="1dp" Android:color="#504a4b"/>

                    <corners Android:radius="5dp"/>

                    <padding Android:bottom="3dp" Android:left="3dp" Android:right="3dp" Android:top="3dp"/>
                </shape>
            </item>
            <item>
                <bitmap Android:gravity="bottom|right" Android:src="@drawable/drop_down"/> // you can place your dropdown image
            </item>
        </layer-list>
    </item>

</selector>

Dann erstellen Sie style für Spinner wie folgt:

<style name="spinner_style">
        <item name="Android:background">@drawable/YOURCUSTOMBACKGROUND</item>
        <item name="Android:layout_marginLeft">5dp</item>
        <item name="Android:layout_marginRight">5dp</item>
        <item name="Android:layout_marginBottom">5dp</item>
</style>

anschließend wenden Sie diesen Stil auf Ihren Spinner

3
Mehta

Haben Sie versucht, einen benutzerdefinierten Hintergrund in XML zu definieren? Wenn Sie die Breite des Spinner-Hintergrunds verkleinern, wird der Pfeil so dargestellt.

Definieren Sie eine Ebenenliste mit einem rechteckigen Hintergrund und Ihrem benutzerdefinierten Pfeilsymbol:

    <?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <item>
        <shape Android:shape="rectangle">
            <solid Android:color="@color/color_white" />
            <corners Android:radius="2.5dp" />
        </shape>
    </item>
    <item Android:right="64dp">
         <bitmap Android:gravity="right|center_vertical"  
             Android:src="@drawable/custom_spinner_icon">
         </bitmap>
    </item>
</layer-list>

Wir können es schaffen, indem wir das Icon so verstecken, wie ich es getan habe:

<FrameLayout
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content">
    <Spinner Android:id="@+id/fragment_filter_sp_users"
             Android:layout_width="match_parent"
             Android:background="@color/colorTransparent"
             Android:layout_height="wrap_content"/>

    <ImageView
            Android:layout_gravity="end|bottom"
            Android:contentDescription="@null"
            Android:layout_marginBottom="@dimen/_5sdp"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:src="@drawable/ic_arrow_bottom"
    />
</FrameLayout>
1
Sunil

Ohne Verwendung von ANY Dropdown Verwenden Sie Ihr Drop Down ICON

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">

<item>
    <layer-list>
        <item>
            <shape>
               <gradient Android:angle="90" Android:endColor="#ffffff" Android:startColor="#ffffff" Android:type="linear" /><!--For gradient background-->

                <stroke Android:width="1dp" Android:color="#FFF" /><!--For Border background-->

                <corners Android:radius="0dp" /><!--For background corner-->

                <padding Android:bottom="3dp" Android:left="3dp" Android:right="6dp" Android:top="3dp" /><!--For padding for all sides-->
            </shape>
        </item>
        <item>
            <bitmap Android:gravity="center|right" Android:src="@drawable/ic_down_arrow" /> // Replace with your Icon

        </item>
    </layer-list>
</item>

1
siddharth patel

Thema zum Spinner hinzufügen

<Spinner style="@style/SpinnerTheme"
      Android:layout_width="match_parent"
      Android:layout_height="match_parent"/>

Fügen Sie spinnerTheme zu styles.xml hinzu

<style name="SpinnerTheme" parent="Android:Widget.Spinner">
    <item name="Android:background">@drawable/spinner_background</item>
</style>

Add New -> "Vector Asset" zum Zeichnen mit z. "ic_keyboard_arrow_down_24dp"

Fügen Sie spinner_background.xml zu drawable hinzu

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <item>
        <layer-list>
            <item Android:drawable="@drawable/ic_keyboard_arrow_down_24dp" Android:gravity="center_vertical|right" Android:right="5dp"/>
        </layer-list>
    </item>
</selector>
1
Moshood Awari

dummy.xml (Denken Sie daran, dass die Bildgröße geringer sein sollte)

<?xml version="1.0" encoding="utf-8"?>
    <selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
        <item>
            <layer-list Android:opacity="transparent">
                <item Android:width="60dp" Android:gravity="left" Android:start="20dp">
                    <bitmap  Android:src="@drawable/down_button_dummy_dummy" Android:gravity="left"/>
                </item>
            </layer-list>
        </item>
    </selector>

layout-Datei-Snippet wie

<Android.support.v7.widget.CardView
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        app:cardUseCompatPadding="true"
        app:cardElevation="5dp"
        >
     <Spinner
        Android:layout_width="match_parent"
        Android:layout_height="100dp"
        Android:background="@drawable/dummy">

     </Spinner>
    </Android.support.v7.widget.CardView>

klicken, um das Ergebnislayout-Bild anzuzeigen

Ich hatte große Schwierigkeiten damit, da ich einen benutzerdefinierten Spinner habe. Wenn ich Background setze, wird sich das Drawable dehnen. Meine Lösung hierfür war das Hinzufügen einer Zeichenfläche rechts neben der Spinner-Textansicht. Hier ist ein Code-Schnipsel von meinem Custom Spinner. Der Trick besteht darin, getView zu überschreiben und die Textansicht nach Ihren Wünschen anzupassen.

public class NoTextSpinnerArrayAdapter extends ArrayAdapter<String> {

    private String text = "0";

    public NoTextSpinnerArrayAdapter(Context context, int textViewResourceId, List<String> objects) {
        super(context, textViewResourceId, objects);
    }

    public void updateText(String text){
        this.text = text;
        notifyDataSetChanged();
    }

    public String getText(){
        return text;
    }

    @NonNull
    public View getView(int position, View convertView, @NonNull ViewGroup parent) {
        View view = super.getView(position, convertView, parent);
        TextView textView = view.findViewById(Android.R.id.text1);
        textView.setCompoundDrawablePadding(16);
        textView.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.ic_menu_white_24dp, 0);

        textView.setGravity(Gravity.END);
        textView.setText(text);
        return view;
    }
}

Sie müssen auch den Spinner-Hintergrund auf transparent einstellen:

<lifeunlocked.valueinvestingcheatsheet.views.SelectAgainSpinner
            Android:id="@+id/saved_tickers_spinner"
            Android:background="@Android:color/transparent"
            Android:layout_width="60dp"
            Android:layout_height="match_parent"
            tools:layout_editor_absoluteX="248dp"
            tools:layout_editor_absoluteY="16dp" />

und meine benutzerdefinierte Spinner, wenn Sie es wollen ....

public class SelectAgainSpinner extends Android.support.v7.widget.AppCompatSpinner {
    public SelectAgainSpinner(Context context) {
        super(context);
    }

    public SelectAgainSpinner(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public SelectAgainSpinner(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    @Override
    public void setPopupBackgroundDrawable(Drawable background) {
        super.setPopupBackgroundDrawable(background);
    }

    @Override
    public void setSelection(int position, boolean animate) {
        boolean sameSelected = position == getSelectedItemPosition();
        super.setSelection(position, animate);
        if (sameSelected) {
            // Spinner does not call the OnItemSelectedListener if the same item is selected, so do it manually now
            if (getOnItemSelectedListener() != null) {
                getOnItemSelectedListener().onItemSelected(this, getSelectedView(), position, getSelectedItemId());
            }
        }
    }

    @Override
    public void setSelection(int position) {
        boolean sameSelected = position == getSelectedItemPosition();
        super.setSelection(position);
        if (sameSelected) {
            // Spinner does not call the OnItemSelectedListener if the same item is selected, so do it manually now
            if (getOnItemSelectedListener() != null) {
                getOnItemSelectedListener().onItemSelected(this, getSelectedView(), position, getSelectedItemId());
            }
        }
    }
}
0