Jak mogę naprawić styl Spinner dla Androida 4.x umieszczony na górze paska narzędzi

Zgodnie z dokumentacja Androida , styl projektowania materiału jest obsługiwany dla widżetu Spinner.

Więc zdecydowałem się użyć go w mojej aplikacji umieszczając go na górze paska narzędzi.

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>

Motyw aktywności

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

Na Lollipop spinner i rozwijane wygląda dobrze, chociaż rozwijane kolor tła jest czarny w porównaniu do rozwijanego menu, które jest białe. Chyba tak. app:popupTheme="@style/ThemeOverlay.AppCompat.Light" nie jest propagowany do wirnika.

Android 5.0

Tutaj wpisz opis obrazkaTutaj wpisz opis obrazka

Teraz duży problem jest z Androidem 4.X gdzie kolor tła rozwijanego jest biały(popuptheme propagowane?), a ikona obok spinnera jest czarna.

Android 4.4

Tutaj wpisz opis obrazka

Jak mogę ustawić go poprawnie w XML lub zaimplementować w kodzie, aby działał zarówno na Androidzie 5, jak i 4? Idealnie, chciałbym mieć oba wygląda jak na Androidzie 5 ale z białe rozwijane spinner (jak ustawienie menu rozwijanego).

Update

Zauważyłem, że ustawienie właściwości colorControlNormal wpływa na ikonę filtra spinnera. Jeśli ktoś dowie się, jak wykorzystać to do spinnera (bez zmieniania innych kontrolek treści), to miałbym moje rozwiązanie łączące to odkrycie z @Sven answer.

Update

Następująca zmiana rozwiązuje problem z tekstem spinnera i kolorem wyskakujących okienek. Więc jedynym problemem do ostatecznego rozwiązania jest ikoną filtra.

ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(getSupportActionBar().getThemedContext(),
                R.array.planets_array, R.layout.support_simple_spinner_dropdown_item);
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

Update

Odkryłem, że ikona filtra jest częścią android:background podaną dla spinnera i jest przezroczysta. Podanie własnego tła naprawiłoby to np.

<item name="android:background">?android:selectableItemBackground</item>
Tajemnica rozwiązana!

Ostatnim elementem układanki jest wyskakujące okienko na Androida 5, które ma czarne tło i biały tekst, ale myślę, że można to rozwiązać za pomocą niestandardowego układu. Jeśli nikt nie udzieli pełnej odpowiedzi, sam to zrobię i zaznaczę jako zaakceptowane.

Author: vandus, 2014-11-05

15 answers

Wiem, że jest późno, ale na to pytanie wpadłem, gdy sam napotkałem ten problem i znalazłem rozwiązanie w przeglądarkach z Aplikacji Google I / O 2014 i dostosowałem go.

Layouty

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>

The spinner_triangle drawable można znaleźć tutaj .

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>

Style

toolbar_spinner.xml używa następującego stylu.

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

Adapter

To adapter będzie musiał zostać zmieniony w celu dopasowania do własnych potrzeb. getTitle() zwraca tekst dla każdego elementu pokazanego w spinnerze.

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

Dodawanie spinnera do paska narzędzi

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

Wynik

Material Spinner

KitKat Spinner

 63
Author: Dan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-06 14:56:12

Nie implementuj spinnera w 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);

W ten sposób ikona obok spinnera będzie biała

 6
Author: user3461233,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-05 06:40:20

Przepraszam za mój biedny angielski. :) Myślę, że lepiej jest bezpośrednio utworzyć spinner w pasku narzędzi.

Oto przykład w moim fragmencie.

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);
        }
    }
}
Wygląda dobrze na moim urządzeniu z Androidem 4.1: android-4.1-spinner
 6
Author: Miao1007,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-16 02:10:37

Zmagam się z tym samym problemem.

Spróbuj zmienić zasób widoku rozwijanego. Przynajmniej naprawiło to problem z kolorem tekstu - jednak kolor ikony strzałki jest nadal ciemny. Więc to tylko częściowe obejście.

setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
 3
Author: Sven,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-05 13:53:32

Prosty sposób, który nie jest idealny, ale wystarczająco jednolity dla obu 4.x i 5.0

img

Usunąłem <Spinner> z plików układu i dodałem go programowo - co pozwoliło na prawidłowe wyświetlenie białego trójkąta.

Utworzyłem również układ elementów rozwijanych przy użyciu koloru wymaganego przez appcompat.

Layout / spinner_dropdown_item.xml, zwróć uwagę na 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" />

I w działaniu:

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

Nie jest idealny, a przedmioty nie podkreślają, gdy kliknij na nich, ale to wystarczy, gdy czekamy na przyszłe biblioteki appcompat, aby rozwiązać te problemy(tutaj i tak mam nadzieję).

 3
Author: Mendhak,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-01 13:08:25

Spędziłem dwa dni nad tym problemem, ale teraz, po przeczytaniu wielu odpowiedzi, mogę opublikować moje rozwiązanie. Zaimplementowałem dwa niestandardowe układy dla elementu spinner i popup. Ustawienie tego atrybutu dla spinnera: android:background="?android:selectableItemBackground" domyślna czarna strzałka jest ukryta i możemy używać tego, co preferujemy. Użyłem metody setDropDownVerticalOffset (int) do zarządzania pozycją popup w wersjach pre Lollipop Android.

My app global theme is

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

Teraz układ aktywności zawierający pasek narzędzi i spinner:

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

Wreszcie, odpowiednia część kodu źródłowego działania:

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

Oto wyniki na Lollipop i Kitkat:

Tutaj wpisz opis obrazkaTutaj wpisz opis obrazkaTutaj wpisz opis obrazka

Mam nadzieję, że to pomoże! :)
 3
Author: giainel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-25 15:07:58

Możesz tego nie robić?

Własny plik xml dla elementu 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"
    />

Użyj tego, aby wyświetlić elementy spinnera:

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

Następnie usuń rozwijany zasób.

 1
Author: Lukos,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-12 21:09:16

Miał dokładnie ten sam problem z spinnerem

To, co zrobiłem, to dodanie niestandardowego motywu do spinnera

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

Style.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>
 1
Author: coolswap11,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-08 10:36:32

Użyj właściwości Android:dropDownVerticalOffset wewnątrz spinnera, aby nadać odstępy od góry.

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

Nie zapomnij ustawić android: spinnerMode= "dropdown" chociaż nie będzie działać w spinnerMode= dialog

 1
Author: Pranav,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-22 11:27:08

Do poprawnego przyciemniania ikony spinnera możesz również po prostu nadmuchać spinner z kodu:

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

Następnie musisz dołączyć Spinner do paska narzędzi w swojej aktywności:

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

Jednak używa app: theme zamiast app: popupTheme dla całego spinnera, w tym rozwijanego menu. Dlatego ikona spinnera i tekst będą poprawnie pokolorowane, ale menu rozwijane ma również Styl paska narzędzi, a nie popupTheme.

Więc jeśli chcesz mieć ciemny pasek narzędzi i jasne menu rozwijane, musisz jakoś naprawić styl rozwijany, na przykład tworząc niestandardowy styl dla spinnera, który określa białe tło i niestandardowy widok rozwijany z ciemnym kolorem tekstu.

Może ktoś inny ma lepsze rozwiązanie, jak aplikacja: popupTheme może być propagowana do rozwijanego menu spinnera.

 0
Author: Alexander Oprisnik,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-27 18:27:15

Możesz naprawić pozycję rozwijaną (pojawi się na górze paska narzędzi, jak menu) dla Androida 4 za pomocą tego kodu:

<Spinner
        android:id="@+id/spinner"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:dropDownVerticalOffset="-56dp"/>
 0
Author: Stanislav,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-27 22:21:25

Żeby to zrozumieć, miałem podobne problemy. Moim głównym problemem był tekst w moim pasku narzędzi był mniejszy niż zwykłe wymiary tytułu i zły kolor. Zrzut ekranu tutaj http://s27.postimg.org/v24x1aw43/Screen_Shot_2015_01_11_at_13_36_04.png

Rozwijane menu było ok, ale przejdę do personalizacji tego, jak również.

Pozwól mi również wyjaśnić, że ta poprawka jest głównie oparta na fixie @ Daniel B, jednak nie wymaga niestandardowego adaptera, o ile mogę powiedzieć, że nic nie jest zepsute, ale nie daję żadnych gwarancji!

  1. Dodaj zwykły element spinner do pliku układu XML (w pasku narzędzi).
<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. Utwórz nowy pasek narzędzi układu graficznego_spinner_item_actionbar.xml (będzie to materiał pokazujący spinner na pasku narzędzi)
<?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. adapter dla Twojego spinnera pozostaje prawie taki sam, jednak Zmień układ ze standardowego Androida.R. layout.simple_spinner_dropdown_item to R. layout.toolbar_spinner_item_actionbar. Spowoduje to zastosowanie niestandardowego wyglądu tekstu paska narzędzi.

W tym przykładzie ustawiłem adapter.setDropDownViewResource to android.R. layout.simple_spinner_dropdown_item, dotyczy to domyślnego motywu standardowego dla rozwijanej listy, z której jestem zadowolony.

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

To jest w zasadzie to, wynik tutaj [nie można dołączyć obraz lub dodać inny link, ponieważ moja reputacja jest za niska! Doda w komentarzu] . Możesz zatrzymać się tutaj, jakkolwiek chcesz Zmień kolor strzałki rozwijanej.

Technicznie jest to poprawne przyciemnianie dla mojej aplikacji, jednak ponieważ mój podstawowy kolor jest już kolorem paska narzędzi, sensowne byłoby dostosowanie strzałki.

Konfiguracja niestandardowa strzałka drawable

  1. Dodaj tę linię drawable line 'android: drawableright= " @drawable / spinner_triangle'do paska narzędzi.XML wykonany wcześniej. Teraz to może być dowolny obraz, na razie możesz użyć białej strzałki Daniela B źródło tutaj https://raw.githubusercontent.com/google/iosched/master/android/src/main/res/drawable-xxhdpi/spinner_triangle.png.

Uruchomienie tego spowoduje wyświetlenie dwóch strzałek, białej Strzałki i domyślnego motywu. Aby to rozwiązać, Dodaj styl poniżej. Ponownie jest to wyciągnięte z kodu Daniela B i prawdopodobnie może zostać skrócone, ale na razie działa....

    <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. Zastosuj utworzony styl do spinnera...
<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>

Wynik będzie czymś w rodzaju to [ponownie nie można dołączyć lub link, będzie dodać do komentarza]. Padding można ustawić z ustawień pliku wcześniej, w moim przypadku musiałbym zmienić strzałkę, aby dopasować ikony.

Mam nadzieję, że to ma jakiś sens.
 0
Author: user1544797,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-11 14:35:14

Kiedy używałem spinnera to się rozbił (Android 2.3.3 - 2.3.7).

Więc staram się użyć TintSpinner teraz nie jest upaść, spróbuj siebie jako opcjonalne rozwiązanie

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

I użyj poniższego kodu, aby utworzyć pasek narzędzi

 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);
 0
Author: IshRoid,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-11 10:33:18

Zmarnowałem godziny na ten temat. O ile mogę powiedzieć, powyższe rozwiązania wymagają kopiowania / wklejania dużych fragmentów kodu stylu appcompat, aby ponownie zaimplementować podstawowe szczegóły, takie jak Stany dotykowe.

Stosunkowo łatwym sposobem na zachowanie natywne jest programowe napompowanie widoku, aby upewnić się, że otrzyma prawidłowy motyw, np.:

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

Aby trójkąt był biały, a nie colorControlNormal, zastosowałem odcień ColorStateList do background:

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>
 0
Author: user3452758,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-17 10:02:29

Rozwiązałem to tworząc nowe wartości dla wersji 21 i 23 oraz dodając nowy atrybut w stylu spinner android: dropDownVerticalOffset i usuwając go z domyślnego pliku stylu. (mój przypadek nie jest związany z paskiem narzędziowym) to dla zwykłego spinnera.

Dodaj ten styl w folderach 23 i 21

<style name="spinner_style">
    <item name="android:background">@drawable/background_spinner</item>
    <item name="android:dropDownVerticalOffset">30dip</item>
</style>
Działa idealnie na wszystkich wersjach. Mam nadzieję, że to działa z Tobą!
 0
Author: Ibrahim AbdelGawad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-27 07:59:46