自定义 Android Preference——SpinnerPreference的私人定制

因客户需求SpinnerPreference,网上各种搜索不到,无奈只能重写组件,现将过程分享大家。

自定义SpinnerPreference

一:首先从扩展preference开始:类文件必须继承自Preference并实现构造函数,如下

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

    public MySpinnerPreference(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public MySpinnerPreference(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

二:自定义布局文件的重写





    

        

        
    

    

    


三:引用一个layout文件为其指定UI,可以通过实现如下两个回调函数:

  @Override
    protected View onCreateView(ViewGroup parent) {
        // TODO Auto-generated method stub
        return super.onCreateView(parent);
    }



    @Override
    protected void onBindView(View view) {
        super.onBindView(view);

        mSpinner = (Spinner) view.findViewById(R.id.spinner1);

        String[] arraystr = view.getResources().getStringArray(R.array.itemspinner_values);
        mAdapter = new ArrayAdapter(view.getContext(), android.R.layout.simple_spinner_dropdown_item, arraystr);
        //  也可一自己定义适配器的样式
        // mAdapter = new ArrayAdapter(view.getContext(), R.layout.preference_categoary, mMeausStr);
        mSpinner.setAdapter(mAdapter);
        mSpinner.setOnItemSelectedListener(this);
    }

四:为组建添加需要的事件这里implementsOnItemSelectedListener

    @Override
    public void onItemSelected(AdapterView parent, View view, int position, long id) {
        if (callChangeListener(position)) {
            setValue(position);
        }
    }

    @Override
    public void onNothingSelected(AdapterView parent) {

    }

五:保存或持久化我们的改动

設置我們的改動

public void setValue(int value) {
        // Always persist/notify the first time.
        final boolean changed = !TextUtils.equals(Integer.toString(mValue), Integer.toString(value));
        if (changed || !mValueSet) {
            mValue = value;
            mValueSet = true;

            persistInt(value);
            if (changed) {
                notifyChanged();
            }
        }
    }


   @Override
    public void onItemSelected(AdapterView parent, View view, int position, long id) {
        mPos = position;
        if (callChangeListener(position)) {
            setValue(position);
        }
    }

可以持久化多种基本数据类型

自定义 Android Preference——SpinnerPreference的私人定制_第1张图片


    @Override
    protected void onSetInitialValue(boolean restoreValue, Object defaultValue) {
        setValue(restoreValue ? getPersistedInt(mValue) : (Integer) defaultValue);
    }

六效果圖



自定义 Android Preference——SpinnerPreference的私人定制_第2张图片






你可能感兴趣的:(Android,android,preference,spinner,widget,布局)