2012-10-29 4 views
9

में edittext के लिए इनपुट समय तक सीमित कैसे करें मुझे उपयोगकर्ता को केवल ##: ## फ्लाई पर संपादन टेक्स्ट में प्रारूप करने की अनुमति देना है, क्या इसे प्राप्त करने का कोई तरीका है? मैंने कोड के नीचे उपयोग किया है लेकिन यह काम नहीं कर रहा है।एंड्रॉइड

मैं 45623: 5689 जैसे 24 से अधिक मान दर्ज करने में सक्षम हूं।

edit.setInputType(InputType.TYPE_DATETIME_VARIATION_TIME) 

भी android:text="time" भी काम नहीं कर रहा है।

मैं इस चीज़ को कैसे प्राप्त कर सकता हूं। क्या कोई मुझे सुझाव दे सकता है कि मैं यह कैसे कर सकता हूं।

मैं उपयोगकर्ता को 23 मूल्य तक पहले 2 स्थानों में प्रवेश करने की अनुमति देना चाहता हूं और फिर compulasary: ​​और फिर उपयोगकर्ता 59 मान तक की अनुमति दे सकता है।

उदाहरण

23:59 correct 
24:05 incorrect 
02:56 correct 
02:79 incorrect 

के लिए मैं इस अनुकूलित फिल्टर का भी इस्तेमाल किया है, लेकिन इसके काम नहीं कर रहा

मैं कुछ और कहाँ अतः में से इस कोड को मिला है।

कोड:

InputFilter timeFilter = new InputFilter() { 
     public CharSequence filter(CharSequence source, int start, int end, Spanned dest, 
       int dstart, int dend) { 
      if (source.length() == 0) { 
       return null;// deleting, keep original editing 
      } 
      String result = ""; 
      result += dest.toString().substring(0, dstart); 
      result += source.toString().substring(start, end); 
      result += dest.toString().substring(dend, dest.length()); 

      if (result.length() > 5) { 
       return "";// do not allow this edit 
      } 
      boolean allowEdit = true; 
      char c; 
      if (result.length() > 0) { 
       c = result.charAt(0); 
       allowEdit &= (c >= '0' && c <= '2'); 
      } 
      if (result.length() > 1) { 
       c = result.charAt(1); 
       allowEdit &= (c >= '0' && c <= '9'); 
      } 
      if (result.length() > 2) { 
       c = result.charAt(2); 
       allowEdit &= (c == ':'); 
      } 
      if (result.length() > 3) { 
       c = result.charAt(3); 
       allowEdit &= (c >= '0' && c <= '5'); 
      } 
      if (result.length() > 4) { 
       c = result.charAt(4); 
       allowEdit &= (c >= '0' && c <= '9'); 
      } 
      return allowEdit ? null : ""; 
     } 
    }; 

संपादित प्रश्न: main.xml फ़ाइल कोड

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:gravity="center" 
    android:orientation="vertical" 
    android:padding="10dp" > 

    <LinearLayout 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_marginTop="5dp" 
     android:gravity="center" 
     android:orientation="horizontal" > 

     <TextView 
      android:id="@+id/txtRecipientName" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:paddingRight="20dp" 
      android:text="@string/recipient_name" /> 

     <EditText 
      android:id="@+id/edTxtRecipient" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:ems="10" 
      android:paddingLeft="20dp" > 

      <requestFocus /> 
     </EditText> 
    </LinearLayout> 

    <LinearLayout 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_marginTop="5dp" 
     android:gravity="center" 
     android:orientation="horizontal" > 

     <TextView 
      android:id="@+id/txtParcelDeliverTime" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:paddingRight="20dp" 
      android:text="@string/delivered_time" /> 

     <EditText 
      android:id="@+id/edTxtParcelDeliverTime" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:ems="10" 
      android:paddingLeft="20dp" > 
     </EditText> 
    </LinearLayout> 

    <LinearLayout 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_marginTop="5dp" 
     android:gravity="center" 
     android:orientation="horizontal" > 

     <Button 
      android:id="@+id/btnRecipient_OK" 
      android:layout_width="100dp" 
      android:layout_height="wrap_content" 
      android:text="@android:string/ok" /> 
    </LinearLayout> 

</LinearLayout> 

इस कोड काम कर रहा है, लेकिन अगर मैं पहले वर्णमाला डालने और फिर उचित मान सम्मिलित अपने काम नहीं कर रहा क्योंकि source में इसका पिछला वर्ण मूल्य है।

+0

मैं अभी-अभी अपने कोड की कोशिश की, मैं XML फ़ाइल में समस्या लगता है मैंने कल उल्लेख किया था, अपनी गतिविधि के संपादन टेक्स्ट के एक्सएमएल से किसी इनपुट प्रकार सत्यापन को हटाएं और फिर यह ठीक काम करता है –

+0

मदद के लिए धन्यवाद प्रतीक्षा करें, मैं अपना एक्सएमएल फ़ाइल कोड डालूंगा। कोई सत्यापन या कोई इनपुट टाइप सत्यापन नहीं है। –

+0

मेरा अद्यतन प्रश्न देखें –

उत्तर

1

ints के लिए वर्ण कास्टिंग की कोशिश करें, तो अगर वे एक से अधिक 24 और 60.

int a = ((int) result.charAt(0)) - 48; 
int b = ((int) result.charAt(1)) - 48; 
int c = ((int) result.charAt(3)) - 48; 
if(a < 0 || b < 0 || c < 0) { 
    Not right. 
} 

if((a > 2 || (a == 2 && b > 3)) || c > 59) { 
    Neither is this. 
} 

माइनस 48 हैं क्योंकि संख्या 0 ascii तालिका में 48 वें है का परीक्षण करें। परीक्षण एसीआईआई होना चाहिए।

+0

मेरा कस्टमाइज़ेशन फ़िल्टर है काम कर रहा है लेकिन अगर मैं पहले वर्णमाला दर्ज करता हूं तो यह काम नहीं कर रहा है। –

+0

निश्चित रूप से लंबाई अगर उस तरह से बाहर है? – Adude11

+0

मैं आपको –

1
चार कारण है कि आप स्ट्रिंग का उपयोग नहीं है, क्योंकि चार भी comparsion के लिए इस्तेमाल किया जा सकता के रूप में यह संख्या

char c ='a'; 
    if(c>10) 
    //do something 

    //OR 
int x = c; 

तो क्यों न आप चार

या तुम क्या करने के बजाय स्ट्रिंग का उपयोग लौट सकते हैं करने के बजाय

कर सकते हैं, substring या उस तरह कुछ का उपयोग कर पहले दो अक्षर ले लो और इंटीजर का उपयोग करें।पार्स() विधि है, यह पार्स करने के लिए अगर यह सफलतापूर्वक तो इसे किसी अन्य कोई मान्य संख्या पार्स यह नहीं तो आप इसे मान्य कर सकते हैं है और इसी तरह अगले दो वर्ण

संपादित

यदि आप चाहते थे के लिए यह करना इस 23:59 सही 24:05 गलत 02:56 सही 02:79 गलत

तो यहाँ

तरह लागू करने के लिए कोड है कि मेरी तरफ

से काम किया है
public class MainActivity extends Activity { 
InputFilter timeFilter; 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    timeFilter = new InputFilter() { 
     @Override 
     public CharSequence filter(CharSequence source, int start, int end, Spanned dest, 
       int dstart, int dend) { 
      if (source.length() == 0) { 
       return null;// deleting, keep original editing 
      } 
      String result = ""; 
      result += dest.toString().substring(0, dstart); 
      result += source.toString().substring(start, end); 
      result += dest.toString().substring(dend, dest.length()); 

      if (result.length() > 5) { 
       return "";// do not allow this edit 
      } 
      boolean allowEdit = true; 
      char c; 
      if (result.length() > 0) { 
       c = result.charAt(0); 
       allowEdit &= (c >= '0' && c <= '2'); 
      } 
      if (result.length() > 1) { 
       c = result.charAt(1); 
       if(result.charAt(0) == '0' || result.charAt(0) == '1') 
        allowEdit &= (c >= '0' && c <= '9'); 
       else 
        allowEdit &= (c >= '0' && c <= '3'); 
      } 
      if (result.length() > 2) { 
       c = result.charAt(2); 
       allowEdit &= (c == ':'); 
      } 
      if (result.length() > 3) { 
       c = result.charAt(3); 
       allowEdit &= (c >= '0' && c <= '5'); 
      } 
      if (result.length() > 4) { 
       c = result.charAt(4); 
       allowEdit &= (c >= '0' && c <= '9'); 
      } 
      return allowEdit ? null : ""; 
     } 

    }; 

    EditText txt1 = (EditText) findViewById(R.id.edTxtParcelDeliverTime); 
    txt1.setFilters(new InputFilter[]{timeFilter}); 
} 
} 

मैं सिर्फ अपने XML लिया जाता है और के रूप में अपने साधन लेआउट और एक्सएमएल अब इस कोशिश करते हैं और यह बताने के लिए कोई परिवर्तन नहीं हैं रखा है?

संपादित 2 अब यहाँ मैं doneOnce बूलियन मान का उपयोग कर एफआईआर चार जांच के लिए एक validtion जोड़ लिया है यह काम करता है अब, मुझे बताओ कि तुम अब

public class MainActivity extends Activity { 
EditText edt1; 
InputFilter timeFilter; 
private String LOG_TAG = "MainActivity"; 
private boolean doneOnce = false; 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

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

      if(source.length() > 1 && doneOnce == false){ 
       source = source.subSequence(source.length()-1, source.length()); 
       if(source.charAt(0) >= '0' && source.charAt(0) <= '2'){ 
        doneOnce = true; 
        return source; 
       }else{ 
        return ""; 
       } 
      } 


      if (source.length() == 0) { 
       return null;// deleting, keep original editing 
      } 
      String result = ""; 
      result += dest.toString().substring(0, dstart); 
      result += source.toString().substring(start, end); 
      result += dest.toString().substring(dend, dest.length()); 

      if (result.length() > 5) { 
       return "";// do not allow this edit 
      } 
      boolean allowEdit = true; 
      char c; 
      if (result.length() > 0) { 
       c = result.charAt(0); 
       allowEdit &= (c >= '0' && c <= '2'); 
      } 
      if (result.length() > 1) { 
       c = result.charAt(1); 
       if(result.charAt(0) == '0' || result.charAt(0) == '1') 
        allowEdit &= (c >= '0' && c <= '9'); 
       else 
        allowEdit &= (c >= '0' && c <= '3'); 
      } 
      if (result.length() > 2) { 
       c = result.charAt(2); 
       allowEdit &= (c == ':'); 
      } 
      if (result.length() > 3) { 
       c = result.charAt(3); 
       allowEdit &= (c >= '0' && c <= '5'); 
      } 
      if (result.length() > 4) { 
       c = result.charAt(4); 
       allowEdit &= (c >= '0' && c <= '9'); 
      } 
      return allowEdit ? null : ""; 
     } 

    }; 


    edt1 = (EditText) findViewById(R.id.edTxtParcelDeliverTime); 
    edt1.setFilters(new InputFilter[] { timeFilter }); 

} 
} 
+0

आपकी प्रतिक्रिया के लिए धन्यवाद। मेरा कोड तब काम नहीं कर रहा है जब मैं बीच में वर्णमाला या '-' प्रतीक दर्ज करता हूं। अगर मैं अन्य प्रतीकों में प्रवेश करता हूं तो यह ठीक काम करता है। मेरे फ़िल्टर स्रोत में क्यों अमान्य वर्ण को हटाने के बजाय पिछले मान है। –

+0

आपके लिए संपादन टेक्स्ट के लिए एक्सएमएल एंड्रॉइड को हटाने का प्रयास करें: inputType = "number" या उसके जैसा कुछ भी और फिर अपने कोड को फिर से सत्यापित करें, इसे एंड्रॉइड सिस्टम द्वारा फ़िल्टर किया जा सकता है, इसलिए अगर –

+0

उत्तर के लिए धन्यवाद तो इस तरह की कोई भी आइटम निकालने का प्रयास करें। लेकिन आपके कामकाजी एप्लिकेशन में इसे आज़माएं: पहले 'q'' अक्षर दर्ज करें और फिर अक्षर नहीं' और फिर '12' दर्ज करने का प्रयास करें और फिर कोई वर्णमाला दर्ज करने का प्रयास करें। इस मामले में यह काम नहीं कर रहा है। अगर मैंने पहले 'अंक' दर्ज किया तो यह ठीक काम कर रहा है। –

0

इस कोड से किसी भी अन्य समस्या है, तो इसे आज़माएं, मैंने आपके द्वारा प्रदान किया गया कोड संपादित किया है ....

InputFilter[] timeFilter = new InputFilter[1]; 

timeFilter[0] = new InputFilter() { 
    public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) { 

     if (source.length() == 0) { 
      return null;// deleting, keep original editing 
     } 

     String result = ""; 
     result += dest.toString().substring(0, dstart); 
     result += source.toString().substring(start, end); 
     result += dest.toString().substring(dend, dest.length()); 

     if (result.length() > 5) { 
      return "";// do not allow this edit 
     } 

     boolean allowEdit = true; 
     char c; 
     if (result.length() > 0) { 
      c = result.charAt(0); 
      allowEdit &= (c >= '0' && c <= '2' && !(Character.isLetter(c))); 
     } 

     if (result.length() > 1) { 
      c = result.charAt(1); 
      allowEdit &= (c >= '0' && c <= '9' && !(Character.isLetter(c))); 
     } 

     if (result.length() > 2) { 
      c = result.charAt(2); 
      allowEdit &= (c == ':'&&!(Character.isLetter(c))); 
     } 

     if (result.length() > 3) { 
      c = result.charAt(3); 
      allowEdit &= (c >= '0' && c <= '5' && !(Character.isLetter(c))); 
     } 

     if (result.length() > 4) { 
      c = result.charAt(4); 
      allowEdit &= (c >= '0' && c <= '9'&& !(Character.isLetter(c))); 
     } 

     return allowEdit ? null : ""; 
    } 
}; 

यह मेरे लिए बिल्कुल ठीक काम करता है। hh:mm प्रारूप में समय स्वीकार करता है (कोई अन्य वर्ण स्वीकार नहीं किया गया)

0

मुझे this library समय EditText के लिए मिला। कोड का उपयोग करना आसान है। 24 घंटों प्रारूप में

एक कस्टम EditText (वास्तव में TextView से प्राप्त) इनपुट-समय पर : मैं कोड मालिक से कुछ स्पष्टीकरण जोड़ें। विशेषताएं:
- यह हमेशा वर्तमान समय निर्धारित समय दिखाता है, इसलिए यह कभी खाली नहीं होता है।

  • वर्चुअल और भौतिक कीबोर्ड दोनों का उपयोग किया जा सकता है।

  • वर्तमान अंक हाइलाइट किया गया है;

  • जब कीबोर्ड पर एक संख्या दबाई जाती है, तो अंक बदल दिया जाता है।

  • पीछे की कुंजी कर्सर को पीछे ले जाती है।

  • स्पेस कुंजी कर्सर आगे ले जाती है।

    public class TimeEditText extends TextView { 
    
    private static final int POSITION_NONE = -1; 
    
    private int[] digits = new int[4]; 
    private int currentPosition = POSITION_NONE; 
    private int mImeOptions; 
    
    public TimeEditText(Context context) { 
        this(context, null, 0); 
    } 
    
    public TimeEditText(Context context, AttributeSet attrs) { 
        this(context, attrs, 0); 
    } 
    
    public TimeEditText(Context context, AttributeSet attrs, int defStyle) { 
        super(context, attrs, defStyle); 
        setFocusableInTouchMode(true); 
    
        if (attrs != null && !isInEditMode()) { 
         mImeOptions = attrs.getAttributeIntValue("http://schemas.android.com/apk/res/android", "imeOptions", 0); 
        } 
    
        updateText();  
    } 
    
    /** 
    * @return the current hour (from 0 to 23) 
    */ 
    public int getHour() { 
        return digits[0]*10+digits[1]; 
    } 
    
    /** 
    * @return the current minute 
    */ 
    public int getMinutes() { 
        return digits[2]*10+digits[3]; 
    } 
    
    /** 
    * Set the current hour 
    * @param hour hour (from 0 to 23) 
    */ 
    public void setHour(int hour) { 
        hour = hour % 24; 
        digits[0] = hour/10; 
        digits[1] = hour%10; 
        updateText(); 
    } 
    
    /** 
    * Set the current minute 
    * @param min minutes (from 0 to 59) 
    */ 
    public void setMinutes(int min) { 
        min = min % 60; 
        digits[2] = min/10; 
        digits[3] = min%10; 
        updateText(); 
    } 
    
    @Override 
    protected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) { 
        // hide cursor if not focused 
        currentPosition = focused ? 0 : POSITION_NONE; 
        updateText(); 
        super.onFocusChanged(focused, direction, previouslyFocusedRect); 
    } 
    
    private void updateText() { 
        int bold = currentPosition > 1 ? currentPosition+1 : currentPosition; 
        int color = getTextColors().getDefaultColor(); 
        Spannable text = new SpannableString(String.format("%02d:%02d", getHour(), getMinutes())); 
        if (bold >= 0) { 
         text.setSpan(new ForegroundColorSpan(color & 0xFFFFFF | 0xA0000000), 0, 5, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 
         text.setSpan(new StyleSpan(Typeface.BOLD), bold, bold+1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 
         text.setSpan(new ForegroundColorSpan(Color.BLACK), bold, bold+1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 
         text.setSpan(new BackgroundColorSpan(0x40808080), bold, bold+1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 
        } 
        setText(text); 
    } 
    
    @Override 
    public boolean onTouchEvent(MotionEvent event) { 
        if (event.getAction() == MotionEvent.ACTION_UP) { 
         requestFocusFromTouch(); 
         InputMethodManager imm = (InputMethodManager) getContext().getSystemService(Context.INPUT_METHOD_SERVICE); 
         imm.showSoftInput(this,0); 
         if (currentPosition == POSITION_NONE) { 
          currentPosition = 0; 
          updateText(); 
         } 
        } 
        return true; 
    } 
    
    private boolean onKeyEvent(int keyCode, KeyEvent event) { 
        if (event != null && event.getAction() != KeyEvent.ACTION_DOWN) 
         return false; 
    
        if (keyCode == KeyEvent.KEYCODE_DEL) { 
         // moves cursor backward 
         currentPosition = currentPosition >= 0 ? (currentPosition+3)%4 : 3; 
         updateText(); 
         return true; 
        } 
    
        if (keyCode == KeyEvent.KEYCODE_SPACE) { 
         // moves cursor forward 
         currentPosition = (currentPosition+1)%4; 
         updateText(); 
         return true; 
        } 
    
        if (keyCode == KeyEvent.KEYCODE_ENTER) { 
         View v = focusSearch(FOCUS_DOWN); 
         boolean next = v!=null; 
         if (next) { 
          next = v.requestFocus(FOCUS_DOWN); 
         }   
         if (!next) { 
          hideKeyboard(); 
          currentPosition = POSITION_NONE; 
          updateText(); 
         } 
         return true; 
        }  
    
        char c = (char) event.getUnicodeChar(); 
        if (c >= '0' && c <= '9') { 
         currentPosition = currentPosition == POSITION_NONE ? 0 : currentPosition; 
         int n = c - '0'; 
         boolean valid = false; 
    
         switch (currentPosition) { 
          case 0: // first hour digit must be 0-2 
           valid = n <= 2; 
           break; 
          case 1: // second hour digit must be 0-3 if first digit is 2 
           valid = digits[0] < 2 || n <= 3; 
           break; 
          case 2: // first minute digit must be 0-6 
           valid = n < 6; 
           break; 
          case 3: // second minuti digit always valid (0-9) 
           valid = true; 
           break; 
         } 
    
         if (valid) { 
          if (currentPosition == 0 && n == 2 && digits[1] > 3) { // clip to 23 hours max 
           digits[1] = 3; 
          } 
    
          digits[currentPosition] = n; 
          currentPosition = currentPosition < 3 ? currentPosition+1 : POSITION_NONE; // if it is the last digit, hide cursor 
          updateText(); 
         } 
    
         return true; 
        } 
    
        return false; 
    } 
    
    private void hideKeyboard() { 
        InputMethodManager imm = (InputMethodManager) getContext().getSystemService(Context.INPUT_METHOD_SERVICE); 
        imm.hideSoftInputFromWindow(getWindowToken(), 0);   
    } 
    
    
    @Override 
    public boolean onKeyDown(int keyCode, KeyEvent event) { 
        // events from physical keyboard 
        return onKeyEvent(keyCode, event); 
    } 
    
    @Override 
    public InputConnection onCreateInputConnection(EditorInfo outAttrs) { 
        // manage events from the virtual keyboard 
        outAttrs.actionLabel = null; 
        outAttrs.label = "time"; 
        outAttrs.inputType = InputType.TYPE_CLASS_NUMBER; 
        outAttrs.imeOptions = mImeOptions | EditorInfo.IME_FLAG_NO_EXTRACT_UI; 
    
        if ((outAttrs.imeOptions & EditorInfo.IME_MASK_ACTION) == EditorInfo.IME_ACTION_UNSPECIFIED) { 
         if (focusSearch(FOCUS_DOWN) != null) { 
          outAttrs.imeOptions |= EditorInfo.IME_ACTION_NEXT; 
         } else { 
          outAttrs.imeOptions |= EditorInfo.IME_ACTION_DONE; 
         } 
        } 
    
        return new BaseInputConnection(this, false) { 
         @Override 
         public boolean performEditorAction(int actionCode) { 
          if (actionCode == EditorInfo.IME_ACTION_DONE) { 
           hideKeyboard(); 
           currentPosition = POSITION_NONE; 
           updateText(); 
          } else if (actionCode == EditorInfo.IME_ACTION_NEXT){ 
           View v = focusSearch(FOCUS_DOWN); 
           if (v!=null) { 
            v.requestFocus(FOCUS_DOWN); 
           } 
          } 
          return true; 
         } 
    
         @Override 
         public boolean deleteSurroundingText(int beforeLength, int afterLength) { 
          onKeyEvent(KeyEvent.KEYCODE_DEL, null); 
          return true; 
         } 
    
         @Override 
         public boolean sendKeyEvent(KeyEvent event) { 
          onKeyEvent(event.getKeyCode(), event); 
          return true; 
         }   
        }; 
    } 
    } 
    

    आप अपने दृश्य को यह लाइनों को जोड़ना होगा:

यहाँ TimeEditText क्लास है

<YourPackageName.TimeEditText 
      android:id="@+id/satOpenEditText" 
      android:layout_width="0dp" 
      android:layout_height="wrap_content" 
      android:layout_marginLeft="10dp" 
      android:layout_marginRight="10dp" 
      android:layout_weight="1" 
      android:ems="10" 
      android:inputType="time" 
      android:textSize="16sp" />