SORU
5 Kasım 2014, ÇARŞAMBA


Nasıl Android 4 için Spinner tarzı düzeltebilirim.x Araç üstüne yerleştirilen

Android documentation Malzeme Tasarımına göre tarzı Çevirici widget için desteklenir.

Benim app Çubuğu üzerine yerleştirerek kullanmaya karar verdim.

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>

Etkinlik tema

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

Spinner ve açılan güzel Lolipop, ancak açılan arka plan rengi siyah beyaz olan menü açılır için karşılaştırma. app:popupTheme="@style/ThemeOverlay.AppCompat.Light" spinner yayılır değil sanırım.

Android 5.0

enter image description here enter image description here

Şimdi büyük sorun Android 4 ile.x yerde açılan arka plan rengi beyaz(popupTheme yayılır?) ve simge spinner yanında siyah.

Android 4.4

enter image description here

Nasıl düzgün XML set ya da iş yapmak için kod uygulamak Android 5 ve 4 miyim? İdeal olarak, her ikisi de Android 5 gibi görünüyor ama beyaz spinner açılır(açılır menü Ayarı gibi) istiyorum.

Güncelleme

Özelliği colorControlNormal ayar spinner filtre simgesi etkilediğini fark ettim. Eğer birisi Spinner(diğer içerik denetimleri değiştirmeden) için bu kullanmak için ne kadar öğrenirse, o zaman benim çözüm @bulgu cevap Sven birleştirerek olurdu.

Güncelleme

Aşağıdaki değişikliği spinner metin ve açılan renk sorunu giderir. Yani nihai çözüm için tek sorun filtre simgesi.

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

Güncelleme

Filtre simgesi aslında android:background bir parça değişimi için belirtilen ve şeffaf olduğunu buldum. Kendi arka plan sağlayan örneğin düzeltmek istiyorum

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

Gizem çözüldü!

Bulmacanın son parçası siyah arka plan ve beyaz metin olan Android 5 üzerinde açılan ama özel düzeni ile çözülebilir sanırım. Eğer kimse tam cevap sağlıyorsa kendim ve kabul edilmiş olarak işaretle.

CEVAP
2 Ocak 2015, Cuma


Bu kadar geç olduğunu biliyorum ama bu sorunu kendim karşılaştım ve Google I/O 2014 app BrowseSessionsActivity bir çözüm buldum ve uyarladım zaman bu soruyu genelinde geldim. Ayrıca blog post bunu koyduk.

Düzenler

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

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>

Stilleri

toolbar_spinner.xml aşağıdaki stili kullanır.

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

Bağdaştırıcı

Bu adaptör kendi ihtiyaçlarınıza uyacak şekilde değiştirilmesi gerekir. getTitle() her madde spinner gösterilen metni döndürür.

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

Senin Araç için Spinner sözlerine ekledi

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

Sonuç

Material Spinner

KitKat Spinner

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Damien Walters

    Damien Walte

    20 AĞUSTOS 2006
  • Karan Thakur

    Karan Thakur

    23 HAZİRAN 2010
  • Matt Steffanina

    Matt Steffan

    1 EYLÜL 2011