2012-04-25 29 views
12

Có cách nào để tạo ra một Spinner thả xuống cho Android 2.3.3 không? Tôi đang sử dụng ActionbarSherlock.Dropdown Spinner bên ngoài thanh tác vụ? (Phong cách IceCream Sandwich, w/ActionBarSherlock)

Dưới đây là một ví dụ về những gì tôi có nghĩa là:

enter image description here

Cảm ơn

+0

Làm cách nào để thả xuống [Spinner] (http://developer.android.com/reference/android/widget/Spinner.html) đã có từ API 1? Các chủ đề có thể khác nhau, nhưng bạn sẽ có thể sao chép hầu hết các chủ đề đó thành một chủ đề tùy chỉnh. – Sam

+0

Anh ấy có nghĩa là giao diện của người quay ICS, nơi họ "thả xuống" thay vì là hộp thoại. – dmon

Trả lời

26

Khi đứng, bạn đang ở may mắn. Nó có thể được thực hiện với ActionBarSherlock và nó hoạt động với các phiên bản trước 4.0. Tuy nhiên, tôi không chắc chắn 100% Jake Wharton sẽ muốn chúng tôi sử dụng nó như thế này, vì nó không chính xác là "api công cộng", AFAIK (tôi muốn hỏi). Dù sao, trước tiên bạn phải tạo lớp của riêng bạn để mở rộng từ lớp 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); 

    } 
} 

Để đưa nó vào trong một bố cục:

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

Bây giờ bạn có để tạo ra một tùy chỉnh SpinnerAdapter, và bạn cần để ghi đè các phương pháp sau đây để có giao diện phù hợp:

@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, đặc biệt. về các chủ đề.

+0

Cảm ơn, Công trình tuyệt vời! –

+0

@dmon Chiều rộng thả xuống không thay đổi sau khi xoay thiết bị. Bạn có thể đề xuất về điều này? –

1

Tôi đã gặp vấn đề tương tự và giải pháp của tôi khá đơn giản. (Tôi không sử dụng HoloEverywhere.)

Ý tưởng đến từ dự án mẫu ABS, có trình đơn thả xuống có thể được hiển thị trên các thiết bị pre-4.0 bằng cách sử dụng menu phụ. Vì vậy, ý tưởng của tôi là sử dụng một menu phụ để ngụy trang biểu tượng 3 dấu chấm. Dưới đây là các mã:

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

Từ menu "Khác" không có một thuộc tính MenuItem.SHOW_AS_ACTION_WITH_TEXT, vì vậy từ "More" (hoặc bất cứ điều gì bạn đặt tên) sẽ thực sự không được hiển thị trên thanh hành động. Biểu tượng duy nhất được hiển thị R.drawable.ic_menu có thể được sao chép từ thư mục res/drawable-xxdpi mã nguồn ABS có tên "abs__ic_menu_moreoverflow_normal_holo_dark.png", là biểu tượng 3 dấu chấm. Và R.menu.activity_main là trình đơn xml của bạn.

Nó hoạt động!

Các vấn đề liên quan