Spinner의 드롭 다운에 다른 테마를 설정하려면 어떻게해야합니까?


답변:


195

안드로이드 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" />

그런 다음 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();
  }
}

안녕하세요, appcompat-v7에서 ThemedSpinnerAdapter를 찾을 수 없습니다. 버전 22.2.1을 사용하고 있습니다. 가져 오기 위해 다른 작업을 수행해야합니까?
Douglas Alves

3
@DouglasAlves는 최신 23.0.0 사용
khusrav

Android Studio가 app : popupTheme Spinner 속성에 대해 알지 못하는 것 같습니다 : "태그 Spinner에 대해 예기치 않은 네임 스페이스 접두사"app "이 발견되었습니다". Lint도 동일한 오류로 실패합니다.
makovkastar

1
@Chris Banes : 사용하는 테마에 관계없이 어두운 배경의 드롭 다운 목록을 제공합니다.
Ashwin

2
xml에서 "spinner"대신 "android.support.v7.widget.AppCompatSpinner"를 사용해야합니까?
천사 코

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구현 을 사용하는 것이 훨씬 쉬울 수 있습니다. 그냥 override 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
나는 그것이 질문에 대답하지 않는 것이 상당히 명백하기 때문에 추측합니다. 질문은 테마 설정에 관한 것입니다.이 답변에는 테마에 대한 언급이 없습니다. 그래서 우리는 분명히 이것을 반대표를 던지지 않았고 다른 사람들은 이미 충분히 해냈습니다.
2Dee 2015-08-19
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.