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):
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)); }}
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>