programing

Android NumberPicker : XML에서 최소, 최대, 기본값 설정

yoursource 2021. 1. 15. 19:52
반응형

Android NumberPicker : XML에서 최소, 최대, 기본값 설정


XML 레이아웃에서 NumberPicker 의 최소, 최대 및 기본값을 설정하는 방법이 있습니까?

활동 코드 내에서 수행하고 있습니다.

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

XML은 동작이 아닌 속성을 정의하기 때문에 분명히 더 적절합니다.

XML 레이아웃을 사용하여 설정하는 방법이 있습니까?


나는 같은 문제가 있었는데, 이것이 내가 그것을 해결 한 방법입니다 (MKJParekh의 의견에 따르면).

  1. 나만의 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. 이제 XML 레이아웃 파일에서이 NumberPicker를 사용할 수 있습니다.

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

유용한 의견을 주신 MKJParekh에게 감사드립니다.


다음은 Android 문서 를 따르는 업데이트 된 버전입니다
(따라서 테마 및 Android 스튜디오 디자이너 미리보기 지원).

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

}

... 또는 NumberPickerWithXml.java (테스트되지 않음) :

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

}

레이아웃에서의 사용법 :

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

ReferenceURL : https://stackoverflow.com/questions/12317960/android-numberpicker-set-min-max-default-from-xml

반응형