1. ホーム
  2. android

[解決済み] スピナーのドロップダウンに異なるテーマを設定するには?

2022-11-22 02:29:43

質問

使用例です。

スピナーはダークテーマですが、ドロップダウンはライトテーマにしたいです。

どのように解決するのですか?

アンドロイド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の出番です。そのスピナーの実装は popupTheme をサポートしていますが、正しく動作させるためにはもう少し複雑です。

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

その後、AppCompat で動作するように Adapter を更新する必要があります。これを行うには、新しい ThemedSpinnerAdapter インターフェイスを実装します。

public class MyAdapter extends BaseAdapter implements ThemedSpinnerAdapter {

   Theme getDropDownViewTheme() { ... }

   void setDropDownViewTheme(Theme theme) { ... }

}

これらのメソッドは、SpinnerがAdapterに対して、どのテーマを使用してドロップダウンリストを作成するかを指示するために使用されます。これをできるだけ簡単にするために、私たちはあなたのために 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();
  }
}