studio programacion not item first developer android android-layout android-spinner

programacion - spinner android developer



Cómo personalizar un Spinner en Android (5)

Prueba esto

Estaba enfrentando muchos problemas cuando estaba probando otra solución ...... Después de mucho I + D ahora tengo solución

  1. crea custom_spinner.xml en la carpeta de diseño y pega este código

    <?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. en tu actividad

    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. crea una nueva clase de adaptador

    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; }

    }

Quiero agregar una altura personalizada al menú desplegable de un Spinner , digamos 30dp, y quiero ocultar los divisores de la lista desplegable de Spinner .

Hasta ahora intenté implementar el siguiente estilo para el 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>

y el código de mi spinner es:

<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" />

Pero nada parece estar funcionando.


Crea un adaptador personalizado con un diseño personalizado para tu 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" />

En los estilos, agregue las dimensiones y la altura personalizadas según su requisito.

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


Esto funcionó para mí:

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);

y en mi carpeta de diseño creé 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" />


La solución más elegante y flexible que he encontrado hasta ahora está aquí: http://android-er.blogspot.sg/2010/12/custom-arrayadapter-for-spinner-with.html

Básicamente, sigue estos pasos:

  1. Cree un archivo xml de diseño personalizado para su elemento desplegable, digamos que lo llamaré spinner_item.xml
  2. Cree una clase de vista personalizada para su Adaptador desplegable. En esta clase personalizada, debe sobrescribir y establecer su diseño de elemento desplegable personalizado en los métodos getView () y getDropdownView (). Mi código es el siguiente:

    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. En su actividad o fragmento, haga uso del adaptador personalizado para su vista giratoria. Algo como esto:

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

donde options es la lista de cadenas de elementos desplegables.


Puede crear un diseño de ruleta completamente personalizado como

Paso 1: en la carpeta dibujable, crea background.xml para border of spinner.

<?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>

Paso 2: para el diseño del diseño de la ruleta use este icono desplegable o cualquier imagen 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>

Finalmente se ve como la imagen de abajo y se puede hacer clic en todas partes en el área redonda y sin necesidad de escribir haga clic en Lister para imageView.

Paso 3: para el diseño desplegable, quite la línea de la lista desplegable y cambie el color de fondo, cree un adaptador personalizado como

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);

En la carpeta dibujable, crea 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" />

En la carpeta dibujable crea 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" />

En los estilos, puede agregar dimensiones y altura personalizadas según su requisito.

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

Finnally parece como

Según los requisitos, puede cambiar el color de fondo y el texto del color desplegable cambiando el color de fondo o el color del texto de simple_spinner_dropdown.xml