【问题标题】:How can change header of dropdown view in android?如何在android中更改下拉视图的标题?
【发布时间】:2012-10-08 08:42:16
【问题描述】:

我的布局中有一个微调器,并使用android:prompt="@string/year" 设置提示。

默认提示如下:

现在我的问题是:

  1. 如何将默认图标更改为其他图像?
  2. 如何让“年份”文本以红色显示在中心?
  3. 如何将背景颜色更改为黄色(存在“年份”文本和图标的背景)?

我的自定义适配器类

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

【问题讨论】:

  • 我认为你最好准备像自定义 ListView 这样的自定义微调器。

标签: android android-layout android-widget


【解决方案1】:

这是您的解决方案: 为标题创建简单的布局(文件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);

现在使用这个自定义微调器,它将显示自定义标题。您可以根据需要修改该标题。

【讨论】:

    【解决方案2】:

    我认为你最好准备像自定义 ListView 这样的自定义微调器并检查此链接 http://android-er.blogspot.in/2010/12/custom-spinner-with-icon.html

    【讨论】:

    • 感谢您的回答,但我不是在寻找微调器的自定义适配器。它更改微调器的行。我正在寻找更改列表的标题。
    • android:prompt="@string/year" 代码显示的部分图片。
    【解决方案3】:

    这里只需更改名称微调器的设置提示并将名称作为字符串传递在那里,下面我给出的语法如下所示-

    spinner.setPrompt("Name of Your Header");
    

    【讨论】:

    • 是的,直接设置字符串的方式,或者通过在string.xml中设置文本的方式
    • 但我的问题与上面指定的不同。
    • 只有当你为此制作自定义 gui 时才有可能
    • 但布局如何设置为微调器提示。
    【解决方案4】:

    要更改文本的颜色,您可以尝试使用 HTML

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

    您可以尝试按照本文建议的方式破解标题 How can I customize the header layout of a dialog

    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 的意见并制作您自己的自定义视图,让它看起来完全符合您的要求。

    【讨论】:

      【解决方案5】:

      我查看了Spinner 类代码,DialogPopup 是一个内部私有类。此类封装了 Spinner 对话框中显示的 AlertDialogListView。它是私有的,所以我们不能扩展它。

      这是一个可能对您有所帮助的答案:How do I create an Android Spinner as a popup?

      除了已接受答案中的代码外,请在对话框上调用 setCustomTitle 以获得您自己的样式标题视图 或者在AlertDialogxml布局中找到图标视图的id,如果只想更改图标,直接设置图标。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-06-08
        • 1970-01-01
        • 2015-02-20
        • 1970-01-01
        • 2018-04-28
        • 2018-04-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多