Ich möchte dem Dropdown eines Spinner
eine benutzerdefinierte Höhe hinzufügen, z. B. 30dp, und ich möchte die Teiler der Dropdown-Liste von Spinner
ausblenden.
Bisher habe ich versucht, dem Spinner
folgenden Stil zuzuweisen:
<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 ist:
<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.
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öhe gemäß Ihren Anforderungen hinzu.
<style name="spinnerItemStyle" parent="Android:Widget.TextView.SpinnerItem">
</style>
<style name="spinnerDropDownItemStyle" parent="Android:TextAppearance.Widget.TextView.SpinnerItem">
</style>
Sie können ein vollständig benutzerdefiniertes Spinner-Design wie as erstellen
Schritt 1: Erstellen Sie in einem zeichnungsfähigen Ordner die Datei background.xml für einen Rand des Drehfelds.
<?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 die Layoutgestaltung des Spinners dieses Dropdown-Symbol oder ein beliebiges Bild drop.png
<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 aus wie unter Bild und es ist überall in runden Bereichen anklickbar und es ist nicht erforderlich, einen Klick-Lister für imageView zu schreiben.
Schritt 3: Entfernen Sie für ein Dropdown-Design die Linie aus Dropdown ListView und ändern Sie die Hintergrundfarbe. Erstellen Sie einen benutzerdefinierten Adapter wie z
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);
Im Layout-Ordner erstellen Sie 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 Layout-Ordner 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
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
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
Grundsätzlich gehen Sie folgendermaßen vor:
Erstellen Sie eine benutzerdefinierte Ansichtsklasse für Ihren Dropdown-Adapter. In dieser benutzerdefinierten Klasse müssen Sie Ihr benutzerdefiniertes Dropdown-Element-Layout 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;
}
}
Verwenden Sie in Ihrer Aktivität oder in Ihrem Fragment den benutzerdefinierten Adapter für Ihre Drehfeldansicht. 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 steht options für die Liste der Dropdown-Elementzeichenfolgen.
ich war mit vielen Problemen konfrontiert, als ich eine andere Lösung ausprobierte. Nach vielen Forschungs- und Entwicklungsarbeiten bekam ich nun eine Lösung
erstelle custom_spinner.xml im layout ordner und füge 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>
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));
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;
}
}
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 layout ordner habe ich 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" />