web-dev-qa-db-fra.com

Changer le style de spinner dans la barre d'outils

J'essaie de mettre un spinner dans mon Toolbar comme l'ancienne navigation de style ActionBar et mon thème est le suivant

<style name="AppBaseTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="colorPrimary">@color/color_primary</item>
    <item name="colorPrimaryDark">@color/color_primary_dark</item>
    <item name="colorAccent">@color/color_primary</item>
</style>

mais mon spinner est noir tandis que toutes les autres icônes et menus de débordement sont blancs donc ça a l'air mauvais

enter image description here

J'ai essayé de changer le style du spinner en utilisant ceci

<style name="ToolbarSpinnerTheme" parent="Theme.AppCompat">
    <item name="Android:spinnerItemStyle">@style/TextAppearanceSpinnerItem</item>
</style>

<style name="TextAppearanceSpinnerItem">
    <item name="Android:textColor">#FFFFFF</item>
</style>

voici comment ma barre d'outils est stylée

<Android.support.v7.widget.Toolbar
           Android:id="@+id/toolbar"
           Android:layout_width="match_parent"
           Android:layout_height="wrap_content"
           Android:minHeight="?attr/actionBarSize"
           Android:background="?attr/colorPrimary"
           app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
           app:popupTheme="@style/ThemeOverlay.AppCompat.Light">

           <Spinner
               Android:layout_width="wrap_content"
               Android:layout_height="wrap_content"
               Android:id="@+id/modes"
               Android:minWidth="150dp"
               Android:gravity="bottom"
               style="@style/ToolbarSpinnerTheme"/>

       </Android.support.v7.widget.Toolbar>


final Spinner mode = (Spinner)findViewById(R.id.modes);

    SpinnerAdapter mSpinner = ArrayAdapter.createFromResource(this, R.array.action_bar_spinner, Android.R.layout.simple_spinner_dropdown_item);
    mode.setAdapter(mSpinner);

mais il reste toujours noir. Comment puis-je changer la flèche et le texte du spinner en blanc tout en conservant le même thème pour le style déroulant que vous obtiendriez avec le thème Light?

Correction de la flèche de mise à jour 4.4:

Le seul moyen pour que la flèche devienne blanche est d'ajouter le spinner par programme et non en xml pour qu'il ressemble à ceci

final ArrayAdapter spinnerAdapter = ArrayAdapter.createFromResource(getSupportActionBar().getThemedContext(),
        R.array.main_navigation_list, R.layout.spinner_text);
spinnerAdapter.setDropDownViewResource(R.layout.spinner_dropdown_item);
mNavigationTags = getResources().getStringArray(R.array.main_navigation_list);


mNavigationSpinner = new Spinner(getSupportActionBar().getThemedContext());
mNavigationSpinner.setAdapter(spinnerAdapter);

mNavigationSpinner.setOnItemSelectedListener(this);
mToolbar.addView(mNavigationSpinner)
18
tyczj

Lorsque vous créez le arrayadapter, vous devez faire getApplicationContext au lieu de ceci:

SpinnerAdapter mSpinner = ArrayAdapter.createFromResource(getApplicationContext(), R.array. action_bar_spinner, Android.R.layout.simple_spinner_dropdown_item);

Créez un nouveau fichier de mise en page:

<CheckedTextView xmlns:Android="http://schemas.Android.com/apk/res/Android"
                 Android:id="@Android:id/text1"
                 style="?android:attr/spinnerDropDownItemStyle"
                 Android:singleLine="true"
                 Android:layout_width="match_parent"
                 Android:layout_height="?android:attr/listPreferredItemHeight"
                 Android:ellipsize="Marquee"
                 Android:textColor="#000000"/>

Modifiez ensuite votre code en ceci:

ArrayAdapter mAdapter = ArrayAdapter.createFromResource(getApplicationContext(), R.array. action_bar_spinner, Android.R.layout.simple_spinner_dropdown_item);
        mAdapter.setDropDownViewResource(R.layout.spinner_dropdown_item);
        mode.setAdapter(mAdapter);

Avez-vous essayé de mettre le spinner dans le fichier xml comme ceci:

<Android.support.v7.widget.Toolbar
        Android:id="@+id/toolbar"
        Android:layout_height="?attr/actionBarSize"
        Android:layout_width="match_parent"
        Android:background="?attr/colorPrimary">

    <Spinner
            Android:id="@+id/spinner_nav"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content" />

</Android.support.v7.widget.Toolbar>

Et désactivez également le titre comme ceci:

Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayShowTitleEnabled(false);

La réponse est de Chris Banes: https://stackoverflow.com/a/26511653/27677

8
Kevin van Mierlo

Kevin est dans la bonne direction, mais la vraie réponse n'est pas d'utiliser le contexte de l'application mais le contexte déjà thématique de la barre d'action elle-même. Ceci est en fait mentionné dans la documentation mais il n'obtient pas autant d'importance tout au long:

Lorsque vous gonflez quelque chose à afficher dans la barre d'actions (tel qu'un adaptateur Spinner pour la navigation dans la liste dans la barre d'outils), assurez-vous d'utiliser le contexte thématique de la barre d'actions, récupéré via getSupportActionBar (). GetThemedContext ().

9
Gábor