2012-09-07 15 views
43

Czy istnieje sposób na ustawienie minimalnej, maksymalnej i domyślnej wartości NumberPicker z układu XML?Android Numerpicker: Ustaw min, max, domyślny z XML

Robię to od wewnątrz kodu Aktywny:

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

XML jest oczywiście bardziej odpowiednie, ponieważ określa właściwość, nie zachowanie.

Czy istnieje sposób na ich ustawienie przy użyciu układu XML?

+2

może trzeba dostosować NumberPicker a następnie używać go wszędzie MyNumberPicker ... i w Konstruktorze MyNumberPicker uzyskać wszystkie zestaw atrybutów i ustawić wartości ... – MKJParekh

+0

@MKJParekh Czy wiesz, jak ustawić setMaxValue setMinValue dla Ti mój selektor? http://stackoverflow.com/questions/20188983/how-to-set-the-setmaxvalue-setminvalue-for-time-picker-dailog-fragment –

Odpowiedz

50

miałem ten sam problem, to jak mogę rozwiązać go (zgodnie z komentarzem MKJParekh):

  1. tworzę własne NumberPicker klasy

    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. Teraz możesz skorzystać z tej NumberPicker w pliku xML szablonu

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

Dzięki MKJParekh dla jego użytecznej komentarzu

+4

Działa wspaniale, dzięki za udostępnienie. Zwróć uwagę podczas korzystania z edytora graficznego w Eclipse: jeśli zmienisz cokolwiek tutaj, właściwości niestandardowe, takie jak min i max, zostaną usunięte i musisz je dodać ręcznie ponownie. – pgruetter

+2

Należy zauważyć, że dobrze jest zdefiniować niestandardowe atrybuty XML w pliku 'res/values ​​/ attrs.xml' zgodnie z opisem w [docs] (https://developer.android.com/training/custom-views/create-view. html # customattr). Umożliwia to również rozpoznawanie niestandardowych atrybutów przez edytory IDE/układu. Dokumenty mówią także, że 'AttributeSet' nie powinien być używany bezpośrednio (jak tutaj), zamiast tego należy pobrać' TypedArray'. – user905686

0

Tutaj jest zaktualizowana wersja, która podąża za Android Docs
(a więc obsługuje Skórki & Android Studio projektant podgląd)

wartości/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() 
     } 
    } 

} 

... lub NumberPickerWithXml.java (niesprawdzone):

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

} 

Wykorzystanie w układzie:

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