我该如何修复放置在工具栏顶部的Android 4.x的微调器样式

根据Android文档 ,Spinner小部件支持Material Design样式。

所以我决定在我的应用程序中将它放在工具栏的顶部。

布局/ 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> 

活动主题

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

在棒棒糖微调和下拉菜单看起来不错,虽然下拉菜单背景颜色是黑色的比白色的菜单下拉菜单。 我猜那app:popupTheme="@style/ThemeOverlay.AppCompat.Light"不会传播给微调。

Android 5.0

在这里输入图像说明在这里输入图像说明

现在最大的问题是Android 4.x的下拉菜单背景颜色是白色的(popupTheme传播?),旁边的图标是黑色的。

Android 4.4

在这里输入图像说明

如何在XML中正确设置它,或者在代码中执行以使其在Android 5和4上都能正常工作? 理想情况下,我想两个看起来像在Android 5,但白色微调下拉(如设置菜单下拉菜单)。

更新

我注意到设置属性colorControlNormal影响微调colorControlNormal的filter图标。 如果有人发现如何使用Spinner(不改变其他内容控制),那么我会有我的解决scheme结合@Sven答案的发现。

更新

以下更改修复了微调文本和popup颜色的问题。 所以最终解决scheme唯一的问题是filter图标。

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

更新

我发现filter图标实际上是为微调框指定的android:background的一部分,它是透明的。 提供自己的背景可以解决它,例如

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

谜团已揭开!

最后一块拼图是Android 5上的popup窗口,它有黑色的背景和白色的文字,但我想可以用自定义的布局来解决。 如果没有人提供完整的答案,我会自己做,并标记为接受。

我知道这已经很晚了,但当我自己遇到这个问题时,我遇到了这个问题,我在Google I / O 2014应用程序的BrowseSessionsActivity中find了一个解决scheme,并对其进行了修改。 我也把它放在博客文章 。

布局

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> 

spinner_triangle drawable可以在这里find。

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使用以下样式。

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

适配器

此适配器将需要更改以符合您自己的需求。 getTitle()返回微调器中显示的每个项目的文本。

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

结果

材料微调器

KitKat微调

不要在Xml中实现Spinner

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

这样,微调器旁边的图标将变成白色

对不起,我英文很差。 :)我认为最好直接在工具栏中创build微调。

这是我的片段中的一个例子。

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

在我的android-4.1-device上看起来很好: android-4.1-spinner

我正在努力解决完全相同的问题。

尝试更改下拉视图资源。 至less,这固定了我的文字颜色问题 – 但箭头图标的颜色仍然是黑暗的。 所以这只是一个部分的解决方法。

 setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 

我在这个问题上花了两天的时间,但现在阅读了很多答案之后,我可以发布我的解决scheme。 我已经为微调项目和popup窗口实现了两个自定义布局。 设置此属性为微调: android:background="?android:selectableItemBackground"默认微调黑色箭头是隐藏的,我们可以使用我们喜欢的。 我使用方法setDropDownVerticalOffset(int)来pipe理Lollipop Android版本上的popup位置。

我的应用程序全球主题是

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

现在,包含工具栏和微调器的活动布局:

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) : ""; } } 

最后,活动源代码的相关部分:

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

这些是棒棒糖和奇巧的结果:

在这里输入图像说明在这里输入图像说明在这里输入图像说明

希望能帮助到你! 🙂

一个简单的方法是不完美的,但对于4.x和5.0都足够统一

IMG

我从布局文件中删除了<Spinner> ,并以编程的方式添加它 – 允许白色三angular形正确显示。

我还使用appcompat所需的颜色创build了一个下拉项目布局。

layout / spinner_dropdown_item.xml,注意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" /> 

在活动中:

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

这不是完美的,当你点击它们时,这些项目不会突出显示,但是当我们等待未来的appcompat库来解决这些问题时(这里是希望的),这已经足够了。

你不能这样做吗?

自定义xml文件的微调项目: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" /> 

使用它来显示微调项目:

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

然后删除下拉资源。

使用旋转工具内的android:dropDownVerticalOffset属性给顶部的间距。

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

不要忘记设置android:spinnerMode =“下拉”,虽然它不会在spinnerMode = 对话框中工作

对于正确的微调图标着色,你也可以从代码中微调微调器:

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

然后,您必须将微调器附加到您的活动中的工具栏:

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

但是,这使用的应用程序:主题,而不是应用程序:popupTheme整个微调,包括下拉菜单。 因此,微调图标和文本将被正确着色,但下拉菜单也具有工具栏的样式,而不是popupTheme。

所以如果你想要一个黑暗的工具栏和一个光照下拉菜单,你需要以某种方式修复下拉式样,例如通过为微调器创build一个自定义样式来指定一个白色背景和一个带有深色文字颜色的自定义下拉视图。

也许别人有更好的解决scheme,如何应用程序:popupTheme可以传播到微调下拉菜单。

您可以使用此代码修复Android 4的下拉位置(将显示在工具栏的顶部,如菜单):

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

对于微调者来说,也是一样的问题

我所做的是为微调添加一个自定义的主题

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

为了解决这个问题,我遇到了类似的问题。 我的主要问题是我的工具栏中的文字比通常的标题尺寸和错误的颜色要小。 这里的屏幕截图http://s27.postimg.org/v24x1aw43/Screen_Shot_2015_01_11_at_13_36_04.png

下拉菜单是好的,但我也会经历这个定制。

让我也明确这个修复是基于@丹尼尔B的修复,但不需要自定义适配器,据我所知,没有什么是坏的,但我不保证!

  1. 将一个正常的微调项目添加到XML布局文件(在工具栏中)。
 <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. 创build新的布局文件toolbar_spinner_item_actionbar.xml(这将显示在工具栏中的微调器的东西)
 <?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. 适配器为您的微调保持几乎相同,但切换从标准android.R.layout.simple_spinner_dropdown_item布局到R.layout.toolbar_spinner_item_actionbar。 这将应用您的自定义外观的工具栏文本。

在这个例子中,我将adapter.setDropDownViewResource设置为android.R.layout.simple_spinner_dropdown_item,这适用于我感到满意的下拉列表的标准主题默认值。

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

这基本上是这样,结果在这里[不能附加图像或添加另一个链接,因为我的代表太低了! 将添加评论]。 你可以在这里停下来,但是你可能想要改变下拉箭头的颜色。

从技术上讲,这是我的应用程序的正确设色,但是,因为我的主色已经是工具栏的颜色,所以自定义箭头是有意义的。

设置自定义箭头绘制

  1. 在这个toolbar_spinner_item_actionbar.xml中添加这行可绘制的行'android:drawableRight =“@ drawable / spinner_triangle'现在可以是任何图像,现在你可以使用Daniel B的白色箭头资源https://raw.githubusercontent。 com / google / iosched / master / android / src / main / res / drawable-xxhdpi / spinner_triangle.png 。

运行这将导致两个箭头,白色箭头和主题默认。 为了解决这个添加下面的样式。 再次,这是从丹尼尔B的代码拉,可能会删节,但现在它的作品….

  <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. 将创build的样式应用于微调器…
 <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> 

结果会是这样的[再次不能附加或链接,将添加到评论]。 填充可以从早期的文件设置,在我的情况下,我需要改变箭头来匹配图标。

希望有某种意义。

当我使用微调它崩溃(Android 2.3.3 – 2.3.7)。

所以我尝试使用TintSpinner现在它不会崩溃,试试你自己作为一个可选的解决scheme

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

并使用下面的代码来投射你的工具栏

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

我在这个问题上浪费了几个小时。 据我所知,上述解决scheme都需要复制/粘贴appcompat样式代码的大块重新实现基本的细节,如触摸状态。

获得类似本机的行为的一个相对简单的方法是以编程方式膨胀视图以确保它获得正确的主题,例如:

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

为了让三angular形变成白色,而不是colorControlNormal ,我已经将ColorStateList色调应用于背景:

 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> 

我解决了这个问题,为21和23版本创build新的值,并在微调样式android:dropDownVerticalOffset中添加新属性,并从默认样式文件中删除它。 (我的情况是不相关的工具栏)这是正常的微调。

将此样式添加到文件夹23和21中

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

它在所有版本上都能正常工作。 希望这与你合作!