2012-09-07 20 views
43

¿Hay alguna manera de establecer los valores mínimo, máximo y predeterminado de NumberPicker desde el diseño XML?Número de serie de Android: predeterminado mín., Máximo de XML

lo estoy haciendo desde dentro del Código de actividad:

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

XML es obviamente más adecuada, ya que define la propiedad, no el comportamiento.

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

+2

Usted podría tener que personalizar NumberPicker y luego usarlo en todas partes MyNumberPicker ... y en el Constructor de MyNumberPicker obtendrá todos los conjuntos de atributos y valores establecidos ... – MKJParekh

+0

@MKJParekh ¿sabe cómo establecer setMaxValue setMinValue para Ti yo selector? http://stackoverflow.com/questions/20188983/how-to-set-the-setmaxvalue-setminvalue-for-time-picker-dailog-fragment –

Respuesta

50

he tenido el mismo problema, esto es cómo lo resolví (de acuerdo con el comentario de MKJParekh):

  1. creé mi propia NumberPicker Clase

    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 usted puede utilizar este NumberPicker en el 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 para su comentario útil

+4

Funciona muy bien, gracias por compartir. Preste atención cuando utilice el editor de diseño gráfico en Eclipse: si cambia algo aquí, las propiedades personalizadas como mínimo y máximo se eliminarán y tendrá que volver a agregarlas manualmente. – pgruetter

+2

Tenga en cuenta que es bueno definir los atributos XML personalizados en 'res/values ​​/ attrs.xml' como se describe en [docs] (https://developer.android.com/training/custom-views/create-view. html # customattr). Esto también permite a los IDEs/editores de diseño reconocer los atributos personalizados. Los documentos también dicen que 'AttributeSet' no se debe usar directamente (como aquí), sino que se debe recuperar un' TypedArray'. – user905686

0

Aquí es una versión actualizada que sigue el Android Docs
(y por lo tanto apoya la tematización de previsualización diseñador & Android Studio)

valores/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> 
Cuestiones relacionadas