Android NumberPicker: Set min, max, default from XML

前端 未结 2 1644
逝去的感伤
逝去的感伤 2020-12-08 06:33

Is there a way to set the minimum, maximum and default values of a NumberPicker from the XML Layout?

I\'m doing it from within the Activity code:

np          


        
相关标签:
2条回答
  • 2020-12-08 06:39

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

    ...or NumberPickerWithXml.java (untested):

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

    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>
    
    0 讨论(0)
  • 2020-12-08 06:56

    I had the same problem, this is how I solved it (according to the comment of MKJParekh):

    1. 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-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. 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

    0 讨论(0)
提交回复
热议问题