2012-04-25 10 views
12

Android 2.3.3用のドロップダウンスピナーを作成する方法はありますか?私はActionbarSherlockを使用しています。ここでアクションバーの外にドロップダウンスピナー? (IceCreamサンドイッチスタイル、ActionBarSherlock付き)

は私が何を意味するかの例です:現状では

enter image description here

おかげ

+0

API 1以降のDropdown [スピナー](http://developer.android.com/reference/android/widget/Spinner.html)はどうですか?テーマは異なる場合がありますが、そのほとんどをカスタムテーマにコピーできます。 – Sam

+0

彼は、ダイアログではなく「ドロップダウン」するICSスピナーのルックアンドフィールを意味します。 – dmon

答えて

26

、あなたは運がいい。これはActionBarSherlockで行うことができ、4.0より前のバージョンで動作します。しかし、私は100%確信しているわけではありません.Jake Whartonは、このような使い方をしたいと思っています。なぜなら、それはちょうど "public api"、AFAIK(私は尋ねるつもりだった)ではないからです。とにかく、あなたは最初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); 

    } 
} 

レイアウトに含める:

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

は今、あなたはカスタムSpinnerAdapterを作成する必要があり、あなたが必要とします適切なルック&フィールを得るために以下のメソッドをオーバーライドします。

@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。テーマについて。

+0

ありがとう、素晴らしい作品! –

+0

@dmonデバイスの回転後、ドロップダウンの幅は変更されません。あなたはこれをお勧めできますか? –

1

私は同じ問題を抱えており、私の解決策は非常に簡単です。 (私はHoloEverywhereを使用していませんでした)

このアイデアは、サブメニューを使用して4.0より前のデバイスにドロップダウンメニューを表示できるABSサンプルプロジェクトに由来しています。だから、私の考えは、3ドットのアイコンを隠すサブメニューを使用しています。ここ はコードです:

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

「詳細」メニューがMenuItem.SHOW_AS_ACTION_WITH_TEXT属性を持っていないので、単語「詳細」(または任意の名前付き)は、実際にアクションバーに表示されませんので。表示されている唯一のアイコンR.drawable.ic_menuはABSソースコードres/drawable-xxdpiからコピーすることができます。 "abs__ic_menu_moreoverflow_normal_holo_dark.png"という名前のフォルダ、いわゆる3ドットアイコンです。 R.menu.activity_mainはメニューxmlです。

関連する問題