9

ActionBar ナビゲーション スピナーのテキスト コンテンツをラップしようとしています (ActionBar Sherlock を使用しています)。私のスピナーは、ドロップダウン リストに含まれる項目の幅をとっているようです。

スピナーで選択したアイテムをその幅に応じて「ラップ」するにはどうすればよいですか? 例は、GMaps アクション バー スピナーにあります。

4

2 に答える 2

1

アップデート:

サンプル プロジェクトをここからダウンロードします: Spinner width test (Dropbox フォルダー) (この回答で提供されている両方のソリューションが含まれています)。

文字のカーニング(文字間隔)はテキストによって異なるため、スピナーの幅も以前に投稿した回答の幅を変更しました(下)

したがって、タイトルを部分文字列にする代わりに、次のように TextView の幅をピクセル単位で設定するだけです。

textView.setWidth(200);
  • テキストは切り捨てられ、「..」で終わります。

  • スピナーの幅は同じサイズのままです。

  • ドロップダウンリストとスピナーに異なる幅を設定できます

  • カスタム SpinnerAdapter は引き続き必要ですが、カスタム
    SpinnerItem クラスは必要ありません。アダプターに String[] 配列を指定するだけです。

spinner.setAdapter(new TruncatedSpinnerAdapter(stringArray));//文字列[]

TruncatedSpinnerAdapter では:

public class TruncatedSpinnerAdapter implements SpinnerAdapter {

    String[] spinnerItem;

    public TruncatedSpinnerAdapter(String[] spinnerItem) {
        this.spinnerItem = spinnerItem;
    }

//    ...more required interface callbacks here...

    /**
     * Returns the View that is shown when a spinner item is selected.
     */
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View view = getLayoutInflater().inflate(
                android.R.layout.simple_spinner_item, null);
        TextView textView = (TextView) view.findViewById(android.R.id.text1);
        textView.setText(spinnerItem[position]);
        //Set the width of the TextView in pixel. 
        //the text will now get truncated and ending with ".."
        textView.setWidth(200);
        return textView;
    }

更新前の回答:

スピナー ビューとスピナー ドロップダウン ビューに表示するテキストの長さを制御するカスタム SpinnerAdapter を作成することで、テキストの並べ替えをラップできます。

 /**
     * A SpinnerItemAdapter to handle SpinnerItem Objects, 
     * displays the ArrayList of SpinnerItem Objects.
     */
    public class SpinnerItemAdapter implements SpinnerAdapter{

        /**
         * The internal data, ArrayList of SpinnerItem Objects.
         */
        SparseArray<SpinnerItem> spinnerItem;

        public SpinnerItemAdapter(SparseArray<SpinnerItem> spinnerItem){
            this.spinnerItem = spinnerItem;
        }

        /**
         * Returns the Size
         */
        @Override
        public int getCount() {
            return spinnerItem.size();
        }
        /**
         * Returns a SpinnerItem Object at the specified position.
         */
        @Override
        public Object getItem(int position) {
            return spinnerItem.valueAt(position);
        }


//    ...more required interface callbacks here...


        /**
         * Views displayed when the Spinner is clicked, the drop 
         * down list of spinner items.
         */
        @Override
        public View getDropDownView(int position, View convertView,
                ViewGroup parent) {
            View view=getLayoutInflater().inflate(android.R.layout.simple_spinner_dropdown_item, null); 
            TextView v=(TextView)view.findViewById(android.R.id.text1);
            v.setText(spinnerItem.valueAt(position).getDropDownTitle());     
            return v;
        }
        /**
         * Returns the View that is shown when a spinner item is selected.
         */
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            View view=getLayoutInflater().inflate(android.R.layout.simple_spinner_item, null); 
            TextView v=(TextView)view.findViewById(android.R.id.text1);
            v.setText(spinnerItem.valueAt(position).getShortTitle());   
            return v;
        }

    }

スピナー ビューの短縮タイトルを保持および返すことができるカスタム SpinnerItem クラスをアダプターに設定します。

class SpinnerItem {

    // SpinnerItem fields, including variable of type SpinnerItem
    public String title = "";
    // sets the width of the spinnerItem
    public int titleLength = 10;//default value
    public int titleDropDownLength = 20;

    public long id;

    // SpinnerItem methods()

    /**
     * Title with max characters displayed, set by titleLength;
     * 
     * @return title of the spinnerItem.
     */
    public CharSequence getShortTitle() {
        if (title.length() == 0)
            return "?";//
        else if (title.length() > 0 && title.length() <= titleLength) {
            return title;
        } else {
            String shortTile = title.substring(0, titleLength).trim() + "..";
            return shortTile;
        }
    }

    public CharSequence getDropDownTitle() {
        if (title.length() == 0)
            return "?";//
        else if (title.length() > 0 && title.length() <= titleDropDownLength) {
            return title;
        } else {
            String shortTile = title.substring(0, titleDropDownLength).trim() + "..";
            return shortTile;
        }
    }
}

SpinnerItem クラスを使用すると、SpinnerItem オブジェクトの作成時に MAX タイトルの長さを設定することで、スピナー アイテム ビューに表示されるタイトルの長さを制御できます。

//Create an ArrayList for the Adapter with SpinnerItems
        SparseArray<SpinnerItem> spinnerItems = new SparseArray<SpinnerItem>();

        //Some dummy Cheese titles for the spinner items
        String[] sCheeseStrings = {
               "Abbaye de Belloc", "Abbaye du Mont des Cats", "Abertam", "Abondance", "Ackawi",
               "Acorn", "Adelost", "Affidelice au Chablis", "Afuega'l Pitu", "Airag", "Airedale"};

        for (int i = 0; i < sCheeseStrings.length; i++) {
            SpinnerItem spinnerItem= new SpinnerItem(); 
            spinnerItem.title=sCheeseStrings[i];
            spinnerItem.id=i;
            spinnerItem.titleLength=MAX_TITLE_LENGTH;
            spinnerItem.titleDropDownLength=MAX_DROP_DOWN_TITLE_LENGTH;
            spinnerItems.append(i, spinnerItem);
        }
        spinnerAdapter = new SpinnerItemAdapter(spinnerItems);

次に、spinnerAdapter を Spinner に追加します。

spinner.setAdapter(spinnerAdapter);

ActionBar: menu.xml のスピナーの例

        // For API below 11 use ActionBar Sherlock with Android Support Library
//       getSupportMenuInflater().inflate(R.menu.activity_menu, menu);
        // For API above 11
        getMenuInflater().inflate(R.menu.activity_menu, menu);
        spinner_menu = (Spinner) menu.findItem(R.id.menu_spinner).getActionView();
        spinner_menu.setAdapter(spinnerAdapter);
于 2012-10-06T12:14:42.260 に答える
1

実際、android はすべてのアイテムに対して getView() を呼び出し、スピナーの幅を最も広い幅に設定しようとします。別のスレッドで私の解決策を参照してください。https://stackoverflow.com/a/15356679/2159849

于 2013-03-12T08:49:58.383 に答える