Android NumberPicker: Set min, max, default from XML Android NumberPicker: Set min, max, default from XML xml xml

Android NumberPicker: Set min, max, default from XML


I had the same problem, this is how I solved it (according to the comment of MKJParekh):

  1. I created my own NumberPicker-Class

    package com.exaple.project;import android.annotation.TargetApi;import android.content.Context;import android.os.Build;import android.util.AttributeSet;import android.widget.NumberPicker;@TargetApi(Build.VERSION_CODES.HONEYCOMB)//For backward-compabilitypublic class MyNumberPicker extends NumberPicker {    public MyNumberPicker(Context context) {        super(context);    }    public MyNumberPicker(Context context, AttributeSet attrs) {        super(context, attrs);        processAttributeSet(attrs);    }    public MyNumberPicker(Context context, AttributeSet attrs, int defStyle) {        super(context, attrs, defStyle);        processAttributeSet(attrs);    }    private void processAttributeSet(AttributeSet attrs) {        //This method reads the parameters given in the xml file and sets the properties according to it        this.setMinValue(attrs.getAttributeIntValue(null, "min", 0));        this.setMaxValue(attrs.getAttributeIntValue(null, "max", 0));    }}
  2. Now you can use this NumberPicker in your xml layout file

    <com.exaple.project.myNumberPicker    android:id="@+id/numberPicker1"    android:layout_width="match_parent"    android:layout_height="wrap_content"    android:layout_gravity="center"    android:orientation="vertical"    max="100"    min="1" />

Thanks to MKJParekh for his useful comment


You can try this:

<NumberPicker  android:id="@+id/number_picker"  android:layout_width="wrap_content"  android:layout_height="wrap_content"  app:minValue="@{0}"  app:maxValue="@{120}"  app:value="@{30}"/>

This works as part of Android Databinding. So, you might want to set it to true in your app level build.gradle.

android {    ...    dataBinding {        enabled true    }}


Here is an updated version that follows the Android Docs
(and thus supports theming & Android Studio designer preview)

values/attrs.xml:

<?xml version="1.0" encoding="utf-8"?><resources>    <declare-styleable name="NumberPickerWithXml">        <attr name="maxValue" format="integer" />        <attr name="minValue" format="integer" />        <attr name="defaultValue" format="integer" />    </declare-styleable></resources>

NumberPickerWithXml.kt:

package com.example.library.uiimport android.content.Contextimport android.util.AttributeSetimport android.widget.NumberPickerimport com.example.library.ui.Rclass NumberPickerWithXml : NumberPicker {    constructor(context: Context) : super(context)    constructor(context: Context, attrs: AttributeSet) : super(context, attrs) {        processXmlAttributes(attrs)    }    constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int) : super(context, attrs, defStyleAttr) {        processXmlAttributes(attrs, defStyleAttr)    }    constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int, defStyleRes: Int) : super(context, attrs, defStyleAttr, defStyleRes) {        processXmlAttributes(attrs, defStyleAttr, defStyleRes)    }    private fun processXmlAttributes(attrs: AttributeSet, defStyleAttr: Int = 0, defStyleRes: Int = 0) {        val attributes = context.theme.obtainStyledAttributes(attrs, R.styleable.NumberPickerWithXml, defStyleAttr, defStyleRes)        try {            this.minValue = attributes.getInt(R.styleable.NumberPickerWithXml_minValue, 0)            this.maxValue = attributes.getInt(R.styleable.NumberPickerWithXml_maxValue, 0)            this.value = attributes.getInt(R.styleable.NumberPickerWithXml_defaultValue, 0)        } finally {            attributes.recycle()        }    }}

...or NumberPickerWithXml.java (untested):

package com.example.library.uiimport android.content.Contextimport android.util.AttributeSetimport android.widget.NumberPickerimport com.example.library.ui.Rpublic class NumberPickerWithXml extends NumberPicker {    public NumberPickerWithXml(Context context) {        super(context);    }    public NumberPickerWithXml(Context context, AttributeSet: attrs) {        super(context, attrs);        processXmlAttributes(attrs, 0, 0);    }    public NumberPickerWithXml(Context context, AttributeSet: attrs, int: defStyleAttr) {        super(context, attrs, defStyleAttr);        processXmlAttributes(attrs, defStyleAttr, 0);    }    public NumberPickerWithXml(Context context, AttributeSet: attrs, int: defStyleAttr, int: defStyleRes) {        super(context, attrs, defStyleAttr, defStyleRes);        processXmlAttributes(attrs, defStyleAttr, defStyleRes);    }    private void processXmlAttributes(AttributeSet: attrs, int: defStyleAttr, int: defStyleRes) {        TypedArray attributes = context.getTheme().obtainStyledAttributes(attrs, R.styleable.NumberPickerWithXml, defStyleAttr, defStyleRes)        try {            this.minValue = attributes.getInt(R.styleable.NumberPickerWithXml_minValue, 0);            this.maxValue = attributes.getInt(R.styleable.NumberPickerWithXml_maxValue, 0);            this.value = attributes.getInt(R.styleable.NumberPickerWithXml_defaultValue, 0);        } finally {            attributes.recycle();        }    }}

Usage in your layout:

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:app="http://schemas.android.com/apk/res-auto"    xmlns:custom="http://schemas.android.com/apk/res-auto"    xmlns:tools="http://schemas.android.com/tools">    <com.example.library.ui.NumberPickerWithXml        android:layout_width="wrap_content"        android:layout_height="wrap_content"        custom:defaultValue="30"        custom:maxValue="120"        custom:minValue="0" /></LinearLayout>