Подтвердить что ты не робот

Как я могу исправить стиль Spinner для Android 4.x, размещенный поверх панели инструментов

В соответствии с Документация для Android стиль Material Design поддерживается для виджета Spinner.

Поэтому я решил использовать его в своем приложении, разместив его поверх панели инструментов.

макет /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);
    }
}

На Linneripop spinner и dropdown отлично смотрится, хотя выпадающий фон имеет черный цвет по сравнению с выпадающим меню, который является белым. Я думаю, что 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 влияет на значок фильтра spinner. Если кто-то узнает, как использовать это для 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 с черным фоном и белым текстом, но я думаю, что это можно решить с помощью настраиваемого макета. Если никто не даст полного ответа, я сделаю это сам и отметю как принятый.

4b9b3361

Ответ 1

Я знаю, что это поздно, но я столкнулся с этим вопросом, когда сам столкнулся с этой проблемой, и нашел решение в BrowseSessionsActivity приложение Google I/O 2014 и адаптировано. Я также разместил это в сообщении .

Макеты

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

Ответ 2

Извините за моего бедного английского.:) Я думаю, что лучше создать прядильщик на панели инструментов.

Вот пример в моем фрагменте.

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

Ответ 3

Не используйте Spinner в 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);

Таким образом, значок рядом с spinner будет белым

Ответ 4

Я борюсь с одной и той же проблемой.

Попробуйте изменить ресурс просмотра выпадающего списка. По крайней мере, это фиксировало проблему цвета текста для меня - однако цвет значка стрелки все еще темный. Так что это всего лишь частичное обходное решение.

setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

Ответ 5

Я потратил два дня на эту проблему, но теперь, прочитав много ответов, я могу опубликовать свое решение. Я реализовал два пользовательских макета для элемента spinner и всплывающего окна. Установка этого атрибута для 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 hereenter image description hereenter image description here

Надеюсь, это поможет!:)

Ответ 6

Простой способ, который не является совершенным, но достаточно однородным как для 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 исправить эти проблемы (здесь все равно надеяться).

Ответ 7

Вы не можете это сделать?

Пользовательский xml файл для элемента spinner: 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);

Затем удалите раскрывающийся ресурс.

Ответ 8

Используйте свойство android: dropDownVerticalOffset внутри spinner, чтобы задать расстояние сверху.

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

Не забывайте устанавливать андроид: spinnerMode = "dropdown" , хотя он не будет работать в spinnerMode= в диалоговом окне

Ответ 9

Для правильной тонировки значков 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 к панели инструментов в своей деятельности:

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 для всего Spinner, включая раскрывающееся меню. Следовательно, значок и текст Spinner будут правильно окрашены, но выпадающее меню также имеет стиль панели инструментов, а не popupTheme.

Итак, если вы хотите иметь темную панель инструментов и раскрывающееся меню с подсветкой, вам нужно будет как-то исправить стиль выпадающего меню, например, создав собственный стиль для счетчика, который задает белый фон и настраиваемый раскрывающийся список с помощью темный цвет текста.

Возможно, у кого-то есть лучшее решение о том, как приложение: popupTheme может быть распространено в раскрывающемся меню Spinner.

Ответ 10

Вы можете исправить положение выпадающего списка (будет отображаться в верхней части панели инструментов, например меню) для Android 4 с помощью этого кода:

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

Ответ 11

Была ли та же самая проблема с spinner

Что я сделал, так это добавить пользовательскую тему в spinner

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

Ответ 12

Чтобы понять это, у меня были подобные проблемы. Моя основная проблема заключалась в том, что текст на моей панели инструментов был меньше, чем обычные размеры заголовка и неправильный цвет. Снимок экрана здесь http://s27.postimg.org/v24x1aw43/Screen_Shot_2015_01_11_at_13_36_04.png

Выпадающее меню было в порядке, но я также смогу выполнить настройку.

Позвольте мне также пояснить, что это исправление в основном основано на исправлении @Daniel B, однако не требует пользовательского адаптера, насколько я могу сказать, что ничего не сломано, но я не даю никаких гарантий!

  • Добавить нормальный элемент spinner в файл макета 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. Создайте новый файл макета 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);

Это в основном это, результат здесь [не может прикрепить изображение или добавить другую ссылку, так как моя репутация слишком низкая! Добавить комментарий] , Вы можете остановиться здесь, однако вы можете изменить цвет стрелки раскрывающегося списка.

Технически это правильная тонировка для моего приложения, однако, поскольку мой основной цвет уже является цветом для панели инструментов, было бы целесообразно настроить стрелку.

Настройка пользовательской стрелки

Запуск этого приведет к появлению двух стрелок, белой стрелки и темы по умолчанию. Чтобы решить эту проблему, добавьте стиль ниже. Снова это вытащили из кода Даниэля Б. и, вероятно, можно было бы сократить, но пока это работает....

    <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. Примените созданный стиль к счетчику...
<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>

В результате будет что-то вроде этого [снова нельзя присоединить или ссылку, добавить комментарий]. Отступ может быть установлен из настройки файла ранее, в моем случае мне нужно будет изменить стрелку, чтобы она соответствовала значкам.

Надеюсь, что это какой-то смысл.

Ответ 13

Когда я использовал 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);

Ответ 14

Я потратил несколько часов на эту проблему. Насколько я могу судить, для вышеупомянутых решений требуется копирование/вставка больших фрагментов кода стиля 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>

Ответ 15

Я решил это, создав новые значения для версий 21 и 23 и добавив новый атрибут в стиле spinner android: dropDownVerticalOffset и удалив его из файла стиля по умолчанию. (мой случай не связан с панелью инструментов) для обычного счетчика.

Добавьте этот стиль в папки 23 и 21

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

Он отлично работает на всех версиях. Надеюсь, это сработает!