style number library horizontal example custom android xml layout numberpicker

library - custom number picker android



Android NumberPicker: establece min, max, default de XML (2)

Aquí hay una versión actualizada que sigue a los documentos de Android
(y, por lo tanto, es compatible con theing y la vista previa del diseñador de Android Studio)

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.ui import android.content.Context import android.util.AttributeSet import android.widget.NumberPicker import com.example.library.ui.R class 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() } } }

... o NumberPickerWithXml.java (no probado):

package com.example.library.ui import android.content.Context import android.util.AttributeSet import android.widget.NumberPicker import com.example.library.ui.R public 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(); } } }

Uso en su diseño:

<?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>

¿Hay alguna forma de establecer los valores mínimo, máximo y predeterminado de un NumberPicker desde el diseño XML?

Lo estoy haciendo desde el código de la actividad:

np = (NumberPicker) findViewById(R.id.np); np.setMaxValue(120); np.setMinValue(0); np.setValue(30);

XML es obviamente más apropiado, porque define la propiedad, no el comportamiento.

¿Hay alguna manera de configurar estos usando el diseño XML?


Tuve el mismo problema, así es como lo resolví (según el comentario de MKJParekh):

  1. Creé mi propia 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-compability public 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. Ahora puede usar este NumberPicker en su archivo de diseño xml

    <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" />

Gracias a MKJParekh por su útil comentario