programing

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

nasanasas 2020. 8. 16. 20:45
반응형

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


사용 예 :

여기에 이미지 설명 입력

스피너는 어두운 테마이지만 드롭 다운은 밝은 테마로하고 싶습니다.


안드로이드 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();
  }
}

에 대한 회 전자의 화살표를 내가 사용했던 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 사용

그런 다음 원하는대로 사용자 지정 레이아웃을 사용할 수 있습니다.

도움이 되길 바랍니다


참조를 위해 CursorAdapter구현 을 사용하는 것이 훨씬 쉬울 수 있습니다. 그냥 override newView(), getDropDownView()거기 에서 재정의 할 필요가 없습니다 .

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

당신은 이것을 시도 할 수 있습니다 : 레이아웃 폴더에서 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);

참고 URL : https://stackoverflow.com/questions/32066277/how-do-i-set-a-different-theme-for-a-spinners-dropdown

반응형