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
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
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.
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 .
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>
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>
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 : "";
}
}
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);
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
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ß
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);
Ein einfacher Weg, der nicht perfekt, aber für 4.x und 5.0 einheitlich genug ist
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).
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:
Ich hoffe es hilft! :)
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
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>
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.
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);
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!
<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>
<?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" -->
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
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>
<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.
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>
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!
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"/>
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.