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

时间:2014-11-05 11:16:50

标签: android android-layout android-spinner android-toolbar

根据Android documentation,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);
    }
}

On Lollipop微调器和下拉列表看起来很好,虽然下拉背景颜色是黑色,而菜单下拉是白色。我想app:popupTheme="@style/ThemeOverlay.AppCompat.Light"不会传播给微调器。

Android 5.0

enter image description here enter image description here

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

Android 4.4

enter image description here

如何在XML中正确设置它或在代码中实现它以使其适用于Android 5和4?理想情况下,我希望在Android 5上都看起来像白色微调器下拉菜单(如设置菜单下拉菜单)。

更新

我注意到设置属性colorControlNormal会影响微调器的过滤器图标。如果有人发现如何在Spinner中使用它(不改变其他内容控件),那么我会将我的解决方案与@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上的弹出窗口,它有黑色背景和白色文字,但我想它可以用自定义布局解决。如果没有人提供完整的答案,我会自己做,并标记为已接受。

15 个答案:

答案 0 :(得分:66)

我知道这已经很晚了但是当我自己遇到这个问题时,我遇到了这个问题,我在BrowseSessionsActivityGoogle 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 drawable here

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

结果

Material Spinner

KitKat Spinner

答案 1 :(得分: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);
        }
    }
}

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

答案 2 :(得分:6)

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

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

答案 3 :(得分:3)

我正在努力解决同样的问题。

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

setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

答案 4 :(得分: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库来修复这些问题时,这已经足够了(这里仍然希望如此)。

答案 5 :(得分:3)

我花了两天时间解决这个问题,但现在看了很多答案后,我可以发布我的解决方案。我为微调项目和弹出窗口实现了两个自定义布局。为spinner设置此属性: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

希望它有所帮助! :)

答案 6 :(得分:1)

你能不这样做吗?

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

使用此选项显示微调项目:

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

然后删除下拉资源。

答案 7 :(得分: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>

答案 8 :(得分:1)

在微调器内使用 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 =&#34;下拉&#34; 虽然它无法在 spinnerMode中工作 = 对话

答案 9 :(得分:0)

对于正确的Spinner图标着色,您还可以从代码中膨胀微调器:

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

然后你必须将Spinner附加到Activity中的工具栏:

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

然而,这使用了app:theme而不是app:popupTheme用于整个Spinner,包括下拉菜单。 因此,Spinner图标和文本将正确着色,但下拉菜单也具有工具栏的样式,而不是popupTheme的样式。

因此,如果您想要一个黑暗的工具栏和一个光下拉菜单,您需要以某种方式修复下拉样式,例如为微调器创建一个指定白色背景的自定义样式和一个自定义下拉视图。深色文字颜色。

也许其他人有更好的解决方案如何将app:popupTheme传播到Spinner下拉菜单。

答案 10 :(得分:0)

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

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

答案 11 :(得分:0)

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

下拉菜单没问题,但我也会对其进行自定义。

我还要说清楚这个修复主要是基于@Daniel B的修复,但是不需要自定义适配器,据我所知,没有任何内容被破坏,但我不保证!

  1. 将正常的微调器项添加到XML布局文件中(在工具栏中)。
  2. <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. 创建新的布局文件toolbar_spinner_item_actionbar.xml(这将是工具栏中微调器的显示内容)
    2. <?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。这将应用工具栏文本的自定义外观。
      2. 在这个例子中,我将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. 添加此行drawable line&#39; android:drawableRight =&#34; @ drawable / spinner_triangle&#39;进入之前制作的toolbar_spinner_item_actionbar.xml。现在这可能是任何图像,现在你可以在这里使用Daniel B的白色箭头资源https://raw.githubusercontent.com/google/iosched/master/android/src/main/res/drawable-xxhdpi/spinner_triangle.png
        2. 运行此选项将产生两个箭头,白色箭头和主题默认值。要解决此问题,请添加以下样式。再次这是从丹尼尔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. 将创建的样式应用于微调器......
          2. <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>
            

            结果将是这样的[再次无法附加或链接,将添加到评论]。可以从之前的文件设置中设置填充,在我的情况下,我需要更改箭头以匹配图标。

            希望这有点道理。

答案 12 :(得分: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);

答案 13 :(得分:0)

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

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

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

为了使三角形变为白色而不是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>

答案 14 :(得分:0)

我通过为版本21和23创建新值并在微调器样式 android:dropDownVerticalOffset 中添加新属性并将其从默认样式文件中删除来解决它。 (我的情况与工具栏无关)它适用于普通的微调器。

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

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

它在所有版本上都能完美运行。希望这适合你!