2011-03-22 22 views
9

में एडिटटेक्स्ट वैल्यूज़ मैं 1-60 जैसी रेंज में मान दर्ज करना चाहता हूं। EditText को 61,62 ..., या 0, -1, -2 ...रेंज

हम एंड्रॉइड में 1-60 से EditText श्रेणी कैसे दे सकते हैं? मैं के रूप में

<EditText android:layout_height="wrap_content" 
    android:id="@+id/editText1" 
    android:layout_width="160dip" 
    android:inputType="number"> 
    </EditText> 
+0

इस सवाल कई बार पढ़ने के बाद, यह है अस्पष्ट है कि क्या उपयोगकर्ता टाइपिंग करते समय इनपुट को सत्यापित और संपादित करना चाहते हैं, या फ़ील्ड से बाहर निकलने के बाद। इन दोनों मामलों में से आपके पते के नीचे आपके दो जवाब हैं। – Devunwired

उत्तर

17

main.xml में किया है आप अपने EditText करने के लिए एक TextWatcher आवंटित और वहाँ पाठ में परिवर्तन के लिए सुन सकते हैं उदाहरण के लिए,:

public void afterTextChanged(Editable s) { 
    try { 
    int val = Integer.parseInt(s.toString()); 
    if(val > 60) { 
     s.replace(0, s.length(), "60", 0, 2); 
    } else if(val < 1) { 
     s.replace(0, s.length(), "1", 0, 1); 
    } 
    } catch (NumberFormatException ex) { 
     // Do something 
    } 
} 

Devunwired से उल्लेख किया है, सूचना है कि करने के लिए कॉल s.replace() फिर से टेक्स्टवॉचर को फिर से कॉल करेगा।

इन परिवर्तनों को बुलियन "संपादन" ध्वज पर चेक के साथ लपेटना सामान्य है, इसलिए रिकर्सिव कॉल छोड़ें और अंदर आने वाले परिवर्तनों के दौरान बस वापस आएं।

+4

+1: यह इसे संभालने का सही तरीका है, लेकिन यह ध्यान दिया जाना चाहिए कि आपके द्वारा यहां किए गए परिवर्तन अक्सर टेक्स्टवॉचर को बार-बार कॉल करेंगे। इन परिवर्तनों को एक बुलियन "संपादन" ध्वज पर चेक के साथ लपेटना आम है, इसलिए रिकर्सिव कॉल छोड़ें और परिवर्तनों के भीतर आने पर बस वापस आएं। – Devunwired

1

इस प्रयास करें ..

EditText.setOnEditorActionListener(new OnEditorActionListener() 
    { 
@Override 
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) 
{ 
    //add your condtion here. 
    return false; 
} 
}); 
2

EditText के बजाय एक seekbar का उपयोग क्यों नहीं? इस तरह, केवल संख्या दर्ज की जा सकती है और जब आपको आवश्यकता हो तो अधिकतम सीमा निर्दिष्ट/संशोधित की जा सकती है।

public class SeekBar1 extends Activity implements SeekBar.OnSeekBarChangeListener { 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    .. 
    mSeekBar = (SeekBar)findViewById(R.id.seekBar); 
    mSeekBar.setOnSeekBarChangeListener(this); 
    .. 
} 
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromTouch) { 
    //Do your Changes Here 
} 
public void onStartTrackingTouch(SeekBar seekBar) { 
    //On First Track Touch 
} 
public void onStopTrackingTouch(SeekBar seekBar) { 
    //On Stop Track Touch 
} 
} 

संख्यात्मक इनपुट प्रकार मानों के लिए, सेकर सबसे अच्छा संभव यूआई है। हालांकि, इस पर परिशुद्धता संदिग्ध है।

1

बहुत ही रोचक सवाल।

मुझे लगता है कि ऐसा करने का सबसे अच्छा तरीका एक नया inputType लागू कर रहा है, लेकिन setInputType विधि एक int प्राप्त करती है। कोई बात नहीं करने के लिए :(

कि विधि दस्तावेज़ में यह कहते हैं:।

रूप inputType के लिए यह परिभाषित कुंजी श्रोता को बदलने का ख्याल रखना होगा एक निरंतर साथ किस प्रकार की सामग्री निर्धारित करें, , setKeyListener (KeyListener) पर कॉल करके दिया सामग्री प्रकार मैच के लिए।

बहुत बढ़िया, आप setKeyListener के साथ एक keyListener प्रदान कर सकते हैं।

TextWatcher के साथ इस मुद्दे से परहेज करते हुए, आप अपना नया keyListener बनाने के लिए android.text.method.DigitsKeyListener का विस्तार कर सकते हैं।

1

मेरे पास अशोक फेलिक्स के उत्तर पर टिप्पणी करने के लिए पर्याप्त निजीकरण नहीं हैं लेकिन मैं यह जोड़ना चाहता हूं कि मुझे प्राथमिकता में सेकबार प्रदर्शित करने के लिए कुछ कोड प्रीमिटिंग मिल गया है।

उपयोग करना बहुत आसान है (मैं लेखक नहीं हूं)। मैथ्यू विगिन्स द्वारा SeekBarPreference कोड देखें: http://android.hlidskialf.com/blog/code/android-seekbar-preference

1

यह काम करता है लेकिन नहीं रहता है।

editText.setOnFocusChangeListener(new OnFocusChangeListener() { 
      @Override 
      public void onFocusChange(View v, boolean hasFocus) { 
       try { 
        int val = Integer.parseInt(editText.getText() 
          .toString()); 
        if (val > 2000) { 
         editText.setText(""); 
        } else if (val < 100) { 
         editText.setText(""); 
        } 
       } catch (NumberFormatException ex) { 
       } 
      } 
     }); 
5

मैं एक स्वच्छ समाधान here भर में आ गए हैं:

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

और बस इतना की तरह एक पाठ संपादित करने के लिए इस फ़िल्टर को लागू:

mCentsEditText = (EditText)v.findViewById(R.id.cents_edit_text); 
InputFilterMinMax filter = new InputFilterMinMax("0", "99") {}; 
mCentsEditText.setFilters(new InputFilter[]{filter}); 
+2

यह समाधान 5 से 35 की सीमा के लिए काम नहीं करता है, क्योंकि अब यह आपको 11 इनपुट करने की अनुमति देगा, क्योंकि एकल 1 न्यूनतम 5 से कम है। – jackdh

+1

3 साल बाद, मुझे लगता है कि आप सही हैं :) अरे। –

+0

अभी भी Google खोज परिणाम पर बहुत ऊपर है इसलिए लोगों को बताना चाहता था। मैंने कम से कम 0 को हार्ड कोडिंग करके और इसके बारे में पुष्टि करने के लिए छुट्टी पर एक और चेक का उपयोग करके इसके आसपास काम किया। – jackdh

संबंधित मुद्दे