スピナーのドロップダウンに別のテーマを設定するにはどうすればよいですか?


回答:


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

その後、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を使用しています。それをインポートするには、何か別のことをする必要がありますか?
ダグラスアルベス

3
@DouglasAlvesは最新の23.0.0を使用します
khusrav

Android Studioはapp:popupTheme Spinner属性を知らないようです:「タグSpinnerに予期しない名前空間プレフィックス "app"が見つかりました」。Lintも同じエラーで失敗します。
makovkastar

1
@Chris Banes:使用するテーマに関係なく、暗い背景のドロップダウンリストが表示されます。
アシュウィン2016

2
XMLで「spinner」の代わりに「android.support.v7.widget.AppCompatSpinner」を使用する必要がありますか?
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
それが質問に答えないことはかなり明白であるので、私は推測します。質問はテーマを設定することに関するものですが、この回答ではテーマに言及していません。はっきりしているので、私はこれに反対票を投じませんでした。
2Dee
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.