ฉันจะตั้งค่าธีมอื่นสำหรับดรอปดาวน์ของ Spinner ได้อย่างไร


102

ตัวอย่างการใช้งาน:

ใส่คำอธิบายภาพที่นี่

Spinner เป็นธีมสีเข้ม แต่ฉันต้องการให้ดรอปดาวน์เป็นธีมสีอ่อน

คำตอบ:


195

Android M

ใหม่ใน Android 6.0 ตอนนี้ Spinner มีandroid:popupThemeพารามิเตอร์ที่ให้คุณตั้งค่าธีมที่ใช้สำหรับป๊อปอัป (ดรอปดาวน์)

คุณสามารถใช้มันได้ดังนี้:

<Spinner
    android:layout_height="wrap_content"
    android:layout_width="match_parent"
    android:popupTheme="@android:style/ThemeOverlay.Material.Light" />

ซึ่งจะใช้ได้กับอุปกรณ์ที่ใช้ API ระดับ 23+ แต่ใช้ไม่ได้กับอุปกรณ์ที่ใช้ Android เวอร์ชันต่ำกว่า

AppCompat

นี่คือสิ่งที่ AppCompat เข้ามาการใช้งาน Spinner ยังรองรับpopupThemeแต่ก็มีส่วนเกี่ยวข้องมากกว่าเล็กน้อยในการทำให้ถูกต้อง

<Spinner
    android:layout_height="wrap_content"
    android:layout_width="match_parent"
    app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />

หลังจากนั้นคุณต้องอัปเดต Adapter ของคุณเพื่อให้สามารถทำงานกับ AppCompat ได้ คุณทำได้โดยการใช้ThemedSpinnerAdapterอินเทอร์เฟซใหม่

public class MyAdapter extends BaseAdapter implements ThemedSpinnerAdapter {

   Theme getDropDownViewTheme() { ... }

   void setDropDownViewTheme(Theme theme) { ... }

}

Spinner ใช้วิธีการเหล่านี้เพื่อให้สามารถบอกอะแดปเตอร์ได้ว่าจะใช้ธีมใดในการขยายมุมมองแบบเลื่อนลง เพื่อให้ง่ายที่สุดเราได้ให้Helperคลาสที่คุณสามารถเสียบเข้ากับอะแดปเตอร์ของคุณได้

ซึ่งหมายความว่าอะแดปเตอร์ของคุณจะมีลักษณะดังนี้:

public class MyAdapter extends BaseAdapter implements ThemedSpinnerAdapter {
  private final ThemedSpinnerAdapter.Helper mDropDownHelper;

  public MyAdapter(Context context) { 
    mDropDownHelper = new ThemedSpinnerAdapter.Helper(context);
  }

  @Override
  public View getDropDownView(int position, View convertView, ViewGroup parent) {
    View view;

    if (convertView == null) {
      // Inflate the drop down using the helper's LayoutInflater
      LayoutInflater inflater = mDropDownHelper.getDropDownViewInflater();
      view = inflater.inflate(R.layout.my_dropdown, parent, false);
    }

    // ...

    return view;
  }

  @Override
  public void setDropDownViewTheme(Theme theme) {
    mDropDownHelper.setDropDownViewTheme(theme);
  }

  @Override
  public Theme getDropDownViewTheme() {
    return mDropDownHelper.getDropDownViewTheme();
  }
}

สวัสดีฉันไม่พบ ThemedSpinnerAdapter ใน appcompat-v7 ฉันใช้เวอร์ชัน 22.2.1 ฉันต้องทำอะไรที่แตกต่างเพื่อนำเข้าหรือไม่?
Douglas Alves

3
@DouglasAlves ใช้ใหม่ล่าสุด 23.0.0
khusrav

ดูเหมือนว่า Android Studio จะไม่ทราบเกี่ยวกับแอป: popupTheme Spinner แอตทริบิวต์: พบ "แอป" นำหน้าเนมสเปซที่ไม่คาดคิด "สำหรับแท็ก Spinner" ผ้าสำลีก็ล้มเหลวด้วยข้อผิดพลาดเดียวกัน
makovkastar

1
@Chris Banes: ให้รายการแบบหล่นลงพร้อมพื้นหลังสีเข้มโดยไม่คำนึงถึงธีมที่คุณใช้
Ashwin

2
ควรใช้ "android.support.v7.widget.AppCompatSpinner" แทน "spinner" ใน xml หรือไม่
Angel Koh

2

สำหรับลูกศรของสปินเนอร์ที่ฉันใช้android:backgroundTint="@color/white"สิ่งนี้จะใช้ได้กับ API 21

สำหรับมุมมองสปินเนอร์และมุมมองแบบเลื่อนลง:

ArrayAdapter<Area> areasAdapter = new ArrayAdapter<Area>(getContext(),R.layout.spinner_item, areas);

areasAdapter.setDropDownViewResource(R.layout.dropdwon_item);
areasSpinner.setAdapter(areasAdapter);

สำหรับgetView ()อะแด็ปเตอร์จะใช้ spinner_item.xml

สำหรับgetDropDownView ()อะแด็ปเตอร์จะใช้ dropdwon_item.xml

จากนั้นคุณสามารถใช้เลย์เอาต์ที่กำหนดเองได้ตามต้องการ

หวังว่ามันจะช่วยได้


0

สำหรับการอ้างอิงหากคุณใช้การCursorAdapterติดตั้งของคุณสามารถทำได้ง่ายกว่ามากเพียงแค่ลบล้างnewView()ไม่จำเป็นต้องแทนที่ที่getDropDownView()นั่น:

@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
    return mDropDownHelper.getDropDownViewInflater().inflate(R.layout.list_item, parent, false);
}

-6

คุณสามารถลองสิ่งนี้: ในโฟลเดอร์เลย์เอาต์ของคุณให้สร้าง spinner_item.xml:

<TextView 
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="right"
android:padding="10dp"
android:background = "#ffffff"
android:textColor="@color/primary_text"
android:textSize="@dimen/text_size_normal" />

จากนั้นใช้รหัสนี้:

spinnerAdapter = new ArrayAdapter<String>(R.layout.spinner_item,items);

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