วิธีปรับแต่งสปินเนอร์ใน Android


140

ฉันต้องการที่จะเพิ่มความสูงที่กำหนดเองเพื่อเลื่อนลงของการSpinnerพูด 30dp Spinnerและฉันต้องการที่จะซ่อนวงเวียนของรายการแบบเลื่อนลงของ

จนถึงตอนนี้ฉันพยายามใช้สไตล์ต่อไปนี้กับ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>

และรหัสของเครื่องปั่นด้ายของฉันคือ:

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

แต่ดูเหมือนว่าจะไม่มีอะไรทำงาน



ไม่มีการนำสไตล์ไปใช้หรือไม่ popupBackGround หรืออะไรอย่างอื่น? แปลก.
Chintan Soni

@Houcine: ฉันลองแล้วตัวอย่างเหล่านั้น .. ฉันต้องการที่จะปรับความสูงของรายการแบบเลื่อนลง
Shruti

@ shree202: ไม่มีรูปแบบ
Shruti

1
@ComeIn ไม่ใช่สไตล์ Android แต่เป็นสไตล์ที่กำหนดเองที่เขาสร้าง นั่นเป็นเหตุผลที่เขามีเพียง "style ="
CyberClaw

คำตอบ:


194

สร้างอะแดปเตอร์ที่กำหนดเองด้วยรูปแบบที่กำหนดเองสำหรับสปินเนอร์

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

ในรูปแบบเพิ่มขนาดที่กำหนดเองและความสูงของคุณตามความต้องการของคุณ

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

  </style>

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

  </style>

3
ลองเปลี่ยน<item name="android:height"> เป็น<item name="android:layout_height">
Tarun

1
ขอบคุณสำหรับการตอบกลับ .. พยายาม แต่ไม่มีผล ... ทำงานเปิด / ปิดในช่วง 3-4 วันที่ผ่านมา .. เพิ่งจะหงุดหงิดตอนนี้ :(
7bluephoenix

5
@ ทารันคุณไม่จำเป็นต้องandroid:id="@+android:id/text1"ใช้ไฟล์ simple_spinner_dropdown_item.xml ใช่ไหม
batbrat

1
ใน R.layout.simple_spinner_dropdown_item เปลี่ยนค่า android: layout_height เป็น "? attr / dropdownListPreferredItemHeight" หรือคุณจะได้รับข้อผิดพลาด: "ข้อผิดพลาด: แอตทริบิวต์ไม่ได้เป็นแบบสาธารณะ"
Loenix

9
สำหรับผู้เข้าชมในอนาคตที่จะตอบนี้ : ไม่ห่อ TextView และ CheckedTextview ภายในรูปแบบ โพสต์ไว้ในไฟล์ layout_file.xml โดยตรง ฉันติดอยู่ที่นี่หลายชั่วโมงจนกระทั่งพบสิ่งที่ผิด
Francisco Romero

95

คุณสามารถสร้างการออกแบบเครื่องปั่นด้ายแบบกำหนดเองได้อย่างเต็มที่

ขั้นที่ 1: ในโฟลเดอร์ drawable ให้ background.xml สำหรับขอบของสปินเนอร์

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

ขั้นที่ 2: สำหรับการออกแบบเลย์เอาท์ของสปินเนอร์ให้ใช้ไอคอนดรอปดาวน์นี้หรือรูปภาพใด ๆ ป้อนคำอธิบายรูปภาพที่นี่

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

ในที่สุดดูเหมือนว่าภาพด้านล่างและมันสามารถคลิกได้ทุกที่ในพื้นที่รอบและไม่จำเป็นต้องเขียนคลิก Lister สำหรับ imageView

ป้อนคำอธิบายรูปภาพที่นี่

ขั้นตอนที่ 3: สำหรับการออกแบบแบบหล่นลงให้ลบบรรทัดออกจากรายการแบบเลื่อนลงมุมมองและเปลี่ยนสีพื้นหลังสร้างอะแดปเตอร์ที่กำหนดเองเช่น

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

ในโฟลเดอร์โครงร่างสร้าง 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"
/>

ในโฟลเดอร์เค้าโครงสร้าง 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" />

ในรูปแบบคุณสามารถเพิ่มขนาดและความสูงที่กำหนดเองตามความต้องการของคุณ

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

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

ในที่สุดดูเหมือนว่าเป็น

ป้อนคำอธิบายรูปภาพที่นี่

ตามความต้องการคุณสามารถเปลี่ยนสีพื้นหลังและข้อความสีแบบเลื่อนลงโดยเปลี่ยนสีพื้นหลังหรือสีข้อความของ simple_spinner_dropdown.xml


ในโค้ดแรกที่ถูกสนิปหมายถึง android: height = "1dp" ในบรรทัด 6 หรือไม่?
Willi Mentzel

โดยไม่ได้ตั้งใจสองครั้งเขียน android: width = "1dp"
Binesh Kumar

2
ไม่มีปัญหาฉันแค่ไม่ต้องการแก้ไขด้วยตัวเองเพราะฉันไม่แน่ใจว่าถ้าคุณต้องการระบุความสูงด้วย "1dp" หรือถ้ามันซ้ำกัน คำตอบที่ดีแม้ว่า :)
Willi Mentzel

@BineshKumar สวัสดีฉันจะรู้ได้อย่างไรว่าคุณประกาศ CheckedTextView ไว้ที่ใด เพราะเมื่อฉันวางในรหัสมันบอกฉันองค์ประกอบจะต้องประกาศก่อน
hyperfkcb

2
ผู้ชายคุณสามารถใช้ชื่อในเลย์เอาต์และ drawable ของคุณฉันใช้เวลาครึ่งชั่วโมงและยังไม่มีเงื่อนงำที่จะทำ ลบด้วยคำตอบที่ไม่ดี
Anton Kizema

21

วิธีแก้ปัญหาที่หรูหราและยืดหยุ่นที่สุดที่ฉันเคยพบมาคือ: http://android-er.blogspot.sg/2010/12/custom-arrayadapter-for-spinner-with.html

โดยทั่วไปให้ทำตามขั้นตอนเหล่านี้:

  1. สร้างไฟล์ xml เลย์เอาต์ที่กำหนดเองสำหรับรายการดรอปดาวน์ของคุณสมมติว่าฉันจะเรียกมันว่า spinner_item.xml
  2. สร้างคลาสมุมมองที่กำหนดเองสำหรับอะแดปเตอร์ดร็อปดาวน์ ในคลาสที่กำหนดเองนี้คุณต้องเขียนทับและตั้งค่าโครงร่างรายการดรอปดาวน์ที่กำหนดเองของคุณในเมธอด getView () และ getDropdownView () รหัสของฉันเป็นดังนี้:

    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. ในกิจกรรมหรือส่วนของคุณใช้อะแดปเตอร์ที่กำหนดเองสำหรับมุมมองสปินเนอร์ของคุณ บางสิ่งเช่นนี้

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

โดยที่ options คือรายการของสตริงไอเท็มดร็อปดาวน์


เคล็ดลับสำหรับฉันคือการเอาชนะ getDropDownView ฉันกำลังเอาชนะ getView แต่ไม่ได้ตระหนักว่าฉันต้องแทนที่วิธีนั้น
estebanuri

7

ลองสิ่งนี้

ฉันกำลังเผชิญกับปัญหามากมายเมื่อฉันพยายามแก้ปัญหาอื่น ๆ ...... หลังจากการวิจัยและพัฒนามากมายตอนนี้ฉันได้รับการแก้ไข

  1. สร้าง custom_spinner.xml ในโฟลเดอร์เค้าโครงและวางรหัสนี้

     <?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. ในกิจกรรมของคุณ

    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. สร้างคลาสใหม่ของอะแดปเตอร์

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

สิ่งนี้ทำให้ฉันมีภาพ men_icon ในทุกรายการหลังจากคลิกที่สปินเนอร์ซึ่งไม่ใช่สิ่งที่ฉันกำลังมองหา หากคุณไม่ต้องการให้รูปภาพ men_icon (หรือการปรับแต่งอื่น ๆ ) ปรากฏในแถวทั้งหมดหลังจากคลิกที่สปินเนอร์ให้ลบการแทนที่ "getDropDownView"
Brett

2

สิ่งนี้ใช้ได้กับฉัน:

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

และในโฟลเดอร์เค้าโครงของฉันฉันสร้าง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" />

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.