Android解析自定义小部件中的数组attr,用于自定义NumberPicker

时间:2015-02-18 06:42:43

标签: android android-widget

我为NumberPicker创建了新的自定义窗口小部件,我希望在array.xml中按数组填充项目以执行此操作我在array.xml中创建新的定义:

<integer-array name="Items">
    <item>1393</item>
    <item>1394</item>
    <item>1395</item>
    <item>1396</item>
    <item>1397</item>
</integer-array>

应用程序attr是:

<declare-styleable name="CNumberPicker">
    <attr name="maxValue"               format="reference" />
    <attr name="minValue"               format="string" />
    <attr name="value"                  format="string" />
    <attr name="displayedValues"        format="string" />
    <attr name="focusable"              format="boolean" />
    <attr name="focusableInTouchMode"   format="boolean" />
</declare-styleable>

在布局xml中定义xustom小部件:

<com.sample.widget.CNumberPicker
    android:id="@+id/np_choose_year"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:layout_weight="0.20"
    android:gravity="center_horizontal" 
    app:maxValue="@array/Items"
    app:minValue="0">
</com.sample.widget.CNumberPicker>

现在在自定义窗口小部件类中,我必须使用setMaxValue为NumberPicker解析数组:

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

private String maxValue;
private String minValue;
private String value;
public CNumberPicker(Context context) {
    super(context);
    //LayoutInflater.from(context).inflate(R.layout.dialog_schedule_date_time, this);
}
public CNumberPicker(Context context, AttributeSet attrs) {
    super(context, attrs);
    init(attrs);
}
public CNumberPicker(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    init(attrs);
}
private void init(AttributeSet attrs) {
    TypedArray a = getContext().obtainStyledAttributes(attrs, R.styleable.CNumberPicker);
    final int id = a.getResourceId(R.styleable.CNumberPicker_maxValue, 0);
    /*final int[] values;
    if (id != 0) {
        values = getResources().getIntArray(id);
    }
    setMaxValue(Collections.max(Arrays.asList(values)));*/
    setMaxValue(Integer.parseInt(a.getString(R.styleable.CNumberPicker_maxValue)));
    setMinValue(Integer.parseInt(a.getString(R.styleable.CNumberPicker_minValue)));
    setValue(Integer.parseInt(a.getString(R.styleable.CNumberPicker_value)));
    a.recycle();
}


@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
    setValue(19);
}

}

‍setMaxValue只接受int而无法解析Array,如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

Items重新定义为字符串数组。

<string-array name="Items">
    <item>1393</item>
    <item>1394</item>
    <item>1395</item>
    <item>1396</item>
    <item>1397</item>
</string-array>

并将您的代码更改为

final String[] values;
if (id != 0) {
    values = getResources().getStringArray(id);
    setDisplayedValues(values);
}