Wie kann ich den Spinner-Stil für Android 4.x oben auf der Symbolleiste reparieren?

Gemäß Android-Dokumentation, Material Design-Stil wird für das Spinner-Widget unterstützt.

So habe ich beschlossen, es in meiner App zu verwenden und es oben auf der Symbolleiste zu platzieren.

layout / activity_base.xml

<android.support.v7.widget.Toolbar
    android:id="@+id/my_awesome_toolbar"
    android:layout_height="wrap_content"
    android:layout_width="match_parent"
    android:minHeight="?attr/actionBarSize"
    android:background="?attr/colorPrimary"
    android:elevation="5dp"
    app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
    app:popupTheme="@style/ThemeOverlay.AppCompat.Light">
    <Spinner
        android:id="@+id/spinner"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
 </android.support.v7.widget.Toolbar>

Aktivitätsthema

<style name="BaseAppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="colorPrimary">@color/omni_primary_color</item>
    <item name="colorPrimaryDark">@color/omni_primary_color_dark</item>
    <item name="colorAccent">@color/omni_accent_color</item>
</style>

BaseActivity.java

public class BaseActivity extends ActionBarActivity {

    @InjectView(R.id.my_awesome_toolbar)
    Toolbar mToolbar;

    @InjectView(R.id.spinner)
    Spinner spinner;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_base);
        ButterKnife.inject(this);
        //setup toolbar
        setSupportActionBar(mToolbar);
        getSupportActionBar().setDisplayShowTitleEnabled(false);
        mToolbar.setNavigationIcon(R.drawable.ic_action_navigation_menu);

        ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(mToolbar.getContext(),
                R.array.planets_array, R.layout.support_simple_spinner_dropdown_item);
        adapter.setDropDownViewResource(R.layout.support_simple_spinner_dropdown_item);
        spinner.setAdapter(adapter);
    }
}

On Lollipop Spinner und Dropdown sehen gut aus, obwohl die Dropdown-Hintergrundfarbe schwarz ist, verglichen mit der Menü-Dropdown-Farbe, die weiß ist. Ich vermute, dassapp:popupTheme="@style/ThemeOverlay.AppCompat.Light" wird nicht an den Spinner weitergegeben.

Android 5.0

Jetzt ist das große Problem bei Android 4.x, bei dem die Dropdown-Hintergrundfarbe weiß (popupTheme propagiert?) Und das Symbol neben dem Drehfeld schwarz ist.

Android 4.4

Wie kann ich es in XML richtig einstellen oder im Code implementieren, damit es auf Android 5 und 4 funktioniert? Im Idealfall möchte ich, dass beide wie auf Android 5 aussehen, aber mit weißem Spinner-Dropdown (wie Einstellungsmenü-Dropdown).

Aktualisiere

Ich habe bemerkt, dass EinstellungseigenschaftcolorControlNormal wirkt sich auf das Filtersymbol des Drehfelds aus. Wenn jemand herausfindet, wie er das für Spinner nutzen kann (ohne andere Inhaltssteuerelemente zu ändern), hätte ich meine Lösung, die dieses Ergebnis mit @Sven answer kombiniert.

Aktualisiere

Die folgende Änderung behebt das Problem für Drehfeldtext und Popup-Farbe. Das einzige Problem für die endgültige Lösung ist das Filtersymbol.

ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(getSupportActionBa,r().getThemedContext(),
                R.array.planets_array, R.layout.support_simple_spinner_dropdown_item);
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

Aktualisiere

Ich habe festgestellt, dass das Filtersymbol tatsächlich ein Teil von @ isandroid:background wurde für den Spinner angegeben und ist transparent. Das Bereitstellen eines eigenen Hintergrunds würde das Problem beheben, z. B.

<item name="android:background">?android:selectableItemBackground</item>

Geheimnis gelüftet

Das letzte Puzzleteil ist das Popup auf Android 5 mit schwarzem Hintergrund und weißem Text, aber ich denke, es kann mit einem benutzerdefinierten Layout gelöst werden. Wenn niemand eine vollständige Antwort liefert, werde ich es selbst tun und als akzeptiert markieren.

Antworten auf die Frage(15)

Ihre Antwort auf die Frage