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:
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" />
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:
Und jede Lösung, die ich bisher ausprobiert habe:
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.
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>
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.
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. :)
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
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>
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>
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>
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>
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());
}
}
}
}