Android创建自定义NumberPicker小部件

时间:2015-02-17 11:02:15

标签: android

我在应用程序中使用了一些simvot号码选择器,我想为此创建自定义小部件并在所有项目中使用,现在我创建了这个文件,但我无法设置任何自定义小部件的价值。

我的属性:

<declare-styleable name="CNumberPicker">
    <attr name="maxValue"               format="string" />
    <attr name="minValue"               format="string" />
    <attr name="value"                  format="string" />
</declare-styleable>

我的自定义NumberPicker小部件:

public class CNumberPicker extends net.simonvt.numberpicker.NumberPicker implements OnClickListener {

    private int maxValue;
    private int minValue;
    private int value;

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

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

    public CNumberPicker(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.CNumberPicker, defStyle, 0);
        processAttributeSet(attrs);

        maxValue = Integer.parseInt(a.getString(R.styleable.CNumberPicker_maxValue));
        minValue = Integer.parseInt(a.getString(R.styleable.CNumberPicker_minValue));

        a.recycle();
        setOnClickListener(this);
    }


    @Override
    public void onClick(View v) {

    }


    private void processAttributeSet(AttributeSet attrs) {
        this.setMaxValue(attrs.getAttributeIntValue(null, "maxValue", 0));
    }

}

我定义的小部件到xml:

<com.sample.widget.CNumberPicker
    android:id="@+id/np_choose_hour"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:layout_marginLeft="10dp"
    android:layout_weight="0.20"
    android:gravity="center_horizontal"
    app:maxValue="10"
    app:minValue="1"
    app:value="5">
</com.sample.widget.CNumberPicker>

如何在布局中设置定义为xml的值?

1 个答案:

答案 0 :(得分:0)

你必须在代码中夸大布局。

public CNumberPicker(Context context) {
    super(context);
    LayoutInflater.from(context).inflate(R.layout.cnumberpicker, this);
}

假设布局文件是cnumberpicker.xml

编辑:这3个函数是构造函数。可以调用其中任何一个来构造对象。通过使用this而不是super,我们可以强制所有构造函数最终调用3参数构造函数。你需要一些凝聚力。每次进行一次更改时,您都不希望复制粘贴代码。

public CNumberPicker(Context context) {
    this(context, null);
}

public CNumberPicker(Context context, AttributeSet attrs) {
    this(context, attrs, 0);
}

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

    TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.CNumberPicker, defStyle, 0);
    processAttributeSet(attrs);

    // this method allows a default value if no attributes are given. You should use them.
    maxValue = Integer.parseInt(a.getString(R.styleable.CNumberPicker_maxValue,"10"));
    minValue = Integer.parseInt(a.getString(R.styleable.CNumberPicker_minValue,"0"));
    a.recycle();
}