2012-04-25 11 views
12

Czy istnieje sposób na stworzenie Dropdown Spinner dla systemu Android 2.3.3? Używam ActionbarSherlock.Dropdown Spinner poza Actionbar? (Styl IceCream Sandwich, w/ActionBarSherlock)

Oto przykład tego, co mam na myśli:

enter image description here

Dzięki

+0

jak o rozwijane [Spinner] (http://developer.android.com/reference/android/widget/Spinner.html), która już od 1 API? Tematy mogą być inne, ale powinieneś być w stanie skopiować większość do niestandardowego motywu. – Sam

+0

Ma na myśli wygląd i sposób działania przędzarek ICS, w których "upuszczają", zamiast być dialogiem. – dmon

Odpowiedz

26

Jak się stoi, masz szczęście. Można to zrobić za pomocą ActionBarSherlock i działa z wersjami przed 4.0. Jednak nie jestem w 100% pewny, czy Jake Wharton będzie chciał, abyśmy go używali w ten sposób, ponieważ nie jest to dokładnie "public api", AFAIK (chciałem zapytać). Tak czy inaczej, trzeba najpierw stworzyć własną klasę do rozszerzenia z klasy ActionBarSherlock:

public class MyIcsSpinner extends IcsSpinner { 

    public MyIcsSpinner(Context context, AttributeSet attrs) { 
    super(context, attrs, com.actionbarsherlock.R.attr.actionDropDownStyle); 

    } 

    public MyIcsSpinner(Context context, AttributeSet attrs, int defStyle) { 
    super(context, attrs, defStyle); 

    } 
} 

umieścić go w układzie:

<com.blah.blah.blah.MyIcsSpinner 
    android:layout_width="wrap_content" 
    android:layout_height="fill_parent" 
    android:layout_gravity="center" 
    android:textAllCaps="true" 
    android:background="@drawable/abs__spinner_ab_holo_light" 
    android:textColor="#000000" 
    android:gravity="center"/> 

Teraz trzeba utworzyć niestandardowy SpinnerAdapter i trzeba aby zastąpić następujące metody, aby uzyskać właściwy wygląd:

@Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
    final TextView filterName; 
    if (convertView == null) { 
     filterName = (TextView) layoutInflater.inflate(R.layout.filter_item, parent, false); 
    } else { 
     filterName = (TextView) convertView; 
    } 

    filterName.setText(getItem(position)); 
    return filterName; 
    } 

    @Override 
    public View getDropDownView(int position, View convertView, ViewGroup parent) { 
    final TextView filterName; 
    if (convertView == null) { 
     filterName = (TextView) layoutInflater.inflate(R.layout.sherlock_spinner_dropdown_item, parent, false); 
     filterName.setEllipsize(TruncateAt.END); 
    } else { 
     filterName = (TextView) convertView; 
    } 

    filterName.setText(getItem(position)); 
    return filterName; 
    } 

YMMV, esp. w odniesieniu do tematów.

+0

Dzięki, działa świetnie! –

+0

@dmon Szerokość rozwijania nie zmienia się po obrocie urządzenia. Czy możesz to zasugerować? –

1

Poznałem ten sam problem i moje rozwiązanie jest dość proste. (Nie użyłem HoloEverywhere.)

Pomysł pochodzi z przykładowego projektu ABS, którego rozwijane menu można również wyświetlać na urządzeniach z przed 4.0, a także za pomocą podmenu. Tak więc, moim pomysłem jest użycie podmenu do ukrycia ikony z trzema kropkami. Oto kod:

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 

    SubMenu sub = menu.addSubMenu("More"); 
    sub.getItem().setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS); 
    sub.getItem().setIcon(R.drawable.ic_menu); 

    getSupportMenuInflater().inflate(R.menu.activity_main, sub); 

    return true; 
} 

Ponieważ menu „Więcej” nie posiada atrybut MenuItem.SHOW_AS_ACTION_WITH_TEXT, więc słowo „Więcej” (lub cokolwiek nazwie) faktycznie nie być wyświetlane na pasku akcji. Jedynie wyświetlana ikona R.drawable.ic_menu może być kopiowana z folderów kodu źródłowego ABS/drawable-xxdpi o nazwie "abs__ic_menu_moreoverflow_normal_holo_dark.png", czyli tak zwanej ikony z trzema kropkami. A R.menu.activity_main jest twoim menu xml.

To działa!