มีวิธีการกำหนดค่า min และ max สำหรับ EditText ใน Android หรือไม่?


133

EditTextฉันต้องการที่จะกำหนดนาทีและความคุ้มค่าสูงสุดสำหรับ

ตัวอย่างเช่น: หากบุคคลใดพยายามป้อนค่าเดือนในค่านั้นจะต้องอยู่ระหว่าง 1-12

ฉันสามารถทำได้โดยใช้TextWatcherแต่ฉันต้องการทราบว่ามีวิธีอื่นที่จะทำในรูปแบบไฟล์หรือที่อื่น ๆ

แก้ไข: ฉันไม่ต้องการ จำกัด จำนวนตัวอักษร ฉันต้องการ จำกัด ค่า ตัวอย่างเช่นถ้าฉัน จำกัด เดือนที่มีEditTextตัวอักษร w เมื่อฉันป้อน 12 จะยอมรับ แต่ถ้าฉันป้อน 22 จะต้องไม่ยอมรับในขณะที่ฉันป้อน


ใครบางคนควรสร้างไลบรารี / คอลเลกชันของตัวกรองอินพุตประเภทนี้ทั้งหมด จากนั้นทุกคนสามารถทำงานและทดสอบด้วยกันได้ มากกว่าแต่ละคนทำสิ่งที่ตนเอง
Zapnologica

ใช้ตัวกรองแก้ไขข้อความนี้เพื่อแก้ไขปัญหาของคุณ ตัวกรอง
Taras Smakula

คำตอบ:


286

ทำคลาสนี้ก่อน:

package com.test;

import android.text.InputFilter;
import android.text.Spanned;

public class InputFilterMinMax implements InputFilter {

    private int min, max;

    public InputFilterMinMax(int min, int max) {
        this.min = min;
        this.max = max;
    }

    public InputFilterMinMax(String min, String max) {
        this.min = Integer.parseInt(min);
        this.max = Integer.parseInt(max);
    }

    @Override
    public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {   
        try {
            int input = Integer.parseInt(dest.toString() + source.toString());
            if (isInRange(min, max, input))
                return null;
        } catch (NumberFormatException nfe) { }     
        return "";
    }

    private boolean isInRange(int a, int b, int c) {
        return b > a ? c >= a && c <= b : c >= b && c <= a;
    }
}

จากนั้นใช้สิ่งนี้จากกิจกรรมของคุณ:

EditText et = (EditText) findViewById(R.id.myEditText);
et.setFilters(new InputFilter[]{ new InputFilterMinMax("1", "12")});

นี้จะช่วยให้ผู้ใช้ป้อนค่าตั้งแต่ 1 ถึง 12 เท่านั้น

แก้ไข:

ตั้ง EditText android:inputType="number"ของคุณด้วย

คุณสามารถค้นหารายละเอียดเพิ่มเติมได้ที่https://www.techcompose.com/how-to-set-minimum-and-maximum-value-in-edittext-in-android-app-development/

ขอบคุณ


1
@mertaydin แน่นอน ลองดูแล้วแจ้งให้เราทราบหากคุณต้องการความช่วยเหลือ ขอบคุณ
Pratik Sharma

12
ฉันต้องการความช่วยเหลือ ฉันมีปัญหาในขณะที่เขียนค่าระหว่าง 1930 และ 1999 เมื่อฉันเขียน 1 การควบคุมค่าและ 1 ไม่อยู่ระหว่าง 1930 และ 1999 ดังนั้นจึงไม่ยอมรับ
mertaydin

1
@mertaydin เฮ้ขอโทษ แต่ฉันก็ยุ่งนิดหน่อยกับงานของฉัน ฉันมีเวลาพอที่จะดูเรื่องนี้ฉันคิดว่าฉันต้องทำการแก้ไขในอัลกอริทึมที่ใช้ในคลาสตัวกรอง ฉันจะอัปเดตให้คุณเมื่อฉันทำเสร็จแล้ว
Pratik Sharma

1
อักขระบางตัวจากจะแทนที่อักขระบางตัวในsource destฉันคิดว่าคุณควรจำลองการแทนที่และรับผลลัพธ์สุดท้ายจากนั้นตรวจสอบความถูกต้อง
SD

3
@Pratik Sharma สิ่งนี้ไม่ทำงานเมื่อฉันป้อนช่วง 1900 ถึง 2000 คุณช่วยแนะนำอะไรได้
ไหม

89

มีข้อผิดพลาดเล็กน้อยในรหัสของ Pratik ตัวอย่างเช่นถ้าค่าคือ 10 และคุณเพิ่ม 1 ที่จุดเริ่มต้นที่จะทำให้ 110 ฟังก์ชั่นตัวกรองจะถือว่าค่าใหม่เป็น 101

ดูด้านล่างเพื่อแก้ไขปัญหานี้:

@Override
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
    try {
        // Remove the string out of destination that is to be replaced
        String newVal = dest.toString().substring(0, dstart) + dest.toString().substring(dend, dest.toString().length());
        // Add the new string in
        newVal = newVal.substring(0, dstart) + source.toString() + newVal.substring(dstart, newVal.length());
        int input = Integer.parseInt(newVal);
        if (isInRange(min, max, input))
            return null;
    } catch (NumberFormatException nfe) { }
    return "";
}

ขอบคุณสิ่งนี้ช่วยฉันได้มาก!
joschplusa

4
ฉันคิดว่านี่เป็นสิ่งที่ชัดเจนกว่าimho :String replacement = source.subSequence(start, end).toString(); String newVal = dest.subSequence(0, dstart).toString() + replacement + dest.subSequence(dend, dest.length()).toString();
Sven Jacobs

1
+1 โซลูชันนี้ถูกต้องมากกว่าที่ยอมรับ ในการตรวจสอบเช่นลองใช้InputFilterMinMaxเมื่อเปิดใช้งานตัวเลือกselectAllOnFocusแล้วเปรียบเทียบผลลัพธ์
Sash0k

1
ทำไมไม่String newVal= dest.toString().substring(0, dstart) + source.toString().substring(start, end) + dest.toString().substring(dend, dest.toString().length());ดูสะอาดและชัดเจนมากขึ้น
Shishir Gupta

5
ตามที่กล่าวไว้โดย OP @mertaydin ในความคิดเห็นในคำตอบของ @Patrick การแก้ปัญหานี้ยังคงมีข้อบกพร่องที่สำคัญฉันสงสัยว่าทำไมยังไม่มีรายงาน: ถ้าmin==3เป็นไปไม่ได้ที่จะพิมพ์หมายเลขใด ๆ ที่ขึ้นต้นด้วย 1 หรือ 2 (เช่น: 15, 23)
Guerneen4

10

สิ่งที่ฉันเห็นเกี่ยวกับวิธีแก้ปัญหาของ @ Patrik และการเพิ่มของ @ Zac รหัสที่ให้ไว้ยังคงมีปัญหาใหญ่:

หากmin==3เป็นไปไม่ได้ที่จะพิมพ์หมายเลขใด ๆ ที่ขึ้นต้นด้วย 1 หรือ 2 (เช่น: 15, 23)
หากmin>=10เป็นไปไม่ได้ที่จะพิมพ์ตัวเลขใด ๆ เพราะทุกหมายเลขจะต้องเริ่มต้นด้วย 1,2,3 ...

ในความเข้าใจของฉันเราไม่สามารถบรรลุข้อ จำกัด ขั้นต่ำของEditTextค่าด้วยการใช้คลาสInputFilterMinMaxอย่างน้อยอย่างน้อยไม่ใช่ค่าต่ำสุดเพราะเมื่อผู้ใช้พิมพ์ตัวเลขบวกค่าจะเพิ่มขึ้นและเราสามารถ การทดสอบแบบทันทีเพื่อตรวจสอบว่าถึงขีด จำกัด หรือออกนอกช่วงและบล็อกรายการที่ไม่สอดคล้อง การทดสอบค่า min เป็นเรื่องอื่นเนื่องจากเราไม่สามารถแน่ใจได้ว่าผู้ใช้พิมพ์เสร็จแล้วหรือไม่และดังนั้นจึงไม่สามารถตัดสินใจได้ว่าเราควรบล็อกหรือไม่

มันไม่ตรงตามที่ OP ร้องขอ แต่เพื่อวัตถุประสงค์ในการตรวจสอบฉันได้รวมไว้ในโซลูชันของฉันInputFilterเพื่อทดสอบค่าสูงสุดด้วยการOnFocusChangeListenerทดสอบอีกครั้งสำหรับค่าต่ำสุดเมื่อการEditTextสูญเสียโฟกัสเมื่อสมมติว่าผู้ใช้พิมพ์เสร็จแล้วและมีลักษณะดังนี้:

package test;


import android.text.InputFilter;

import android.text.Spanned;

public class InputFilterMax implements InputFilter {

private int max;

public InputFilterMax(int max) {
    this.max = max;
}

public InputFilterMax(String max) {
    this.max = Integer.parseInt(max);
}

@Override
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {   
    try {
        String replacement = source.subSequence(start, end).toString(); 

        String newVal = dest.toString().substring(0, dstart) + replacement +dest.toString().substring(dend, dest.toString().length());

        int input = Integer.parseInt(newVal);

        if (input<=max)
            return null;
    } catch (NumberFormatException nfe) { }   
//Maybe notify user that the value is not good      
return "";
}
}

และ OnFocusChangeListenerMin

package test;

import android.text.TextUtils;
import android.view.View;
import android.view.View.OnFocusChangeListener;

public class OnFocusChangeListenerMin implements OnFocusChangeListener {

private int min;

public OnFocusChangeListenerMin(int min) {
    this.min = min;
}

public OnFocusChangeListenerMin(String min) {
    this.min = Integer.parseInt(min);
}


@Override
public void onFocusChange(View v, boolean hasFocus) {
    if(!hasFocus) {
        String val = ((EditText)v).getText().toString();
        if(!TextUtils.isEmpty(val)){
            if(Integer.valueOf(val)<min){
                //Notify user that the value is not good
            }

        }
    }
}
}

จากนั้นในกิจกรรมการตั้งค่าInputFilterMaxและOnFocusChangeListenerMinการEditText หมายเหตุ: คุณสามารถทั้ง 2 onFocusChangeListenerนาทีและสูงสุด

mQteEditText.setOnFocusChangeListener( new OnFocusChangeListenerMin('20');
mQteEditText.setFilters(new InputFilter[]{new InputFilterMax(getActivity(),'50')});

OnFocusChangeListenerMin ไม่ทำงานมันทำให้ค่าทั้งหมดจากศูนย์
EminenT

1
คุณอยากทราบรายละเอียดอีกเล็กน้อยหรือไม่ คุณหมายถึงอะไรใส่ค่าทั้งหมดจากศูนย์ ?
Guerneen4

จากรหัส OnFocusChangeListenerMin จะต้องทำงานมากกว่า 20 ดังที่ได้กล่าวไว้ในปัญหาและรับค่าทั้งหมดน้อยกว่า 20 เช่น 0, 1, 2, ------ 19 เป็นต้น
EminenT

คุณพบทางออกหรือไม่?
EminenT

ฉันใช้ OnFoncusChangeListener ในวัตถุประสงค์ของการตรวจสอบในกรณีของฉันฉันแสดงข้อผิดพลาดใน EditText แจ้งให้ผู้ใช้ทราบโดย Toast ว่าค่าไม่ดีและเชิญเขาให้ป้อนค่าใหม่ if(Integer.valueOf(val)<min){ //Notify user that the value is not good } คุณสามารถทำสิ่งที่คุณต้องการที่นั่นได้ ผู้ใช้และตั้งค่า EditText เป็นค่าว่างฉันไม่รู้ว่านี่จะตอบคำถามของคุณได้
ไหม

9

การขยายคำตอบของ Pratik และ Zac Zac แก้ไขข้อผิดพลาดเล็ก ๆ ของ Pratik ในคำตอบของเขา แต่ฉันไม่เห็นรหัสที่ไม่สนับสนุนค่าลบมันจะโยน NumberFormatException ในการแก้ไขและอนุญาตให้ลบ MIN ให้ใช้รหัสต่อไปนี้

เพิ่มบรรทัดนี้ (เป็นตัวหนา) ระหว่างอีกสองบรรทัด:

newVal = newVal.substring (0, dstart) + source.toString () + newVal.substring (dstart, newVal.length ());

if (newVal.equalsIgnoreCase ("-") && min <0) ส่งคืน null

int input = Integer.parseInt (newVal);

public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
    try {
        // Remove the string out of destination that is to be replaced
        String newVal = dest.toString().substring(0, dstart) + dest.toString().substring(dend, dest.toString().length());
        // Add the new string in
        newVal = newVal.substring(0, dstart) + source.toString() + newVal.substring(dstart, newVal.length());
        //****Add this line (below) to allow Negative values***// 
        if(newVal.equalsIgnoreCase("-") && min < 0)return null;
        int input = Integer.parseInt(newVal);
        if (isInRange(min, max, input))
            return null;
    } catch (NumberFormatException nfe) {
        nfe.printStackTrace();
    }
    return "";
}

5

หากคุณต้องการช่วงที่มีตัวเลขติดลบเช่น -90: 90 คุณสามารถใช้โซลูชันนี้

public class InputFilterMinMax implements InputFilter {

private int min, max;

public InputFilterMinMax(int min, int max) {
    this.min = min;
    this.max = max;
}

public InputFilterMinMax(String min, String max) {
    this.min = Integer.parseInt(min);
    this.max = Integer.parseInt(max);
}

@Override
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
    try {
        String stringInput = dest.toString() + source.toString();
        int value;
        if (stringInput.length() == 1 && stringInput.charAt(0) == '-') {
            value = -1;
        } else {
            value = Integer.parseInt(stringInput);
        }
        if (isInRange(min, max, value))
            return null;
    } catch (NumberFormatException nfe) {
    }
    return "";
}

private boolean isInRange(int min, int max, int value) {
    return max > min ? value >= min && value <= max : value >= max && value <= min;
}
}

5

ฉันขยายรหัส @Pratik Sharmas เพื่อใช้วัตถุ BigDecimal แทน ints เพื่อให้สามารถรับจำนวนที่มากขึ้นและบัญชีสำหรับการจัดรูปแบบใด ๆ ใน EditText ที่ไม่ใช่ตัวเลข (เช่นการจัดรูปแบบสกุลเงินเช่นช่องว่างเครื่องหมายจุลภาคและจุด)

แก้ไข: โปรดทราบว่าการใช้งานนี้มี 2 เป็นตัวเลขนัยสำคัญขั้นต่ำที่กำหนดไว้ใน BigDecimal (ดูค่าคงที่ MIN_SIG_FIG) ตามที่ฉันใช้สำหรับสกุลเงินดังนั้นจึงมีตัวเลขนำหน้า 2 เสมอเสมอก่อนจุดทศนิยม แก้ไขค่าคงที่ MIN_SIG_FIG ตามที่จำเป็นสำหรับการใช้งานของคุณเอง

public class InputFilterMinMax implements InputFilter {
private static final int MIN_SIG_FIG = 2;
private BigDecimal min, max;

public InputFilterMinMax(BigDecimal min, BigDecimal max) {
    this.min = min;
    this.max = max;
}

public InputFilterMinMax(String min, String max) {
    this.min = new BigDecimal(min);
    this.max = new BigDecimal(max);
}

@Override
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart,
        int dend) {
    try {
        BigDecimal input = formatStringToBigDecimal(dest.toString()
                + source.toString());

        if (isInRange(min, max, input)) {

            return null;
        }
    } catch (NumberFormatException nfe) {

    }
    return "";
}

private boolean isInRange(BigDecimal a, BigDecimal b, BigDecimal c) {
    return b.compareTo(a) > 0 ? c.compareTo(a) >= 0 && c.compareTo(b) <= 0
            : c.compareTo(b) >= 0 && c.compareTo(a) <= 0;
}

public static BigDecimal formatStringToBigDecimal(String n) {

    Number number = null;
    try {
        number = getDefaultNumberFormat().parse(n.replaceAll("[^\\d]", ""));

        BigDecimal parsed = new BigDecimal(number.doubleValue()).divide(new BigDecimal(100), 2,
                BigDecimal.ROUND_UNNECESSARY);
        return parsed;
    } catch (ParseException e) {
        return new BigDecimal(0);
    }
}

private static NumberFormat getDefaultNumberFormat() {
    NumberFormat nf = NumberFormat.getInstance(Locale.getDefault());
    nf.setMinimumFractionDigits(MIN_SIG_FIG);
    return nf;
}

4

ฉันพบคำตอบของฉันเอง มันช้ามากแล้ว แต่ฉันต้องการแบ่งปันกับคุณ ฉันใช้อินเทอร์เฟซนี้:

import android.text.TextWatcher;


public abstract class MinMaxTextWatcher implements TextWatcher {
    int min, max;
    public MinMaxTextWatcher(int min, int max) {
        super();
        this.min = min;
        this.max = max;
    }

}

และนำไปใช้ในกิจกรรมของคุณ:

private void limitEditText(final EditText ed, int min, int max) {
    ed.addTextChangedListener(new MinMaxTextWatcher(min, max) {
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {

        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {

        }

        @Override
        public void afterTextChanged(Editable s) {
            String str = s.toString();
            int n = 0;
            try {
                n = Integer.parseInt(str);
                if(n < min) {
                    ed.setText(min);
                    Toast.makeText(getApplicationContext(), "Minimum allowed is " + min, Toast.LENGTH_SHORT).show();
                }
                else if(n > max) {
                    ed.setText("" + max);
                    Toast.makeText(getApplicationContext(), "Maximum allowed is " + max, Toast.LENGTH_SHORT).show();
                }
            }
            catch(NumberFormatException nfe) {
                ed.setText("" + min);
                Toast.makeText(getApplicationContext(), "Bad format for number!" + max, Toast.LENGTH_SHORT).show();
            }
        }
    });
}

นี่เป็นคำตอบที่ง่ายมาก ๆ ถ้ามีโปรดบอกฉันหน่อย


int n = 0; ซ้ำซ้อน เนื่องจากค่าเริ่มต้นของ n คือ 0
Kenny Dabiri

1
ทำไม int n = 0 ซ้ำซ้อนที่นี่ เป็นตัวแปรโลคัลและไม่ใช่อินสแตนซ์ตัวแปรที่นี่
12111111

4

มีบางอย่างผิดปกติในคำตอบที่ยอมรับได้

int input = Integer.parseInt(dest.toString() + source.toString());

หากฉันเลื่อนเคอร์เซอร์ไปที่กลางข้อความให้พิมพ์บางอย่างคำสั่งด้านบนจะให้ผลลัพธ์ที่ผิด ตัวอย่างเช่นพิมพ์ "12" ก่อนจากนั้นพิมพ์ "0" ระหว่าง 1 ถึง 2 จากนั้นคำสั่งที่กล่าวถึงข้างต้นจะสร้าง "120" แทน 102 ฉันแก้ไขคำสั่งนี้เป็นข้อความด้านล่าง:

String destString = dest.toString();
  String inputString = destString.substring(0, dstart) + source.toString() + destString.substring(dstart);
  int input = Integer.parseInt(inputString);

4

Kotlin ถ้ามีใครต้องการมัน (ใช้ยูทิลิตี้)

class InputFilterMinMax: InputFilter {
    private var min:Int = 0
    private var max:Int = 0
    constructor(min:Int, max:Int) {
        this.min = min
        this.max = max
    }
    constructor(min:String, max:String) {
        this.min = Integer.parseInt(min)
        this.max = Integer.parseInt(max)
    }
    override fun filter(source:CharSequence, start:Int, end:Int, dest: Spanned, dstart:Int, dend:Int): CharSequence? {
        try
        {
            val input = Integer.parseInt(dest.toString() + source.toString())
            if (isInRange(min, max, input))
                return null
        }
        catch (nfe:NumberFormatException) {}
        return ""
    }
    private fun isInRange(a:Int, b:Int, c:Int):Boolean {
        return if (b > a) c in a..b else c in b..a
    }
}

จากนั้นใช้สิ่งนี้จากคลาส Kotlin ของคุณ

percentage_edit_text.filters = arrayOf(Utilities.InputFilterMinMax(1, 100))

EditText นี้อนุญาตตั้งแต่ 1 ถึง 100

จากนั้นใช้สิ่งนี้จาก XML ของคุณ

android:inputType="number"

ฉันใช้ return source และทำงานให้ฉัน ==> if (isInRange (min, max, input)) return source
Muzafferus

3

ฉันสร้างวิธีที่ง่ายกว่าในการตั้งค่า min / max เป็น Edittext ฉันใช้ปุ่มกดทางคณิตศาสตร์และฉันทำงานกับวิธีนี้:

 private int limit(EditText x,int z,int limin,int limax){

    if( x.getText().toString()==null || x.getText().toString().length()==0){
        x.setText(Integer.toString(limin));
        return z=0;
    }
    else{
        z = Integer.parseInt(x.getText().toString());
         if(z <limin || z>limax){
             if(z<10){
                 x.setText(Integer.toString(limin));
                return  z=0;
             }
            else{
                x.setText(Integer.toString(limax));
                return z=limax;
            }

         }
         else
            return z = Integer.parseInt(x.getText().toString());
    }
 }

วิธีการยอมรับค่าทั้งหมดของคุณ แต่ถ้าค่าของผู้ใช้ไม่เป็นไปตามข้อ จำกัด ของคุณมันจะถูกตั้งค่าโดยอัตโนมัติเป็นขีด จำกัด ขั้นต่ำ / สูงสุด สำหรับอดีต ขีด จำกัด limin = 10, limax = 80 หากผู้ใช้ตั้ง 8, 10 โดยอัตโนมัติจะถูกบันทึกไว้ในตัวแปรและ EditText ถูกตั้งค่าเป็น 10


3

ฉันรู้ว่ามีคำตอบนับล้านสำหรับสิ่งนี้อยู่แล้วพร้อมกับได้รับการยอมรับ อย่างไรก็ตามมีข้อบกพร่องมากมายในคำตอบที่ได้รับการยอมรับและส่วนที่เหลือส่วนใหญ่เพียงแก้ไขหนึ่ง (หรืออาจสอง) ของพวกเขาโดยไม่ขยายไปใช้ทุกกรณีที่เป็นไปได้

ดังนั้นฉันจึงรวบรวมการแก้ไขข้อบกพร่องส่วนใหญ่ที่แนะนำในคำตอบการสนับสนุนรวมถึงการเพิ่มวิธีการอนุญาตให้ใส่ตัวเลขอย่างต่อเนื่องนอกช่วงในทิศทางของ 0 (ถ้าช่วงไม่เริ่มที่ 0) อย่างน้อยก็จนกว่ามันจะ บางอย่างไม่สามารถอยู่ในช่วงได้อีกต่อไป เพราะเพื่อความชัดเจนนี่เป็นครั้งเดียวที่ทำให้เกิดปัญหากับโซลูชั่นอื่น ๆ มากมาย

นี่คือการแก้ไข:

public class InputFilterIntRange implements InputFilter, View.OnFocusChangeListener {

    private final int min, max;

    public InputFilterIntRange(int min, int max) {
        if (min > max) {
            // Input sanitation for the filter itself
            int mid = max;
            max = min;
            min = mid;
        }
        this.min = min;
        this.max = max;
    }

    @Override
    public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {

        // Determine the final string that will result from the attempted input
        String destString = dest.toString();
        String inputString = destString.substring(0, dstart) + source.toString() + destString.substring(dstart);

        // Don't prevent - sign from being entered first if min is negative
        if (inputString.equalsIgnoreCase("-") && min < 0) return null;

        try {
            int input = Integer.parseInt(inputString);
            if (mightBeInRange(input))
                return null;
        } catch (NumberFormatException nfe) {}

        return "";
    }

    @Override
    public void onFocusChange(View v, boolean hasFocus) {

        // Since we can't actively filter all values
        // (ex: range 25 -> 350, input "15" - could be working on typing "150"),
        // lock values to range after text loses focus
        if (!hasFocus) {
            if (v instanceof EditText) sanitizeValues((EditText) v);
        }
    }

    private boolean mightBeInRange(int value) {
        // Quick "fail"
        if (value >= 0 && value > max) return false;
        if (value >= 0 && value >= min) return true;
        if (value < 0 && value < min) return false;
        if (value < 0 && value <= max) return true;

        boolean negativeInput = value < 0;

        // If min and max have the same number of digits, we can actively filter
        if (numberOfDigits(min) == numberOfDigits(max)) {
            if (!negativeInput) {
                if (numberOfDigits(value) >= numberOfDigits(min) && value < min) return false;
            } else {
                if (numberOfDigits(value) >= numberOfDigits(max) && value > max) return false;
            }
        }

        return true;
    }

    private int numberOfDigits(int n) {
        return String.valueOf(n).replace("-", "").length();
    }

    private void sanitizeValues(EditText valueText) {
        try {
            int value = Integer.parseInt(valueText.getText().toString());
            // If value is outside the range, bring it up/down to the endpoint
            if (value < min) {
                value = min;
                valueText.setText(String.valueOf(value));
            } else if (value > max) {
                value = max;
                valueText.setText(String.valueOf(value));
            }
        } catch (NumberFormatException nfe) {
            valueText.setText("");
        }
    }

}

โปรดทราบว่าบางกรณีป้อนข้อมูลเป็นไปไม่ได้ที่จะจัดการ "อย่างแข็งขัน" (เช่นในขณะที่ผู้ใช้กำลังป้อนข้อมูล) ดังนั้นเราจึงต้องละเว้นและจัดการกับพวกเขาหลังจากที่ผู้ใช้ทำการแก้ไขข้อความเสร็จแล้ว

นี่คือวิธีที่คุณจะใช้:

EditText myEditText = findViewById(R.id.my_edit_text);
InputFilterIntRange rangeFilter = new InputFilterIntRange(25, 350);
myEditText.setFilters(new InputFilter[]{rangeFilter});

// Following line is only necessary if your range is like [25, 350] or [-350, -25].
// If your range has 0 as an endpoint or allows some negative AND positive numbers, 
// all cases will be handled pre-emptively.
myEditText.setOnFocusChangeListener(rangeFilter);

ตอนนี้เมื่อผู้ใช้พยายามพิมพ์ตัวเลขที่ใกล้เคียงกับ 0 มากกว่าช่วงที่อนุญาตหนึ่งในสองสิ่งจะเกิดขึ้น:

  1. หากminและmaxมีจำนวนตัวเลขเท่ากันพวกเขาจะไม่ได้รับอนุญาตให้ป้อนข้อมูลเลยเมื่อพวกเขาไปถึงตัวเลขสุดท้าย

  2. หากตัวเลขที่อยู่นอกช่วงนั้นเหลืออยู่ในฟิลด์เมื่อข้อความสูญเสียโฟกัสจะถูกปรับเป็นขอบเขตที่ใกล้เคียงที่สุดโดยอัตโนมัติ

และแน่นอนว่าผู้ใช้จะไม่ได้รับอนุญาตให้ป้อนค่าที่อยู่ห่างจาก 0 มากกว่าช่วงที่อนุญาตและไม่สามารถเป็นไปได้สำหรับจำนวนเช่นนั้นถึง "ตั้งใจ" ในช่องข้อความด้วยเหตุนี้

ปัญหาที่ทราบแล้ว

  1. วิธีนี้จะใช้งานได้ก็ต่อEditTextเมื่อผู้ใช้เสียโฟกัสไปแล้ว

ตัวเลือกอื่น ๆ คือการฆ่าเชื้อเมื่อผู้ใช้กดปุ่ม "เสร็จสิ้น" / ส่งคืน แต่ในกรณีส่วนใหญ่หรือส่วนใหญ่สิ่งนี้ทำให้สูญเสียการโฟกัสตลอดเวลา

อย่างไรก็ตามการปิดคีย์บอร์ดอ่อนจะไม่ยกเลิกการโฟกัสไปที่องค์ประกอบโดยอัตโนมัติ ฉันมั่นใจว่า 99.99% ของนักพัฒนา Android ต้องการ (และการจัดการกับEditTextองค์ประกอบนั้นโดยทั่วไปแล้วจะมีจำนวนน้อยกว่าของบึง) แต่ ณ ขณะนี้ยังไม่มีฟังก์ชั่นในตัว วิธีที่ง่ายที่สุดที่ฉันพบว่าสามารถหลีกเลี่ยงได้ถ้าคุณต้องการคือการขยายEditTextสิ่งนี้:

public class EditTextCloseEvent extends AppCompatEditText {

    public EditTextCloseEvent(Context context) {
        super(context);
    }

    public EditTextCloseEvent(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public EditTextCloseEvent(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    @Override
    public boolean onKeyPreIme(int keyCode, KeyEvent event) {
        if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) {
            for (InputFilter filter : this.getFilters()) {
                if (filter instanceof InputFilterIntRange)
                    ((InputFilterIntRange) filter).onFocusChange(this, false);
            }
        }
        return super.dispatchKeyEvent(event);
    }
}

นี้จะ "เคล็ดลับ" กรองเข้าไปฆ่าเชื้ออินพุตแม้ว่ามุมมองได้ไม่จริงหายไปโฟกัส หากมุมมองเกิดขึ้นในภายหลังจะสูญเสียการโฟกัสด้วยตัวเองการสุขาภิบาลอินพุตจะทริกเกอร์อีกครั้ง แต่จะไม่มีอะไรเปลี่ยนแปลงเนื่องจากมันได้รับการแก้ไขแล้ว

ปิด

ต๊าย นั่นเป็นจำนวนมาก สิ่งที่ดูเหมือนว่าในตอนแรกมันจะเป็นปัญหาที่ง่ายนิดเดียวที่จบลงด้วยการเปิดเผยวานิลลาชิ้นเล็ก ๆ น้อย ๆ ที่น่าเกลียดของ Android (อย่างน้อยใน Java) และอีกครั้งคุณจะต้องเพิ่มผู้ฟังและขยายEditTextถ้าช่วงของคุณไม่รวม 0 อย่างใด (และแนบเนียนถ้าช่วงของคุณไม่รวม 0 แต่เริ่มต้นที่ 1 หรือ -1 คุณจะไม่ประสบปัญหา)

ในฐานะที่เป็นบันทึกล่าสุดสิ่งนี้ใช้ได้กับintsเท่านั้น มีวิธีที่จะนำมันมาใช้เพื่อทำงานกับทศนิยม ( double, float) แต่เนื่องจากทั้งตัวฉันและผู้ถามดั้งเดิมไม่มีความต้องการสิ่งนั้นฉันจึงไม่ต้องการให้ลึกลงไปในนั้น มันจะง่ายมากที่จะใช้ตัวกรองหลังเสร็จสิ้นพร้อมกับบรรทัดต่อไปนี้:

// Quick "fail"
if (value >= 0 && value > max) return false;
if (value >= 0 && value >= min) return true;
if (value < 0 && value < min) return false;
if (value < 0 && value <= max) return true;

คุณจะต้องเปลี่ยนจากintเป็นfloat(หรือdouble) อนุญาตการแทรกเดี่ยว.(หรือ,ขึ้นอยู่กับประเทศ?) และแยกเป็นทศนิยมประเภทใดประเภทหนึ่งแทนintและแยกเป็นหนึ่งในประเภททศนิยมแทน

ที่จัดการงานส่วนใหญ่อย่างไรก็ตามมันจะทำงานคล้ายกันมาก


2
@Override
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
    try {
        String prefix = dest.toString().substring(0, dstart);
        String insert = source.toString();
        String suffix = dest.toString().substring(dend);
        String input_string = prefix + insert + suffix;
        int input = Integer.parseInt(input_string);

        if (isInRange(min, max, input) || input_string.length() < String.valueOf(min).length())
            return null;
    } catch (NumberFormatException nfe) { }
    return "";
}

private boolean isInRange(int a, int b, int c) {
    return b > a ? c >= a && c <= b : c >= b && c <= a;
}

2

ตัวอย่างที่ง่ายมากใน Kotlin:

import android.text.InputFilter
import android.text.Spanned

class InputFilterRange(private var range: IntRange) : InputFilter {

    override fun filter(source: CharSequence, start: Int, end: Int, dest: Spanned, dstart: Int, dend: Int) = try {
        val input = Integer.parseInt(dest.toString() + source.toString())
        if (range.contains(input)) null else ""
    } catch (nfe: NumberFormatException) {
        ""
    }
}

1

กรุณาตรวจสอบรหัสนี้

    String pass = EditText.getText().toString(); 
    if(TextUtils.isEmpty(pass) || pass.length < [YOUR MIN LENGTH]) 
    { 
       EditText.setError("You must have x characters in your txt"); 
        return; 
    }

    //continue processing



edittext.setOnFocusChangeListener( new OnFocusChangeListener() {

       @Override
       public void onFocusChange(View v, boolean hasFocus) {
          if(hasFocus) {
           // USE your code here 
  }

ใช้ลิงค์ด้านล่างเพื่อดูรายละเอียดเพิ่มเติมเกี่ยวกับ edittext และตัวกรอง edittextfilteres พร้อม text text ..

http://www.mobisoftinfotech.com/blog/android/android-edittext-setfilters-example-numeric-text-field-patterns-and-length-restriction/


OP ต้องการตรวจสอบเมื่อมีการป้อนค่า ฉันคิดว่าคุณให้วิธีแก้ปัญหาสำหรับสถานการณ์หลังจากป้อนค่าแล้ว
MysticMagicϡ

ฉันไม่ใช่ผู้ถาม ฉันแค่สงสัยเกี่ยวกับคำตอบของคุณดังนั้นฉันจึงอธิบายให้ชัดเจน
MysticMagicϡ

ฉันไม่ต้องการตรวจสอบจำนวนตัวละคร ฉันคิดว่าคุณกำลังพยายามตรวจสอบการนับในรหัสนี้: if (TextUtils.isEmpty (pass) || pass.length <[ความยาวขั้นต่ำของคุณ]) ฉันเพิ่ง จำกัด ค่าตัวอย่างเช่นค่าเดือนผู้ใช้ต้องเขียนค่าระหว่าง 1-12 ไม่ใช่ 13,14 หรืออื่น ๆ ดังนั้น 12,13,14 จนกระทั่ง 99 มีความยาว 2 อักขระ
mertaydin

สวัสดี @mertaydin คุณลองใช้ลิงก์ที่ฉันให้ไว้คุณ .. ดูตัวอย่างไหม .. อาจเป็นสิ่งที่คุณต้องการ มันจะดูข้อความในขณะที่คุณกำลังเข้า ..
itsrajesh4uguys

โอเคขอบคุณฉันจะลองตอบคุณและคำตอบของ @Pratik Sharma
mertaydin

1

หากคุณกังวลเกี่ยวกับขีด จำกัด สูงสุดเพียงเพิ่มบรรทัดด้านล่าง

android:maxLength="10" 

หากคุณต้องการเพิ่มขีด จำกัด ขั้นต่ำคุณสามารถทำเช่นนี้ในกรณีนี้ขีด จำกัด ขั้นต่ำคือ 7. ผู้ใช้ถูก จำกัด ให้ป้อนอักขระระหว่างขีด จำกัด ขั้นต่ำและสูงสุด (ในระหว่าง 8 ถึง 10)

public final static boolean isValidCellPhone(String number){
        if (number.length() < 8 || number.length() >10 ) {
            return false;
        } else {

           return android.util.Patterns.PHONE.matcher(number).matches();
        }
    }

หากคุณจำเป็นต้อง จำกัด ผู้ใช้ให้ป้อน 01 เมื่อเริ่มต้นแล้วแก้ไขหากเงื่อนไขเช่นนี้

if (!(number.startsWith("01")) || number.length() < 8 || number.length() >10 ) {  
.
.
.
}

ที่วิธีการวางสายเช่น

   ....else if (!(Helper.isValidMobilePhone(textMobileNo))){
                        Helper.setEditTextError(etMobileNo,"Invalid Mobile Number");
                    }......

2
นั่นไม่ใช่ vlaue นั่นคือความยาว
portfoliobuilder

1

@Pratik Sharma

สำหรับรองรับตัวเลขติดลบให้เพิ่มรหัสต่อไปนี้ภายในวิธีการกรอง :

package ir.aboy.electronicarsenal;

import android.text.InputFilter;
import android.text.Spanned;

public class InputFilterMinMax implements InputFilter {

  private int min, max;
  int input;

  InputFilterMinMax(int min, int max) {
    this.min = min;
    this.max = max;
  }

  public InputFilterMinMax(String min, String max) {
    this.min = Integer.parseInt(min);
    this.max = Integer.parseInt(max);
  }

  @Override
  public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
    try {

      if ((dest.toString() + source.toString()).equals("-")) {
        source = "-1";
      }

      input = Integer.parseInt(dest.toString() + source.toString());
      if (isInRange(min, max, input))
        return null;

    } catch (NumberFormatException ignored) {
    }
    return "";
  }

  private boolean isInRange(int a, int b, int c) {
    return b > a ? c >= a && c <= b : c >= b && c <= a;
  }

}

จากนั้นใช้สิ่งนี้จากกิจกรรมของคุณ:

findViewById(R.id.myEditText).setFilters(new InputFilter[]{ new InputFilterMinMax(1, 12)});

ตั้งค่า edittext ของคุณด้วย:

android:inputType="number|numberSigned"

0

// ยังมีปัญหาอยู่บ้าง แต่ที่นี่คุณสามารถใช้ min, max ได้ทุกช่วงเวลา (บวกหรือลบ)

// in filter calss
 @Override
 public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
        try {
            // Remove the string out of destination that is to be replaced
            int input;
            String newVal = dest.toString() + source.toString();
            if (newVal.length() == 1 && newVal.charAt(0) == '-') {
                input = min; //allow
            }
            else {
                newVal = dest.toString().substring(0, dstart) + dest.toString().substring(dend, dest.toString().length());
                // Add the new string in
                newVal = newVal.substring(0, dstart) + source.toString() + newVal.substring(dstart, newVal.length());
                input = Integer.parseInt(newVal);
            }

            //int input = Integer.parseInt(dest.toString() + source.toString());

            if (isInRange(min, max, input))
                return null;
        } catch (NumberFormatException nfe) {
        }
        return "";
    }

//also the filler must set as below: in the edit createview
// to allow enter number and backspace.
et.setFilters(new InputFilter[]{new InputFilterMinMax(min >= 10 ?  "0" : String.valueOf(min), max >-10 ? String.valueOf(max) :"0" )});



//and at same time must check range in the TextWatcher()
et.addTextChangedListener(new
 TextWatcher() {

      @Override
      public void afterTextChanged (Editable editable)
      {
         String tmpstr = et.getText().toString();
         if (!tmpstr.isEmpty() && !tmpstr.equals("-") ) {
             int datavalue = Integer.parseInt(tmpstr);
             if ( datavalue >= min || datavalue <= max) {
               // accept data ...     
             }
         }
      }
 });

0

หากต้องการเพิ่มคำตอบของ Pratik นี่คือรุ่นที่แก้ไขซึ่งผู้ใช้สามารถป้อนตัวเลขขั้นต่ำ 2 หลักเช่น 15 ถึง 100:

 import android.text.InputFilter;
 import android.text.Spanned;

public class InputFilterMinMax implements InputFilter {

    private int min, max;

    public InputFilterMinMax(int min, int max) {
        this.min = min;
        this.max = max;
    }

    public InputFilterMinMax(String min, String max) {
        this.min = Integer.parseInt(min);
        this.max = Integer.parseInt(max);
    }

    @Override
    public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {

        try {
            if(end==1)
                min=Integer.parseInt(source.toString());
            int input = Integer.parseInt(dest.toString() + source.toString());
            if (isInRange(min, max, input))
                return null;
        } catch (NumberFormatException nfe) {
        }
        return "";
    }

    private boolean isInRange(int a, int b, int c) {

        return b > a ? c >= a && c <= b : c >= b && c <= a;
    }}

เพิ่ม: ถ้า (สิ้นสุด == 1) min = Integer.parseInt (source.toString ());

หวังว่านี่จะช่วยได้ กรุณาอย่าลงคะแนนโดยไม่มีเหตุผล


0

นี่คือวิธีที่ฉันใช้มันทำงานเพื่อลบจำนวน

ก่อนอื่นให้สร้างคลาส MinMaxFIlter.java ด้วยรหัสต่อไปนี้:

import android.text.InputFilter;
import android.text.Spanned;
import android.util.Log;

/**
* Created by 21 on 4/5/2016.
*/
public class MinMaxFilter implements InputFilter {

private double mIntMin, mIntMax;

public MinMaxFilter(double minValue, double maxValue) {
    this.mIntMin = minValue;
    this.mIntMax = maxValue;
}

public MinMaxFilter(String minValue, String maxValue) {
    this.mIntMin = Double.parseDouble(minValue);
    this.mIntMax = Double.parseDouble(maxValue);
}

@Override
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
    try {
        Boolean isNeg = false;
        String provi = dest.toString() + source.toString();
        if("-".equals(provi.substring(0,1))){
            if(provi.length()>1) {
                provi = provi.substring(1, provi.length());
                isNeg = true;
            }
            else{
                if("".equals(source)){
                    return null;
                }
                return "-";
            }
        }

        double input = Double.parseDouble(provi); 
        if(isNeg){input = input * (-1);}

        if (isInRange(mIntMin, mIntMax, input)) {
            return null;
        }
    } catch (Exception nfe) {}
    return "";
}

private boolean isInRange(double a, double b, double c) {
    if((c>=a && c<=b)){
        return true;
    }
    else{
        return false;
    }
}
}

จากนั้นสร้างและตั้งค่าตัวกรองของคุณเป็น edittext ดังนี้:

EditText edittext = new EditText(context);
editext.setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_SIGNED);
eInt.setFilters(new InputFilter[]{new MinMaxFilter(min, max)});

0

นี่คือรหัสของฉัน max = 100, min = 0

XML

<TextView
                    android:id="@+id/txt_Mass_smallWork"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:textColor="#000"
                    android:textSize="20sp"
                    android:textStyle="bold" />

ชวา

EditText ed = findViewById(R.id.txt_Mass_smallWork);
    ed.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {`

        }

        @Override
        public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
            if(!charSequence.equals("")) {
                int massValue = Integer.parseInt(charSequence.toString());
                if (massValue > 10) {
                    ed.setFilters(new InputFilter[]{new InputFilter.LengthFilter(2)});
                } else {
                    ed.setFilters(new InputFilter[]{new InputFilter.LengthFilter(3)});
                }
            }
        }

        @Override
        public void afterTextChanged(Editable editable) {

        }
    });

0

คุณสามารถทำได้ด้วย InputFilter เห็นได้ชัดว่ามีเพียงอินเทอร์เฟซตัวกรองอินพุตที่คุณสามารถใช้ได้ ก่อนที่คุณจะทำสิ่งที่น่ารำคาญในการสร้างคลาสใหม่ที่ขยายตัวกรองอินพุตคุณสามารถใช้ช็อตคัตนี้ด้วยอินสแตนซ์อินเทอร์เฟซอินเลเยอร์คลาส

ดังนั้นคุณเพียงแค่ทำสิ่งนี้:

EditText subTargetTime = (EditText) findViewById(R.id.my_time);
subTargetTime.setFilters( new InputFilter[] {
                new InputFilter() {
                    @Override
                    public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
                        int t = Integer.parseInt(source.toString());
                        if(t <8) { t = 8; }
                        return t+"";

                    }
                }
        });

ในตัวอย่างนี้ฉันตรวจสอบว่าค่าของ EditText มากกว่า 8 หรือไม่ถ้าไม่ใช่ให้ตั้งค่าเป็น 8 ดังนั้นคุณต้องสมัครกับ min max หรือตรรกะตัวกรองใด ๆ ด้วยตัวเอง แต่อย่างน้อยคุณสามารถเขียนลอจิกตัวกรองให้เรียบร้อยและสั้นลงใน EditText ได้โดยตรง

หวังว่านี่จะช่วยได้


0

เพื่อกำหนดค่าต่ำสุดของ EditText ฉันใช้สิ่งนี้:

if (message.trim().length() >= 1 && message.trim().length() <= 12) {
  // do stuf
} else {
  // Too short or too long
}

0

รหัสของ @ Patrik มีความคิดที่ดี แต่มีข้อบกพร่องมากมาย @Zac และ @Anthony B (โซลูชันตัวเลขลบ) ได้แก้ปัญหาบางส่วน แต่รหัสของ @ Zac ยังคงมีข้อบกพร่องของนายกเทศมนตรี 3 รายการ:

1. หากผู้ใช้ลบรายการทั้งหมดใน EditText เป็นไปไม่ได้ที่จะพิมพ์ตัวเลขใด ๆ อีกครั้งแน่นอนว่าสิ่งนี้สามารถควบคุมได้โดยใช้ EditText ที่เปลี่ยนฟังบนแต่ละฟิลด์ แต่มันจะลบความสวยงามของการใช้คลาส InputFilter ทั่วไปสำหรับแต่ละรายการ แก้ไขข้อความในแอปของคุณ

2. มี @ Guernee4 กล่าวว่าถ้าเช่น min = 3 เป็นไปไม่ได้ที่จะพิมพ์หมายเลขใด ๆ ที่ขึ้นต้นด้วย 1

3 หากตัวอย่างเช่น min = 0 คุณสามารถพิมพ์ได้โดยมีศูนย์เป็นจำนวนมากที่คุณต้องการนั่นไม่ใช่ผลลัพธ์ที่สวยงาม หรือถ้าไม่ว่าอะไรคือค่าต่ำสุดผู้ใช้สามารถวางเคอร์เซอร์ในขนาดซ้ายของตัวเลขแรกวางพวงของศูนย์นำไปทางซ้ายและไม่สง่า

ฉันมาที่การเปลี่ยนแปลงเล็กน้อยของรหัส @ Zac เหล่านี้เพื่อแก้ไขข้อบกพร่อง 3 ข้อนี้ เกี่ยวกับข้อผิดพลาด # 3 ฉันยังไม่สามารถลบศูนย์นำทั้งหมดทางซ้ายได้อย่างสมบูรณ์ มันสามารถเป็นหนึ่งได้ แต่ 00, 01, 0100 และอื่น ๆ ในกรณีนั้นจะมีความสวยงามมากกว่าที่ถูกต้องที่ 000000, 001, 000100 และอื่น ๆ เป็นต้น

นี่คือรหัส:

@Override
    public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
        try {

            // Using @Zac's initial solution
            String lastVal = dest.toString().substring(0, dstart) + dest.toString().substring(dend);
            String newVal = lastVal.substring(0, dstart) + source.toString() + lastVal.substring(dstart);
            int input = Integer.parseInt(newVal);

            // To avoid deleting all numbers and avoid @Guerneen4's case
            if (input < min && lastVal.equals("")) return String.valueOf(min);

            // Normal min, max check
            if (isInRange(min, max, input)) {

                // To avoid more than two leading zeros to the left
                String lastDest = dest.toString();
                String checkStr = lastDest.replaceFirst("^0+(?!$)", "");
                if (checkStr.length() < lastDest.length()) return "";

                return null;
            }
        } catch (NumberFormatException ignored) {}
        return "";
    }

ขอให้มีความสุขมาก ๆ ในวันนี้!


-1

นี่คือคำตอบของฉันสำหรับ Pratik Sharma KotlinและDoubleถ้ามีใครต้องการมัน

class InputFilterMinMax : InputFilter {

private var min: Double = MIN_LIMIT
private var max: Double = MIN_LIMIT

constructor(min: Int, max: Int) {
    this.min = min.toDouble()
    this.max = max.toDouble()
}

constructor(min: String, max: String) {
    this.min = min.toDouble()
    this.max = max.toDouble()
}

constructor(min: Double, max: Double) {
    this.min = min
    this.max = max
}

override fun filter(
    source: CharSequence,
    start: Int,
    end: Int,
    dest: Spanned,
    dstart: Int,
    dend: Int
): CharSequence? {
    try {
        val input = (dest.toString() + source.toString()).toDouble()
        if (isInRange(min, max, input))
            return null
    } catch (nfe: NumberFormatException) {
        Timber.e(nfe)
    }

    return ""
}

private fun isInRange(a: Double, b: Double, c: Double): Boolean {
    return if (b > a) c in a..b else c in b..a
}
}

ตัวกรองอินพุตนี้ไม่ถูกต้องจะไม่สนใจจุดเริ่มต้นจุดสิ้นสุด dstart ดัชนี dend ของข้อความดังนั้นหากคุณเปลี่ยนข้อความแก้ไขโดยการแทรกตัวอักขระที่อยู่ตรงกลางมันจะทำงานไม่ถูกต้อง
Radu
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.