क्या Android में EditText के लिए न्यूनतम और अधिकतम मान को परिभाषित करने का एक तरीका है?


133

मैं एक न्यूनतम और अधिकतम मान को परिभाषित करना चाहता हूं EditText

उदाहरण के लिए: यदि कोई व्यक्ति इसमें एक महीने का मान दर्ज करने का प्रयास करता है, तो मूल्य 1-12 के बीच होना चाहिए।

मैं इसका उपयोग करके कर सकता हूं, TextWatcherलेकिन मैं यह जानना चाहता हूं कि क्या लेआउट फ़ाइल या कहीं और ऐसा करने का कोई अन्य तरीका है।

संपादित करें: मैं वर्ण गणना को सीमित नहीं करना चाहता। मैं मूल्य सीमित करना चाहता हूं। उदाहरण के लिए, यदि मैं EditText12 वर्ष में प्रवेश करते समय महीने w वर्णों को सीमित करता हूं, तो इसे स्वीकार करेंगे लेकिन यदि मैं 22 वर्ष का हूं तो प्रवेश करते समय इसे स्वीकार नहीं करना चाहिए।


किसी को इन सभी प्रकार के इनपुट फिल्टर का एक पुस्तकालय / संग्रह बनाना चाहिए। तब हर कोई एक साथ काम कर सकता है और उनका परीक्षण कर सकता है। बल्कि प्रत्येक व्यक्ति अपनी बात खुद कर रहा है।
जैपनीजिका

अपनी समस्या को हल करने के लिए इस संपादित टेक्स्ट फ़िल्टर का उपयोग करें। फ़िल्टर
तारास स्मैकुला

जवाबों:


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 तक मान दर्ज कर सकता है

संपादित करें:

के साथ अपना संपादन सेट करें android:inputType="number"

आप https://www.techcompose.com/how-to-set-minimum-and-maximum-value-in-edittext-in-android-app-development/ पर अधिक जानकारी प्राप्त कर सकते हैं ।

धन्यवाद।


1
@mertaydin ज़रूर। इसे आजमाइए तो मुझे बताइए कि क्या आपको मेरी मदद की जरूरत है। धन्यवाद।
प्रतीक शर्मा Sharma

12
आह, मुझे मदद की ज़रूरत है। 1930 और 1999 के बीच के राइटिंग वैल्यू के दौरान मुझे एक समस्या है। जब मैं 1 लिखता हूं तो यह मूल्य को नियंत्रित करता है और 1 1930 और 1999 के बीच नहीं होता है इसलिए यह इसे स्वीकार नहीं करता है।
मर्टायिन

1
@mertaydin अरे सॉरी लेकिन मैं अपने काम में थोड़ा व्यस्त था। मुझे अभी इस पर ध्यान देने के लिए कुछ समय मिला है, मुझे लगता है कि मुझे फ़िल्टर क्लास में लागू एल्गोरिथम में संशोधन करने की आवश्यकता है। एक बार जब मैं उसके साथ करूंगा तो मैं आपको अपडेट करूंगा।
प्रतीक शर्मा

1
से कुछ अक्षर कुछ वर्णों sourceको बदल देंगे dest। मुझे लगता है कि आपको प्रतिस्थापन का अनुकरण करना चाहिए, और अंतिम परिणाम प्राप्त करना चाहिए, फिर, इसे मान्य करें।
एसडी

3
@ प्रतीक शर्मा, यह तब काम नहीं करता जब मैं 1900 से 2000 तक की सीमा में प्रवेश करता हूं, क्या आप कुछ सुझा सकते हैं
एमिनेंट

89

प्रतीक के कोड में एक छोटी सी त्रुटि है। उदाहरण के लिए, यदि कोई मान 10 है और आप 110 बनाने के लिए शुरुआत में 1 जोड़ते हैं, तो फिल्टर फ़ंक्शन 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
मुझे लगता है कि यह स्पष्ट है कि इम्हो :String replacement = source.subSequence(start, end).toString(); String newVal = dest.subSequence(0, dstart).toString() + replacement + dest.subSequence(dend, dest.length()).toString();
स्वेन जैकब्स

1
+1। यह समाधान स्वीकृत से अधिक सही है। इसे जांचने के लिए उदाहरण के लिए InputFilterMinMax का उपयोग करने की कोशिश करें, जिसमें SelectAllOnFocus विकल्प सक्षम हो और परिणाम की तुलना करें।
शशांक

1
क्यों नहीं String newVal= dest.toString().substring(0, dstart) + source.toString().substring(start, end) + dest.toString().substring(dend, dest.toString().length());, अधिक साफ और स्पष्ट दिखता है।
शिशिर गुप्ता

5
जैसा कि @Patrick के उत्तर पर एक टिप्पणी में ओपी @mertaydin ने उल्लेख किया है, इस समाधान में अभी भी एक बड़ी खामी है, मुझे आश्चर्य है कि इसकी रिपोर्ट क्यों नहीं की गई है: यदि min==31 या 2 के साथ शुरू होने वाली किसी भी संख्या को टाइप करना असंभव है (उदा: 15, 23)
गुरुनान 4

10

मैंने @ पैट्रिक के समाधान और @ ज़ैक के अलावा जो भी देखा है, कोड अभी भी एक बड़ी समस्या है:

यदि min==3तब 1 या 2 के साथ शुरू होने वाली किसी भी संख्या को टाइप करना असंभव है (उदाहरण: 15, 23) तो
यदि किसी भी संख्या को टाइप करना असंभव है, min>=10तो हर संख्या 1,2,3 के साथ शुरू होगी ...

मेरी समझ में, हम EditTextक्लास के साधारण उपयोग के साथ InputFilterMinMaxन्यूनतम मान की न्यूनतम-अधिकतम सीमा को प्राप्त नहीं कर सकते हैं , कम से कम मिनट के मूल्य के लिए नहीं, क्योंकि जब उपयोगकर्ता एक सकारात्मक संख्या टाइप कर रहा है, तो मान बढ़ता जा रहा है और हम आसानी से एक प्रदर्शन कर सकते हैं यह जाँचने के लिए कि क्या यह सीमा तक पहुँच गया है या सीमा से बाहर चला गया है और प्रविष्टियों को ब्लॉक करें जो अनुपालन नहीं करते हैं। न्यूनतम मान का परीक्षण करना एक अलग कहानी है क्योंकि हम यह सुनिश्चित नहीं कर सकते हैं कि उपयोगकर्ता ने टाइप किया है या नहीं और इसलिए यह तय नहीं कर सकता है कि हमें ब्लॉक करना चाहिए या नहीं।

यह बिल्कुल ऐसा नहीं है जो ओपी ने अनुरोध किया है, लेकिन सत्यापन के प्रयोजनों के लिए मैंने अपने समाधान में संयुक्त रूप से 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 काम नहीं कर रहा है, इसने शून्य से सभी मान
डाले

1
क्या आप थोड़ा और विस्तार करने का मन करेंगे? आप शून्य से सभी मूल्यों को क्या कहते हैं ?
ग्वारिन 4

कोड से OnFocusChangeListenerMin को 20 से ऊपर काम करना चाहिए क्योंकि समस्या के बारे में चर्चा करते हुए यह 20 से कम मानों को स्वीकार करता है जैसे 0, 1, 2, ------ 19 आदि
EminenT

क्या आपको कोई हल मिला?
एमिनेंट

मैंने सत्यापन के उद्देश्य में OnFoncusChangeListener का उपयोग किया है, मेरे मामले में मैंने EditText पर एक त्रुटि प्रदर्शित की है एक टोस्ट द्वारा उपयोगकर्ता को सूचित करें कि मूल्य अच्छा नहीं है और उसे एक नया मान दर्ज करने के लिए आमंत्रित करें if(Integer.valueOf(val)<min){ //Notify user that the value is not good } आप वहां क्या कर सकते हैं, सूचित करें उपयोगकर्ता और EditText को रिक्त पर सेट करें, मुझे नहीं पता कि यह आपके प्रश्न का उत्तर देता है
Guerneen4

9

प्रतीक और ज़ैक के जवाब का विस्तार। ज़ैक ने अपने जवाब में प्रतीक के एक छोटे से बग को तय किया। लेकिन मुझे लगता है कि कोड नकारात्मक मूल्यों का समर्थन नहीं करता है, यह एक नंबरग्रुप फेंक देगा। इसे ठीक करने के लिए, और MIN को नकारात्मक होने दें, निम्न कोड का उपयोग करें।

अन्य दो पंक्तियों के बीच इस लाइन को (बोल्ड में) जोड़ें:

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

if (newVal.equalsIgnoreCase ("-") && मिनट <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 ऑब्जेक्ट्स का उपयोग करने के लिए बढ़ाया, ताकि वह बड़ी संख्या को स्वीकार कर सके, और EditText में किसी भी स्वरूपण के लिए खाता जो संख्या नहीं है (जैसे मुद्रा स्वरूपण अर्थात रिक्त स्थान, अल्पविराम और अवधि)

संपादित करें: ध्यान दें कि इस कार्यान्वयन में बिगडेसिमल पर निर्धारित न्यूनतम महत्वपूर्ण आंकड़े हैं (जैसा कि मैंने मुद्रा के लिए इसका उपयोग किया था 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. है
केनी डाबीरी

1
क्यों int n = 0 यहाँ बेमानी है? इसका स्थानीय चर और उदाहरण चर यहाँ नहीं है।
उपयोगकर्ता 12111111

4

स्वीकृत उत्तर में कुछ गलत है।

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

यदि मैं कर्सर को पाठ के बीच में ले जाता हूं, तो कुछ टाइप करें, तो उपरोक्त कथन गलत परिणाम देगा। उदाहरण के लिए, पहले "12" टाइप करें, फिर 1 और 2 के बीच "0" टाइप करें, फिर ऊपर वर्णित विवरण 102 के बजाय "120" का उत्पादन करेगा। मैंने इस कथन को नीचे दिए गए बयानों में संशोधित किया है:

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

4

अगर किसी को इसकी जरूरत हो तो कोटलिन (यूटिलिटीज का उपयोग करें)

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

फिर अपने कोटलिन वर्ग से इसका उपयोग करें

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

यह EditText 1 से 100 तक की अनुमति देता है।

फिर अपने XML से इसका उपयोग करें

android:inputType="number"

मैं रिटर्न सोर्स और मेरे लिए काम कर रहा हूं ==> अगर (isInRange (min, max, input)) रिटर्न सोर्स
मुजफ्फरस

3

मैंने एक 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% एंड्रॉइड डेवलपर्स चाहते हैं कि यह (और 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);
    }
}

यह इनपुट को फ़िल्टर करने में फ़िल्टर को "ट्रिक" करेगा, हालांकि दृश्य वास्तव में फ़ोकस नहीं हुआ है। यदि दृश्य बाद में अपने आप पर ध्यान केंद्रित करने से चूक जाता है, तो इनपुट स्वच्छता फिर से ट्रिगर हो जाएगी, लेकिन कुछ भी नहीं बदलेगा क्योंकि यह पहले से ही तय था।

समापन

वाह। वह बहुत कुछ था। मूल रूप से ऐसा लग रहा था कि यह एक बहुत ही मामूली आसान समस्या होगी, जो कि वेनिला एंड्रॉइड के कई छोटे बदसूरत टुकड़ों (कम से कम जावा में) को उजागर करती है। और एक बार फिर, आपको केवल श्रोता को जोड़ने और विस्तार करने की आवश्यकता है 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

कोटलिन पर बहुत सरल उदाहरण:

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 
  }

एडिटटेक्स्ट के बारे में अधिक जानकारी के लिए नीचे दिए गए लिंक का उपयोग करें और टेक्स्ट वॉचर के साथ edittextfilteres।

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


ओपी इसे मान्य करना चाहता है जब मूल्य दर्ज किया जा रहा है। मुझे लगता है कि आपने मूल्य दर्ज किए जाने के बाद परिदृश्य के लिए समाधान प्रदान किया है
मिस्टिकमैजिक

मैं प्रश्नकर्ता नहीं हूं। मुझे आपके उत्तर के बारे में संदेह था, इसलिए मैं इसे स्पष्ट कर रहा था।
मिस्टिकमैजिक

मैं चरित्र गणना की जाँच नहीं करना चाहता। मुझे लगता है कि आप इस कोड में गिनती की जांच करने की कोशिश कर रहे हैं: अगर (TextUtils.isEmpty (पास || || pass.length <[Your MIN LENGTH]) मैं सिर्फ महीने के मूल्य के लिए उदाहरण के लिए सीमा को मान देता हूं, तो उपयोगकर्ता को उनके बीच का मान लिखना होगा || 1-12 नहीं 13,14, या आदि तो, 12,13,14, जब तक 99 2 वर्ण लंबाई है।
मर्त्यदीन '

hi @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

@ प्रतीक शर्मा

नकारात्मक संख्याओं के समर्थन के लिए , फ़िल्टर विधि में निम्नलिखित कोड जोड़ें :

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

इसके साथ अपना संपादन सेट करें:

android:inputType="number|numberSigned"

0

// अभी भी कुछ समस्या है, लेकिन यहां आप किसी भी सीमा पर अधिकतम (सकारात्मक या नकारात्मक) मिनट का उपयोग कर सकते हैं

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

प्रतीक के उत्तर में जोड़ने के लिए, यहां एक संशोधित संस्करण है जहां उपयोगकर्ता न्यूनतम 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) मिनट = 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 = new EditText(context);
editext.setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_SIGNED);
eInt.setFilters(new InputFilter[]{new MinMaxFilter(min, max)});

0

यह मेरा कोड अधिकतम = 100, मिनट = 0 है

एक्सएमएल

<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 पर सेट नहीं किया जाएगा। तो अप्रत्यक्ष रूप से आपको न्यूनतम और अधिकतम फ़िल्टर तर्क के साथ आने की आवश्यकता है। लेकिन कम से कम यू फिल्टर एडिट को बहुत साफ और कम सीधे एडिटटेक्स्ट में लिख सकते हैं।

उम्मीद है की यह मदद करेगा


0

EditText के न्यूनतम मूल्य को परिभाषित करने के लिए, मैंने इसका उपयोग किया:

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

0

@ पैट्रिक के कोड में एक अच्छा विचार है, लेकिन बहुत सारे बग के साथ। @ ज़ैक और @ एंथनी बी (नकारात्मक संख्या समाधान) ने उनमें से कुछ को हल किया है, लेकिन @ ज़ैक के कोड में अभी भी 3 मेयर बग हैं:

1. यदि उपयोगकर्ता EditText में सभी प्रविष्टियों को हटा देता है, तो किसी भी संख्या को फिर से लिखना असंभव है। बेशक यह प्रत्येक क्षेत्र पर एक EditText परिवर्तित श्रोता का उपयोग करके नियंत्रित किया जा सकता है, लेकिन यह प्रत्येक के लिए एक सामान्य InputFilter वर्ग का उपयोग करने की सुंदरता को मिटा देगा अपने ऐप में EditText।

2। @ Guernee4 कहते हैं, अगर उदाहरण के लिए मिनट = 3, तो 1 के साथ शुरू होने वाली किसी भी संख्या को टाइप करना असंभव है।

3। यदि उदाहरण के लिए मिनट = 0, आप टाइप कर सकते हैं कई शून्य आप चाहते हैं, कि यह परिणाम सुरुचिपूर्ण नहीं है। या यह भी, अगर कोई बात नहीं है कि न्यूनतम मूल्य क्या है, तो उपयोगकर्ता कर्सर को पहले नंबर के बाएं आकार में रख सकता है, बाईं ओर अग्रणी शून्य का एक गुच्छा, यह भी सुरुचिपूर्ण नहीं है।

मैं इस 3 बग को हल करने के लिए @ Zac के कोड के इन छोटे परिवर्तनों को सफेद कर आया। बग # 3 के बारे में, मैं अभी भी बाईं ओर के सभी अग्रणी शून्य को पूरी तरह से हटाने में सक्षम नहीं हूं; यह हमेशा एक हो सकता है, लेकिन उस मामले में एक 00, 01, 0100 आदि, अधिक सुरुचिपूर्ण है कि एक 000000, 001, 000100, etcetc। आदि।

यहाँ कोड है:

@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

यहाँ मेरा प्रीत शर्मा के लिए जवाब है 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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.