wake-up-neo.com

Wie kann ich den Spinner-Stil für Android 4.x über der Symbolleiste festlegen?

Laut Android-Dokumentation wird der Material Design-Stil für das Spinner-Widget unterstützt.

Also 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);
    }
}

Auf Lollipop sieht Spinner und Dropdown gut aus, obwohl die Dropdown-Hintergrundfarbe schwarz ist, verglichen mit der Menü-Dropdown-Farbe weiß. Ich vermute, dass app:popupTheme="@style/ThemeOverlay.AppCompat.Light" Nicht auf den Spinner übertragen wird.

Android 5.0

enter image description hereenter image description here

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

Android 4.4

enter image description here

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

Update

Mir ist aufgefallen, dass sich das Festlegen der Eigenschaft colorControlNormal auf das Filtersymbol des Drehfelds auswirkt. 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.

Update

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(getSupportActionBar().getThemedContext(),
                R.array.planets_array, R.layout.support_simple_spinner_dropdown_item);
        adapter.setDropDownViewResource(Android.R.layout.simple_spinner_dropdown_item);

Update

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

<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.

49
Damian Petla

Ich weiß, dass dies spät ist, aber ich bin auf diese Frage gestoßen, als ich selbst auf dieses Problem gestoßen bin und eine Lösung in BrowseSessionsActivity der Google I/O 2014 App gefunden und angepasst habe .

Layouts

toolbar_spinner.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="wrap_content"
    Android:layout_height="match_parent"
    Android:orientation="vertical">

    <Spinner
        Android:id="@+id/toolbar_spinner"
        style="@style/Widget.MyApp.HeaderBar.Spinner"
        Android:layout_width="wrap_content"
        Android:layout_height="match_parent"/>

</LinearLayout>

toolbar_spinner_item_actionbar.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="200dp"
    Android:layout_height="wrap_content"
    Android:orientation="vertical">

    <TextView
        Android:id="@Android:id/text1"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:drawablePadding="8dp"
        Android:drawableRight="@drawable/spinner_triangle"
        Android:fontFamily="sans-serif"
        Android:paddingLeft="16dp"
        Android:paddingRight="4dp"
        Android:textColor="#ffffffff"
        Android:textSize="18dp"
        Android:textStyle="bold"/>

</LinearLayout>

Das Drawable spinner_triangle Finden Sie hier .

toolbar_spinner_item_dropdown.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="200dp"
    Android:layout_height="wrap_content"
    Android:orientation="vertical">

    <TextView
        Android:id="@Android:id/text1"
        Android:layout_width="match_parent"
        Android:layout_height="48dp"
        Android:drawablePadding="8dp"
        Android:gravity="center_vertical|start"
        Android:paddingLeft="16dp"
        Android:paddingRight="16dp"
        Android:textColor="#ff333333"
        Android:textSize="16sp"/>

</LinearLayout>

Stile

toolbar_spinner.xml Verwendet den folgenden Stil.

<style name="Widget.MyApp.HeaderBar.Spinner" parent="Widget.AppCompat.Light.Spinner.DropDown.ActionBar">
        <item name="Android:background">?android:selectableItemBackground</item>
        <item name="Android:dropDownSelector">?android:selectableItemBackground</item>
        <item name="Android:divider">@null</item>
        <item name="Android:overlapAnchor">true</item>
</style>

Adapter

Dieser Adapter muss geändert werden, um Ihren eigenen Anforderungen zu entsprechen. getTitle() gibt den Text für jedes im Drehfeld angezeigte Element zurück.

private class YourObjectSpinnerAdapter extends BaseAdapter {
    private List<YourObject> mItems = new ArrayList<>();

    public void clear() {
        mItems.clear();
    }

    public void addItem(YourObject yourObject) {
        mItems.add(yourObject);
    }

    public void addItems(List<YourObject> yourObjectList) {
        mItems.addAll(yourObjectList);
    }

    @Override
    public int getCount() {
        return mItems.size();
    }

    @Override
    public Object getItem(int position) {
        return mItems.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getDropDownView(int position, View view, ViewGroup parent) {
        if (view == null || !view.getTag().toString().equals("DROPDOWN")) {
            view = getLayoutInflater().inflate(R.layout.toolbar_spinner_item_dropdown, parent, false);
            view.setTag("DROPDOWN");
        }

        TextView textView = (TextView) view.findViewById(Android.R.id.text1);
        textView.setText(getTitle(position));

        return view;
    }

    @Override
    public View getView(int position, View view, ViewGroup parent) {
        if (view == null || !view.getTag().toString().equals("NON_DROPDOWN")) {
            view = getLayoutInflater().inflate(R.layout.
                    toolbar_spinner_item_actionbar, parent, false);
            view.setTag("NON_DROPDOWN");
        }
        TextView textView = (TextView) view.findViewById(Android.R.id.text1);
        textView.setText(getTitle(position));
        return view;
    }

    private String getTitle(int position) {
        return position >= 0 && position < mItems.size() ? mItems.get(position).title : "";
    }
}

Hinzufügen des Drehfelds zu Ihrer Symbolleiste

Toolbar toolbar = getActionBarToolbar();

View spinnerContainer = LayoutInflater.from(this).inflate(R.layout.toolbar_spinner,
        toolbar, false);
ActionBar.LayoutParams lp = new ActionBar.LayoutParams(
        ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
toolbar.addView(spinnerContainer, lp);

YourObjectSpinnerAdapter spinnerAdapter = new YourObjectSpinnerAdapter();
spinnerAdapter.addItems(getMyObjectSpinnerData());

Spinner spinner = (Spinner) spinnerContainer.findViewById(R.id.toolbar_spinner);
spinner.setAdapter(spinnerAdapter);

Ergebnis

Material Spinner

KitKat Spinner

66
Dan

Tut mir leid für mein schlechtes Englisch. :) Ich denke, es ist besser, das Drehfeld direkt in der Symbolleiste zu erstellen.

Hier ist ein Beispiel in meinem Fragment.

public class Testfragment1 extends Fragment {

    Toolbar mToolbar;
    Spinner mSpinner;
    .....

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
        .......                  
        mToolbar = (Toolbar) getActivity().findViewById(R.id.toolbar);
        //you can also set the style with the constructor
        mSpinner = new Spinner(getActivity());
        String[] frags = new String[]{
                "category1",
                "category2",
                "category3",
        };
        ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(getActivity(),Android.R.layout.simple_list_item_1,frags);
        mSpinner.setAdapter(arrayAdapter);
        mToolbar.addView(mSpinner);
        return inflater.inflate(R.layout.fragment_testfragment1, container, false);
    }

    .........

    @Override
    public void onDestroyView() {
        super.onDestroyView();
        if (mToolbar != null && mSpinner != null) {
            mToolbar.removeView(mSpinner);
        }
    }
}

Auf meinem Android-4.1-Gerät sieht es gut aus: Android-4.1-spinner

6
Miao1007

Implementiere Spinner nicht in Xml

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);

Auf diese Weise wird das Symbol neben dem Drehfeld weiß

6
user3461233

Ich habe mit genau dem gleichen Problem zu kämpfen.

Versuchen Sie, die Dropdown-Ansichtsressource zu ändern. Zumindest wurde das Problem mit der Textfarbe für mich behoben - die Pfeilsymbolfarbe ist jedoch immer noch dunkel. Das ist also nur eine teilweise Problemumgehung.

setDropDownViewResource(Android.R.layout.simple_spinner_dropdown_item);
3
Sven

Ein einfacher Weg, der nicht perfekt, aber für 4.x und 5.0 einheitlich genug ist

img

Ich entfernte das <Spinner> aus den Layout-Dateien und fügte es programmgesteuert hinzu - so konnte das weiße Dreieck ordnungsgemäß angezeigt werden.

Ich habe auch ein Dropdown-Element-Layout mit der von der App benötigten Farbe erstellt.

layout/spinner_dropdown_item.xml, beachte das Android:background="@color/primaryColor"

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:Android="http://schemas.Android.com/apk/res/Android"
      Android:id="@Android:id/text1"
      Android:layout_width="match_parent"
      Android:layout_height="wrap_content"
      Android:textAppearance="?android:attr/textAppearanceListItemSmall"
      Android:gravity="center_vertical"
      Android:paddingLeft="12dp"
      Android:paddingRight="12dp"
      Android:background="@color/primaryColor"
      Android:minHeight="?android:attr/listPreferredItemHeightSmall" />

Und in der Aktivität:

    SpinnerAdapter spinnerAdapter = ArrayAdapter.createFromResource(getApplicationContext(), R.array.your_array, R.layout.spinner_dropdown_item);
    Spinner navigationSpinner = new Spinner(getSupportActionBar().getThemedContext());
    navigationSpinner.setAdapter(spinnerAdapter);
    toolbar.addView(navigationSpinner, 0);

Es ist nicht perfekt und die Elemente werden nicht hervorgehoben, wenn Sie darauf klicken, aber es ist gut genug, während wir darauf warten, dass die zukünftigen appcompat-Bibliotheken diese Probleme beheben (wir hoffen es trotzdem).

3
Mendhak

Ich habe zwei Tage mit diesem Problem verbracht, aber jetzt, nachdem ich viele Antworten gelesen habe, kann ich meine Lösung posten. Ich habe zwei benutzerdefinierte Layouts für das Drehfeldelement und das Popup implementiert. Festlegen dieses Attributs für Spinner: Android:background="?android:selectableItemBackground" Der Standardspinner-Schwarzpfeil ist ausgeblendet und wir können das verwenden, was wir bevorzugen. Ich habe die Methode setDropDownVerticalOffset (int) verwendet, um die Popup-Position bei früheren Lollipop Android Versionen) zu verwalten.

Mein globales App-Thema ist

<style name="AppTheme" parent="AppTheme.Base">

</style>

<style name="AppTheme.Base" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="colorPrimary">@color/primary</item>
    <item name="colorPrimaryDark">@color/primary_dark</item>
    <item name="colorAccent">@color/accent</item>
    <item name="Android:windowBackground">@color/window_background</item>
</style>

Nun das Aktivitätslayout mit der Symbolleiste und dem Drehfeld:

activity_main.xml

<RelativeLayout
    Android:layout_width="match_parent" 
    Android:layout_height="match_parent"

    Android:clickable="true" >

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

            <Spinner 
                Android:id="@+id/spinner_rss"
                Android:layout_width="wrap_content"
                Android:layout_height="wrap_content"
                Android:theme="@style/ThemeOverlay.AppCompat.Light"
                Android:background="?android:selectableItemBackground" />

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

custom_spinner_toolbar.xml

<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent" >

<TextView
    Android:id="@+id/spinner_item_text"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:layout_centerVertical="true"
    Android:singleLine="true"
    Android:textColor="@Android:color/white"
    Android:textAppearance="@style/TextAppearance.AppCompat.Title"
     />

<ImageView
    Android:contentDescription="@string/content_description_arrow_dropdown"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:layout_toRightOf="@+id/spinner_item_text"
    Android:layout_toEndOf="@+id/spinner_item_text"
    Android:paddingTop="6dp"
    Android:src="@drawable/ic_arrow_drop_down_white_24dp" />

</RelativeLayout>

custom_spinner_dropdown_item.xml

<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
    Android:orientation="vertical" >

    <CheckedTextView
        Android:id="@+id/spinner_item_text"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:padding="16dp"
        Android:singleLine="true"
        Android:textColor="@Android:color/black"
        Android:textSize="16sp" />

</LinearLayout>

SpinnerAdapter.Java

public class SpinnerAdapter extends BaseAdapter
{
   private Context mContext;
   private List<String> mValuesList;

   public SpinnerAdapter(Context mContext, List<String> mValuesList)
   {
       this.mContext = mContext;
       this.mValuesList = mValuesList;
   }

   @Override
   public int getCount() 
   {
       return mValuesList.size();
   }

   @Override
   public Object getItem(int position) 
   {
       return mValuesList.get(position);
   }

   @Override
   public long getItemId(int position) {
       // TODO Auto-generated method stub
       return 0;
   }

   @Override
   public View getDropDownView(int position, View view, ViewGroup parent) 
   {
      if (view == null || !view.getTag().toString().equals("DROPDOWN")) 
      {
         LayoutInflater inflater = LayoutInflater.from(mContext);
         view = inflater.inflate(R.layout.custom_spinner_dropdown_item, parent, false);
         view.setTag("DROPDOWN");
      }

      TextView textView = (TextView) view.findViewById(R.id.spinner_item_text);
      textView.setText(getTitle(position));

      return view;
  }

  @Override
  public View getView(int position, View view, ViewGroup parent) 
  { 
      if (view == null || !view.getTag().toString().equals("NON_DROPDOWN")) 
      {
         LayoutInflater inflater = LayoutInflater.from(mContext);
         view = inflater.inflate(R.layout.custom_spinner_toolbar, parent, false);
         view.setTag("NON_DROPDOWN");
      }

      TextView textView = (TextView) view.findViewById(R.id.spinner_item_text);
      textView.setText(getTitle(position));
      return view;
   }

   private String getTitle(int position) 
   {
      return position >= 0 && position < mValuesList.size() ?   mValuesList.get(position) : "";
   }
}

Schließlich der relevante Teil des Aktivitätsquellcodes:

@Override
protected void onCreate(Bundle savedInstanceState) 
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mToolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(mToolbar);

    final ActionBar actionBar = getSupportActionBar();
    actionBar.setDisplayShowTitleEnabled(false);
    actionBar.setHomeAsUpIndicator(R.drawable.ic_menu);
    actionBar.setDisplayHomeAsUpEnabled(true);

    mSpinner = (Spinner) findViewById(R.id.spinner_rss);

    String[] items = getResources().getStringArray(R.array.spinner_rss_items);
    List<String> spinnerItems = new ArrayList<String>();

    for(int i = 0; i < items.length; i++)
    {
        spinnerItems.add(items[i]);
    }

    SpinnerAdapter adapter = new SpinnerAdapter(actionBar.getThemedContext(), spinnerItems);
    mSpinner.setAdapter(adapter);

    if(Build.VERSION.SDK_INT < Build.VERSION_CODES.Lollipop)
    {
        mSpinner.setDropDownVerticalOffset(-116);
    }
}

Dies sind die Ergebnisse auf Lollipop und KitKat:

enter image description hereenter image description hereenter image description here

Ich hoffe es hilft! :)

3
giainel

Verwenden Sie die Eigenschaft Android: dropDownVerticalOffset im Drehfeld, um den Abstand von oben anzugeben.

<Spinner
        Android:id="@+id/spnrLanguage"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:layout_marginTop="5dp"
        Android:background="@drawable/ic_dropdown"
        Android:padding="5dp"
        Android:spinnerMode="dropdown"
        Android:dropDownVerticalOffset="50dp"
        />

Vergiss nicht, Android: spinnerMode = "dropdown" einzustellen, obwohl es in spinnerMode= dialog nicht funktioniert

1
Pranav

Hatte genau das gleiche Problem mit dem Spinner

Ich habe dem Spinner ein benutzerdefiniertes Thema hinzugefügt

 <Spinner
                Android:id="@+id/spinner1"
                Android:layout_width="match_parent"
                Android:layout_height="30sp"
                Android:entries="@array/guest_type"
                Android:Prompt="@string/guesttype"
                Android:theme="@style/AppTheme1"   />

styles.xml

  <style name="AppTheme1" parent="Theme.AppCompat.Light">
    <item name="Android:spinnerDropDownItemStyle">@style/mySpinnerItemStyle</item>
</style>

<style name="mySpinnerItemStyle" parent="@Android:style/Widget.Holo.DropDownItem.Spinner">
    <item name="Android:textColor">#000000</item>
</style>
1
coolswap11

Schaffst du das nicht?

Benutzerdefinierte XML-Datei für das Spinner-Element: your_spinner.xml:

<?xml version="1.0" encoding="utf-8"?>
<TextView  
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="match_parent" 
    Android:layout_height="wrap_content" 
    Android:textColor="#000"         
    Android:background="#FFF"
    />

Verwenden Sie diese Option, um Spinner-Elemente anzuzeigen:

ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.your_spinner,list);

Entfernen Sie dann die Dropdown-Ressource.

1
Lukos

Als ich Spinner benutzte, stürzte es ab (Android 2.3.3 - 2.3.7).

Also versuche ich, TintSpinner zu verwenden, jetzt stürzt es nicht ab. Versuchen Sie es selbst als optionale Lösung

 <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout
        xmlns:Android="http://schemas.Android.com/apk/res/Android"
        Android:layout_width="wrap_content"
        Android:layout_height="match_parent"
        Android:orientation="vertical">

        <Android.support.v7.internal.widget.TintSpinner
            Android:id="@+id/toolbar_spinner"
            style="@style/HeaderBar.Spinner"
            Android:layout_width="wrap_content"
            Android:layout_height="match_parent"/>
    </LinearLayout>

Verwenden Sie den folgenden Code, um Ihre Symbolleiste zu erstellen

 View spinnerContainer = LayoutInflater.from(this).inflate(R.layout.toolbar_spinner, toolbarTop, false);
        ActionBar.LayoutParams lp = new ActionBar.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.MATCH_PARENT);
        toolbarTop.addView(spinnerContainer, lp);

        ToolBarSpinnerAdapter spinnerAdapter = new ToolBarSpinnerAdapter(getLayoutInflater());
        String[] items = getResources().getStringArray(R.array.action_dropdown);
        spinnerAdapter.addItems(items);

        TintSpinner mNavigationSpinner = (TintSpinner) spinnerContainer.findViewById(R.id.toolbar_spinner);
        mNavigationSpinner.setAdapter(spinnerAdapter);
0
IshRoid

Um das herauszufinden, hatte ich ähnliche Probleme. Mein Hauptproblem war, dass der Text in meiner Symbolleiste kleiner war als die üblichen Titelabmessungen und die falsche Farbe. Screenshot hier http://s27.postimg.org/v24x1aw43/Screen_Shot_2015_01_11_at_13_36_04.png

Das Dropdown-Menü war in Ordnung, aber ich werde auch die Anpassung vornehmen.

Lassen Sie mich auch klarstellen, dass diese Korrektur hauptsächlich auf der Korrektur von @Daniel B basiert, jedoch keinen benutzerdefinierten Adapter benötigt, soweit ich feststellen kann, dass nichts kaputt ist, aber ich gebe keine Garantie!

  1. Fügen Sie der XML-Layoutdatei (in der Symbolleiste) ein normales Drehfeldelement hinzu.
<Android.support.v7.widget.Toolbar
        Android:id="@+id/toolbar"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:elevation="5dp"
        Android:minHeight="?attr/actionBarSize"
        Android:background="@color/colorPrimary"
        app:theme="@style/GalaxyZooThemeToolbarDarkOverflow"
        app:popupTheme="@style/Theme.AppCompat"
        >

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


    </Android.support.v7.widget.Toolbar>
  1. Neue Layoutdatei erstellen toolbar_spinner_item_actionbar.xml (Dies ist das Material, das für den Spinner in der Symbolleiste angezeigt wird.)
<?xml version="1.0" encoding="utf-8"?>

<TextView
    Android:id="@Android:id/text1"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:drawablePadding="20dp"
    Android:fontFamily="sans-serif"
    Android:paddingLeft="@dimen/abc_action_bar_default_padding_material"
    Android:paddingRight="4dp"
    Android:textColor="@color/colorDark"
    Android:textSize="@dimen/abc_text_size_title_material_toolbar"
    xmlns:Android="http://schemas.Android.com/apk/res/Android"/>

    <!-- Android:drawableRight="@drawable/spinner_triangle" -->
  1. Der Adapter für Ihren Spinner bleibt ziemlich gleich, jedoch ändern Sie das Layout vom Standard-Android.R.layout.simple_spinner_dropdown_item zu R.layout.toolbar_spinner_item_actionbar. Dadurch wird Ihr benutzerdefiniertes Aussehen für den Symbolleistentext übernommen.

In diesem Beispiel habe ich die adapter.setDropDownViewResource auf Android.R.layout.simple_spinner_dropdown_item gesetzt, dies wendet die Standarddesignvorgaben für die Dropdown-Liste an, mit der ich zufrieden bin.

ArrayAdapter<String> set1Adapter = new ArrayAdapter<String>(RoutineDetailsActivity.this, R.layout.toolbar_spinner_item_actionbar, set1Actual);
        set1Adapter.setDropDownViewResource(Android.R.layout.simple_spinner_dropdown_item);

        mWeekSpinner.setAdapter(set1Adapter);

Das ist im Grunde genommen das Ergebnis hier [Ich kann kein Bild anhängen oder einen anderen Link hinzufügen, da mein Repräsentant zu niedrig ist! Wird in Kommentar hinzufügen]. Sie könnten hier anhalten, möchten aber möglicherweise die Farbe des Dropdown-Pfeils ändern.

Technisch gesehen ist es die richtige Tönung für meine App. Da meine Primärfarbe jedoch bereits die Farbe für die Symbolleiste ist, ist es sinnvoll, den Pfeil anzupassen.

Benutzerdefinierten Pfeil zeichnen

  1. Fügen Sie diese ziehbare Linie 'Android: drawableRight = "@ drawable/spinner_triangle' in die zuvor erstellte toolbar_spinner_item_actionbar.xml ein. Dies kann ein beliebiges Bild sein. Sie können jetzt Daniel Bs Ressource für weiße Pfeile hier verwenden https: // raw.githubusercontent.com/google/iosched/master/Android/src/main/res/drawable-xxhdpi/spinner_triangle.png .

Wenn Sie dies ausführen, werden zwei Pfeile angezeigt, der weiße Pfeil und die Standardeinstellung für das Thema. Um dies zu lösen, fügen Sie den folgenden Stil hinzu. Auch dies ist aus Daniel Bs Code entnommen und könnte wahrscheinlich gekürzt werden, aber im Moment funktioniert es ....

    <style name="Widget.MyApp.HeaderBar.Spinner" parent="Widget.AppCompat.Light.Spinner.DropDown.ActionBar">
        <item name="Android:background">?android:selectableItemBackground</item>
        <item name="Android:dropDownSelector">?android:selectableItemBackground</item>
        <item name="Android:divider">@null</item>
        <item name="Android:overlapAnchor">true</item>
    </style>
  1. Übernehmen Sie den erstellten Stil auf den Spinner ...
<Android.support.v7.widget.Toolbar
        Android:id="@+id/toolbar"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:elevation="5dp"
        Android:minHeight="?attr/actionBarSize"
        Android:background="@color/colorPrimary"
        app:theme="@style/GalaxyZooThemeToolbarDarkOverflow"
        app:popupTheme="@style/Theme.AppCompat"
        >

    <Spinner
        Android:id="@+id/spinner_nav"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        style="@style/Widget.MyApp.HeaderBar.Spinner"/>


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

Das Ergebnis wird ungefähr so ​​aussehen [kann nicht angehängt oder verlinkt werden, wird zum Kommentar hinzugefügt]. Das Auffüllen kann über die Dateieinrichtung früher eingestellt werden. In meinem Fall müsste ich den Pfeil ändern, damit er mit den Symbolen übereinstimmt.

Ich hoffe, das ergibt einen Sinn.

0
user1544797

Ich habe Stunden mit diesem Thema verschwendet. Soweit ich das beurteilen kann, erfordern die obigen Lösungen alle das Kopieren/Einfügen großer Teile von AppCompat-Code, um grundlegende Details wie den Touch-Status neu zu implementieren.

Eine relativ einfache Möglichkeit, nativen Verhalten zu erhalten, besteht darin, die Ansicht programmgesteuert aufzublasen, um sicherzustellen, dass sie das richtige Thema erhält, z.

// Activity has context with 'Theme.AppCompat.Light.NoActionBar'
spinner = new AppCompatSpinner(getActivity());
toolbar.addView(spinner);

Damit das Dreieck weiß und nicht colorControlNormal ist, habe ich eine ColorStateList-Tönung auf den Hintergrund angewendet:

ViewCompat.setBackgroundTintList(spinner, resources.getColorStateList(R.drawable.bg_toolbar_spinner)

bg_toolbar_spinner.xml

<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <item Android:color="@color/accent" Android:state_pressed="true"/>
    <item Android:color="@Android:color/white"/>
</selector>
0
user3452758

Ich habe es gelöst, indem ich neue Werte für Version 21 und 23 erstellt und neue Attribute im Spinner-Stil hinzugefügt habe Android: dropDownVerticalOffset und es aus der Standard-Style-Datei gelöscht habe. (mein Fall bezieht sich nicht auf die Symbolleiste es ist für normale Spinner.

Fügen Sie diesen Stil in den Ordnern 23 und 21 hinzu

<style name="spinner_style">
    <item name="Android:background">@drawable/background_spinner</item>
    <item name="Android:dropDownVerticalOffset">30dip</item>
</style>

Es funktioniert perfekt auf allen Versionen. Hoffe das klappt bei dir!

0

Sie können die Dropdown-Position (wird wie im Menü oben in der Symbolleiste angezeigt) für Android 4 mit folgendem Code festlegen:

<Spinner
        Android:id="@+id/spinner"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:dropDownVerticalOffset="-56dp"/>
0
Stanislav

Für eine korrekte Tönung der Spinner-Symbole können Sie den Spinner auch einfach über den Code aufpumpen:

spinner_toolbar.xml:

<?xml version="1.0" encoding="utf-8"?>
<Spinner xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:id="@+id/spinner_toolbar"
    Android:layout_width="wrap_content"
    Android:layout_height="match_parent"/>

Dann müssen Sie den Spinner in Ihrer Aktivität an die Symbolleiste anhängen:

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

// we inflate the spinner with the themed Toolbar context -> correct icon tinting
LayoutInflater.from(getSupportActionBar().getThemedContext()).inflate(R.layout.spinner_toolbar, tb, true);

Spinner spinner = (Spinner) toolbar.findViewById(R.id.spinner_toolbar);
spinner.setAdapter(adapter);

Dies verwendet jedoch das app: theme anstelle des app: popupTheme für den gesamten Spinner, einschließlich des Dropdown-Menüs. Daher werden das Spinner-Symbol und der Text korrekt eingefärbt, aber das Dropdown-Menü hat auch den Stil der Symbolleiste und nicht des popupTheme.

Wenn Sie also eine dunkle Symbolleiste und ein helles Dropdown-Menü haben möchten, müssen Sie den Dropdown-Stil irgendwie korrigieren, indem Sie beispielsweise einen benutzerdefinierten Stil für das Drehfeld erstellen, der einen weißen Hintergrund und eine benutzerdefinierte Dropdown-Ansicht mit dunkler Textfarbe angibt .

Vielleicht hat jemand anderes eine bessere Lösung, wie die App: popupTheme in das Spinner-Dropdown-Menü übertragen werden kann.

0