如何修复Android 4.x上放置在工具栏顶部的Spinner样式问题

49
根据Android文档,Material Design风格支持Spinner小部件。
因此,我决定在我的应用程序中使用它,并将其放置在工具栏顶部。 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>

活动主题

<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);
    }
}
在 Lollipop 系统中,下拉框和下拉列表看起来都很好,尽管与菜单下拉列表为白色相比,下拉框的背景颜色为黑色。我猜测app:popupTheme="@style/ThemeOverlay.AppCompat.Light"没有传播到下拉框。

Android 5.0

enter image description hereenter image description here

现在关键问题是在 Android 4.x 中,下拉框的背景颜色为白色(是否传播popupTheme?),并且旁边的图标为黑色。

Android 4.4

enter image description here

我该如何在 XML 中设置它或在代码中实现它以使其在 Android 5 和 4 上均可使用?理想情况下,我希望两者都像在 Android 5 上一样,但下拉框是白色的(就像设置菜单下拉列表一样)。

更新

我注意到设置属性colorControlNormal会影响选项框的筛选图标。如果有人发现如何将其用于下拉框(而不更改其他内容控件),那么我将把这个结果与 @Sven 的答案结合起来。

更新

以下更改修复了下拉框文本和弹出颜色的问题。因此,最终解决方案的唯一问题是筛选图标。

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

更新

我发现筛选图标实际上是下拉菜单控件指定的android:background的一部分,而且它是透明的。提供自定义的背景可以解决这个问题,例如:

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

问题解决了!

谜题的最后一块拼图是Android 5上的弹出窗口,它有黑色背景和白色文本,但我猜可以通过自定义布局来解决。如果没有人提供完整的答案,我会自己完成并将其标记为已采纳。


尝试使用getSupportActionBar().getThemedContext()而不是mToolbar.getContext() - Selvin
@Loop 我也遇到了同样的问题,你找到解决方案了吗? - Nathan Walters
@Loop 我曾经也遇到过同样的问题,后来发现将AppCompat从21.0.0更新到21.0.2可以解决Spinner筛选图标颜色的问题。我还通过使用自定义布局解决了其他问题。 - Andrey Makarov
你是如何在低于SDK 21的环境下编译这个程序的?我尝试使用工具栏和Eclipse,但要求最低SDK为21,一旦设置了这个值,它就只能在21上编译。你能否发布你的清单文件? - Sauron
我该如何让选项卡与Android 4和5兼容? - Sauron
显示剩余4条评论
15个回答

65

虽然我知道已经晚了,但是当我自己遇到这个问题时,我在BrowseSessionsActivity中的Google I/O 2014 app找到了解决方案,并进行了适应。

布局

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 绘图。

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

将Spinner添加到您的工具栏中

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

结果

Material Spinner

KitKat Spinner


1
还不晚 :) 我想补充一下,toolbar_spinner.xml 不是必需的。你可以把 <Spinner /> 放在 <Toolbar /> 里面。这样你就不需要容器膨胀和额外的三角形可绘制对象了。Spinner 将使用默认的可绘制对象。 - bajicdusko
我认为这在Gingerbread上失败了,错误信息如下:... Caused by: android.content.res.Resources$NotFoundException: Resource is not a Drawable (color or path): TypedValue{t=0x2/d=0x101030e a=2},其中0x101030e似乎是http://developer.android.com/reference/android/R.attr.html#selectableItemBackground - 尽管在styles.xml中删除对?android:selectableItemBackground的使用会导致一些UI问题。 - aleb
6
在lolipop上那不太好用。那里的背景很暗:/ - Jacek Kwiecień
2
@Xylian:在您的下拉列表组件中添加 android:theme="@style/ThemeOverlay.AppCompat.Light",这对我很有帮助。我已经编辑了答案,反映了我的最后两个评论。 - Huby
我遇到了这个错误:android:overlapanchor requires api 21 (current min is 15). 这是真的吗?只有在最低api为21及以上时才能正常工作吗? - Rock Lee
显示剩余7条评论

7
不要在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);

这样,旋转图标旁边的图标将会变成白色。


1
这就是正确的方式! - Langusten Gustel

6

非常抱歉我的英语不太好。 :) 我认为直接在工具栏中创建旋转器会更好。

以下是我片段中的一个示例。

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

在我的安卓4.1设备上看起来很好: 安卓4.1下拉框


这些类在appcompat v22.2中不存在。 - LOG_TAG
一旦您执行了 *mToolbar.removeView(mSpinner);*,在使用导航抽屉的片段中,您是否能够再次在工具栏上查看它? - LOG_TAG
1
@LOG_TAG 它是为导航抽屉设计的,当您将其更改为另一个片段时,您将看不到旋转器。 - Miao1007
@Miao1007 是的!! 但是当再次点击相同的片段时,无法使其可见,我已经将旋转器布局注入到工具栏中 toolbar.addView(spinnerContainer, lp); (参考Daniel B Ans),在这种情况下它不起作用,很快会向您发布github代码链接,谢谢。 - LOG_TAG
@LOG_TAG 哦... 这里有一个示例 code,祝你好运。 - Miao1007
显示剩余3条评论

3
我花了两天时间解决这个问题,但是现在在阅读了许多答案后,我可以发布我的解决方案。我为旋转器项和弹出窗口实现了两个自定义布局。为旋转器设置以下属性:android:background="?android:selectableItemBackground",默认的旋转器黑色箭头将被隐藏,我们可以使用自己喜欢的内容。我使用setDropDownVerticalOffset(int)方法来管理在Lollipop Android版本之前的弹出窗口位置。
我的应用全局主题是:
<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);
    }
}

这是Lollipop和Kitkat的结果: enter image description here enter image description here enter image description here 希望这有所帮助! :)

3

我正在为同样的问题苦苦挣扎。

尝试更改下拉视图资源。至少,这为我解决了文本颜色问题 - 但箭头图标颜色仍然很暗。因此,这只是一个部分性的解决方法。

setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

我已经尝试过了,但只有半成功。无论如何,我正在寻找完整的解决方案。我实际上有一个想法可以尝试,如果有效的话,我会在这里发布它。 - Damian Petla
我发现将“colorControlNormal”设置为某种颜色会改变筛选器图标的颜色。然而,它也会改变应用程序内容中的其他控件。因此,现在的挑战是将该属性应用于工具栏上的下拉菜单。将该属性应用于工具栏样式不起作用。 - Damian Petla

3

一个简单的方法,虽然不完美,但足够统一适用于4.x和5.0版本。

img

我从布局文件中删除了<Spinner>并以编程方式添加它 - 这使白色三角形能够正确显示。

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

请注意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库修复这些问题(无论如何希望如此)之前,它已经足够好了。


2
在Spinner中使用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="dropdown",即使在spinnerMode= dialog中它也无法工作。


1
Can you not do this? (你能不能不要这样做?)
自定义Spinner条目的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"
    />

使用这个来显示 spinner 项目:
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.your_spinner,list);

然后移除下拉资源。

它没有按照我的预期工作。它只是改变了文本部分,看起来非常糟糕。外观可以调整,但过滤器图标保持不变。 - Damian Petla

1

我遇到了与下拉框相同的问题

我所做的是为下拉框添加一个自定义主题

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

sp 用于文本大小,因此 => android:layout_height="30dp" 或更好的 android:layout_height="@dimen/my_size" - letroll

0

当我使用Spinner时,它会崩溃(Android 2.3.3 - 2.3.7)。

所以我现在尝试使用TintSpinner,它不会崩溃。你也可以尝试作为一个可选的解决方案。

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

1
我不鼓励任何人使用这种方法。TintSpinner是一个内部小部件,很快就会发生变化。我们的想法是将内部小部件发布为公共小部件,因此API将进行几个修改(例如,TintSpinner将被称为简单的Spinner)。除非您计划坚持使用当前的AppCompat库版本和所有其错误,否则请务必避免使用此方法。 - mradzinski
@mradzinski,感谢您的解答,但是当我使用Spinner时,我的应用程序在(Android 2.3.3-2.3.7)中崩溃了。但是当我使用TintSpinner时,在(Android 2.3.3-2.3.7)中它没有崩溃。我仍然不明白为什么会发生这种情况,这里我只是尝试提供一个可选的解决方案。 - IshRoid

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接