2012-09-07 10 views
43

Esiste un modo per impostare i valori minimo, massimo e predefinito di un NumberPicker dal layout XML?Android NumberPicker: imposta min, max, predefinito da XML

lo sto facendo dall'interno del codice di attività:

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

XML è ovviamente più appropriata, perché definisce proprietà, non il comportamento.

C'è un modo per impostarli utilizzando il layout XML?

+2

potrebbe essere necessario personalizzare NumberPicker e poi usarlo ovunque MyNumberPicker ... e nel Costruttore di MyNumberPicker ottieni tutti gli attributi impostati e imposti i valori ... – MKJParekh

+0

@MKJParekh sai come impostare setMaxValue setMinValue per Ti me selezionatore? http://stackoverflow.com/questions/20188983/how-to-set-the-setmaxvalue-setminvalue-for-time-picker-dailog-fragment –

risposta

50

Ho avuto lo stesso problema, questo è come ho risolto (secondo il commento di MKJParekh):

  1. ho creato il mio 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. ora è possibile utilizzare questo NumberPicker nel file di layout 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" /> 
    

Grazie a MKJParekh per il suo commento utile

+4

Funziona alla grande, grazie per la condivisione. Prestare attenzione quando si utilizza l'editor di layout grafico in Eclipse: se si modifica qualcosa qui, le proprietà personalizzate come min e max verranno eliminate e sarà necessario aggiungerle di nuovo manualmente. – pgruetter

+2

Si noti che è utile definire gli attributi XML personalizzati in 'res/values ​​/ attrs.xml' come descritto in [docs] (https://developer.android.com/training/custom-views/create-view. html # customattr). Ciò consente inoltre agli IDE/editor di layout di riconoscere gli attributi personalizzati. I documenti dicono anche che 'AttributeSet' non dovrebbe essere usato direttamente (come qui), invece si dovrebbe recuperare un' TypedArray'. – user905686

0

Ecco una versione aggiornata che segue il Android Docs
(e dunque consente di tematizzazione & Studio Android progettista anteprima)

valori/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 (non testata):

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