Android 开发 Tip 6 -- Spinner 文字 & icon 居中显示


转载请注明出处:http://blog.csdn.net/crazy1235/article/details/70903974


设置Spinner 文字居中

默认情况下,Spinner控件的效果是这样的:

这里写图片描述

想让文字居中显示怎么办???

在布局文件中设置

android:gravity="center"

也不起作用!!


源码走读

先来看 Spinner 的构造函数

public Spinner(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes, int mode,
            Theme popupTheme) {
        super(context, attrs, defStyleAttr, defStyleRes);

        final TypedArray a = context.obtainStyledAttributes(
                attrs, R.styleable.Spinner, defStyleAttr, defStyleRes);

        // 省略代码

        if (mode == MODE_THEME) {
            mode = a.getInt(R.styleable.Spinner_spinnerMode, MODE_DIALOG);
        }

        // 判断弹出模式 dialog or dropdown
        switch (mode) {
            case MODE_DIALOG: {
                mPopup = new DialogPopup(); // DialogPopup 
                mPopup.setPromptText(a.getString(R.styleable.Spinner_prompt));
                break;
            }

            case MODE_DROPDOWN: {
                final DropdownPopup popup = new DropdownPopup(
                        mPopupContext, attrs, defStyleAttr, defStyleRes); // DropdownPopup
                // 省略代码
                break;
            }
        }

        // ...
        a.recycle();

        // 设置adapter
        if (mTempAdapter != null) {
            setAdapter(mTempAdapter);
            mTempAdapter = null;
        }
    }

当mTempAdapter 不为空时,调用了setAdapter() 设置适配器!

但是我们如果在xml中设置了entries属性,并没有设置adapter

android:entries="@array/date_spinner_items"

上图的列表是怎么出来的呢?!

来看父类~~

AbsSpinner

public AbsSpinner(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
        initAbsSpinner();

        final TypedArray a = context.obtainStyledAttributes(
                attrs, R.styleable.AbsSpinner, defStyleAttr, defStyleRes);

        final CharSequence[] entries = a.getTextArray(R.styleable.AbsSpinner_entries);
        if (entries != null) {
            final ArrayAdapter<CharSequence> adapter = new ArrayAdapter<CharSequence>(
                    context, R.layout.simple_spinner_item, entries);
            adapter.setDropDownViewResource(R.layout.simple_spinner_dropdown_item);
            setAdapter(adapter);
        }

        a.recycle();
    }

从构造器函数中看出,当entries属性不为空时,调用了 setAdapter() 函数!

注意这里,用到的是 ArrayAdapter 适配器 。还有两个重要的布局文件:

  • simple_spinner_item

  • simple_spinner_dropdown_item

子类Spinner重写了setAdapter 函数

@Override
    public void setAdapter(SpinnerAdapter adapter) {
        // ... 
        super.setAdapter(adapter);
        // ...
        mPopup.setAdapter(new DropDownAdapter(adapter, popupContext.getTheme()));
    }

mPopup 是一个接口对象,里面封装了 设置适配器、显示列表、关闭列表等操作!

不管是Spinner是 dialog 形式还是 dropdown 形式,都实现了该接口!

private class DialogPopup implements SpinnerPopup, DialogInterface.OnClickListener
private class DropdownPopup extends ListPopupWindow implements SpinnerPopup

OK,现在来看 DropDownAdapter

private static class DropDownAdapter implements ListAdapter, SpinnerAdapter {
   
        private SpinnerAdapter mAdapter;
        private ListAdapter mListAdapter;

        public DropDownAdapter(@Nullable SpinnerAdapter adapter,
                @Nullable Resources.Theme dropDownTheme) {

            mAdapter = adapter; // 注意这里!!!

            // 省略代吗
        }

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

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

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

        public View 
  • 15
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值