5

レイアウトにスピナーがあり、プロンプトを で設定しますandroid:prompt="@string/year"

デフォルトのプロンプトは次のようになります。

デフォルトのプロンプトは次のようになります

今私の質問は次のとおりです。

  1. デフォルトのアイコンを別の画像に変更するにはどうすればよいですか?
  2. 「年」のテキストを中央に赤い色で表示するにはどうすればよいですか?
  3. 背景色を黄色 (「年」のテキストとアイコンが存在する背景) に変更するには?

私のカスタム Adapter クラス

private class MyCustomSpinnerAdapter extends ArrayAdapter<ArrayList> {
        private ArrayList<String> objectsList = new ArrayList<String>();

        @SuppressWarnings("unchecked")
        public MyCustomSpinnerAdapter(Context context, int textViewResourceId,
                ArrayList objects) {
            super(context, textViewResourceId, objects);
            this.objectsList = objects;
        }

        @Override
        public View getDropDownView(int position, View convertView,
                ViewGroup parent) {
            return getCustomView(position, convertView, parent);
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            return getCustomView1(position, convertView, parent);
        }

        public View getCustomView(int position, View convertView,
                ViewGroup parent) {
            LayoutInflater inflater = getLayoutInflater();
            View rowView = inflater.inflate(R.layout.spinner_dropdown, parent,
                    false);
            LinearLayout rowTitle = (LinearLayout) rowView
                    .findViewById(R.id.row);

            rowTitle.setBackgroundResource(R.drawable.spinner_row_focused);

            TextView textView = (TextView) rowView.findViewById(R.id.title);
            textView.setTypeface(typeFace);
            textView.setText(objectsList.get(position).toString().trim());
            return rowView;
        }

        public View getCustomView1(int position, View convertView,
                ViewGroup parent) {
            LayoutInflater inflater = getLayoutInflater();
            View rowView = inflater.inflate(R.layout.spinner_dropdown, parent,
                    false);

            TextView textView = (TextView) rowView.findViewById(R.id.title);
            textView.setText(objectsList.get(position).toString().trim());
            textView.setTypeface(typeFace);
            return rowView;
        }
    }
4

5 に答える 5

3

解決策は次のとおりです。ヘッダーの単純なレイアウトを作成します(ファイルR.layout.spinner_head):

<ImageView
    android:id="@+id/spin_img"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_weight="1.0" 
    android:padding="5dip"
    android:src="@android:drawable/btn_star"
    android:layout_alignParentLeft="true"/>

<TextView
    android:id="@+id/title"
    android:textColor="#f00"
    android:gravity="center"
    android:text="Year"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_centerInParent="true" 
    />

カスタム スピナーを作成します。

class MySpinner extends Spinner {

        public MySpinner(Context context) {
            super(context);
        }

        @Override
        public boolean performClick() {
            boolean handled =  false;//super.performClick();

            if (!handled) {

                handled = true;

                Context context = getContext();

                AlertDialog.Builder builder = new AlertDialog.Builder(context);
                CharSequence mPrompt = getPrompt();
                if (mPrompt != null) {

                    builder.setCustomTitle(getLayoutInflater().inflate(R.layout.spinner_head, null));

                }

                builder.setSingleChoiceItems(new DropDownAdapter(getAdapter()),getSelectedItemPosition(), this).show();

            }

            return handled;
        }

        @Override
        public void onClick(DialogInterface dialog, int which) {
            setSelection(which);
            dialog.dismiss();
        }

        class  DropDownAdapter implements ListAdapter, SpinnerAdapter {
            private SpinnerAdapter mAdapter;

            public  DropDownAdapter(SpinnerAdapter adapter) {
                this.mAdapter = adapter;
            }

            @Override
            public int getCount() {
                return mAdapter == null ? 0 : mAdapter.getCount();
            }

            @Override
            public Object getItem(int position) {
                return mAdapter == null ? null : mAdapter.getItem(position);
            }

            @Override
            public long getItemId(int position) {
                return mAdapter == null ? -1 : mAdapter.getItemId(position);
            }

            @Override
            public int getItemViewType(int position) {
                return 0;
            }

            @Override
            public View getView(int position, View convertView, ViewGroup parent) {
                return getDropDownView(position, convertView, parent);
            }

            @Override
            public int getViewTypeCount() {
                return 1;
            }

            @Override
            public boolean hasStableIds() {
                return mAdapter != null && mAdapter.hasStableIds();
            }

            @Override
            public boolean isEmpty() {
                return getCount() == 0;
            }

            @Override
            public void registerDataSetObserver(DataSetObserver observer) {
                 if (mAdapter != null) {
                     mAdapter.registerDataSetObserver(observer);
                 }

            }

            @Override
            public void unregisterDataSetObserver(DataSetObserver observer) {
                 if (mAdapter != null) {
                     mAdapter.unregisterDataSetObserver(observer);
                 }

            }

            @Override
            public View getDropDownView(int position, View convertView,
                    ViewGroup parent) {
                return mAdapter == null ? null : mAdapter.getDropDownView(position, convertView, parent);
            }

            @Override
            public boolean areAllItemsEnabled() {
                return true;
            }

            @Override
            public boolean isEnabled(int arg0) {
                return true;
            }


        }
    }

スピナーのインスタンスを作成する

MySpinner theSpin = new MySpinner(this);
            theSpin.setPrompt("Select Item");
            ArrayAdapter<String> theAdapter = 
                new ArrayAdapter<String>(this, android.R.layout.simple_dropdown_item_1line, new String[]{"item1","item2","item3","item4","item5","item6" });
            theSpin.setAdapter(theAdapter);

カスタム ヘッダーを表示するこのカスタム スピナーを使用します。必要に応じてそのヘッダーを変更できます。

于 2012-10-23T09:18:40.410 に答える
1

カスタムListViewのようなカスタムスピナーを準備し、このリンクを確認する方が良いと思いますhttp://android-er.blogspot.in/2010/12/custom-spinner-with-icon.html

于 2012-10-08T09:03:38.280 に答える
1

ここでは、スピナーの設定プロンプトの名前を変更し、そこに名前を文字列として渡します。以下に、構文を次のように指定しています。

spinner.setPrompt("Name of Your Header");
于 2012-10-27T06:46:02.217 に答える
0

Spinnerクラスコードを見てみるDialogPopupと、内部プライベートクラスがあります。このクラスは、Spinner ダイアログに表示されるAlertDialogと をカプセル化します。ListView非公開なので延長はできません。

これがあなたに役立つかもしれない答えです: Android Spinner をポップアップとして作成するにはどうすればよいですか?

その受け入れられた回答のコードに加えてsetCustomTitle、ダイアログを呼び出して独自のスタイルのタイトルビューを作成するか、xml レイアウトでアイコンビューの ID を見つけて、AlertDialogアイコンのみを変更する場合はアイコンを直接設定します。

于 2012-10-26T18:29:40.350 に答える
0

テキストの色を変更するには、HTML を使用してみてください。

String redText = "This is <font color='red'>Red text</font>.";
mSpinner.setPrompt(Html.fromHtml(redText));

この投稿が示唆する行に沿ってヘッダーをハックしてみてください 。ダイアログのヘッダー レイアウトをカスタマイズするにはどうすればよいですか

Window window = mSpinner.getWindow();
window.requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);
window.setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.my_custom_header);

R.layout.my_custom_header は、ヘッダーに表示する内容を定義するレイアウトです。私はこれを試していません。上で参照した投稿で提案されたことから外れているだけです。

しかし、おそらくあなたの最善の策は、Chiru に耳を傾け、独自のカスタムビューを作成して、それがあなたが望むものとまったく同じように見えるようにすることです.

于 2012-10-22T06:41:06.703 に答える