2012-11-15 23 views
15

मैंने उपयोगकर्ता को सुझाव दिखाने के लिए एक स्वत: पूर्ण टेक्स्टव्यू प्रदान किया है। उपयोगकर्ता द्वारा चुने गए आइटम पर आधारित, मुझे आइटम की आईडी मिल रही है और डेटा बेस साइड में इसका उपयोग कर रहा है । अब मेरी समस्या उपयोगकर्ता को स्वत: पूर्ण टेक्स्टव्यू से चयन करने के लिए प्रतिबंधित करना है (यानी, उपयोगकर्ता को अपना टेक्स्ट दर्ज नहीं करना चाहिए)। यह एक ग्राहक की आवश्यकता है। यह कैसे करना है?एंड्रॉइड: स्वत: पूर्णता टेक्स्टव्यू से चुनने के लिए उपयोगकर्ता को प्रतिबंधित करें

+0

आपका प्रश्न लागू द्वारा चाहे एक चयन ड्रॉप-डाउन पॉपअप से बनाया गया था, की क्षमता दे देंगे स्पष्ट नहीं है। आप कौन से चयन को प्रतिबंधित करना चाहते हैं/उपयोगकर्ता कहां से चयन कर सकते हैं? – stoilkov

+1

क्या आप उपयोगकर्ता को टेक्स्ट व्यू संपादित करने के लिए प्रतिबंधित करने की कोशिश कर रहे हैं ... तो क्या वह स्वत: पूर्ण चयन में से किसी एक आइटम का चयन कर सकता है? – Drejc

+0

@Drejc हाँ मुझे यही चाहिए –

उत्तर

22

यहाँ एक बिल्कुल स्पष्ट समाधान है:

यहाँ मैं एक परियोजना पर इस्तेमाल किया है दशमलव संख्या फिल्टर का एक उदाहरण है आपका AutoCompleteTextView। फिर आप null कर सकते हैं, जब भी कोई उपयोगकर्ता TextWatcher जोड़कर फ़ील्ड में टाइप करता है। अंत में, आप अपने चर को मान्य कर सकते हैं जारी रखने से पहले शून्य नहीं है।

String my_var; //keep track! 
AutoCompleteTextView tv = (AutoCompleteTextView) layout.findViewById(R.id.tv); 
tv.setAdapter(my_adapter); 
tv.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
    @Override 
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
     my_var = my_adapter.getItem(position).toString(); 
    } 
}); 
/** 
* Unset the var whenever the user types. Validation will 
* then fail. This is how we enforce selecting from the list. 
*/ 
tv.addTextChangedListener(new TextWatcher() { 
    @Override 
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {} 
    @Override 
    public void onTextChanged(CharSequence s, int start, int before, int count) { 
     my_var = null; 
    } 
    @Override 
    public void afterTextChanged(Editable s) {} 
}); 
+1

लेकिन अगर उपयोगकर्ता सूची टाइप करता है जो सूची में दिखाई देता है तो 'my_var' शून्य नहीं होना चाहिए! – dvrm

+0

@dvrm तो आपको उपयोगकर्ता द्वारा दर्ज किए गए पाठ के लिए एडाप्टर खोजना होगा, और प्रत्येक पर टेक्स्ट एडाप्टर से मूल्य का चयन करें। तो, कहें कि उपयोगकर्ता actv में 'name' टाइप कर रहा है, फिर आप 'n', 'na', 'nam', 'name' के लिए खोज करेंगे और जब आप एक मैच प्राप्त करेंगे, तो उस मान का चयन करें। इस प्रकार सूची में आइटम का चयन किया जाएगा चाहे वे इसे क्लिक करें या नहीं, जब तक कि पाठ – regretoverflow

+0

दिमाग का शानदार अनुप्रयोग से मेल खाता हो। धन्यवाद। –

1

ठीक है मुझे लगता है कि आप उपयोगकर्ता के इनपुट को सुझाव बॉक्स में सूचीबद्ध वस्तुओं की सूची में निहित ग्रंथों में सीमित करना चाहते हैं।

उदाहरण के लिए अगर आपके पास:

  • एक
  • दो
  • तीन

तो उपयोगकर्ता केवल पहले चरित्र "ओ" और "टी" के लिए टाइप कर सकते हैं। और इसलिए पहले दर्ज किए गए पाठ के अनुसार।

इस लक्ष्य को हासिल करने के लिए आप setFiltersकी विधि TextView उपयोग कर सकते हैं:

editBox = (TextView) findViewById(R.id.editBox); 
editBox.setFilters(getFilters()); 
editBox.addTextChangedListener(this); 
editBox.setOnFocusChangeListener(this); 

इसके अतिरिक्त आप शायद पाठ परिवर्तन श्रोता की जरूरत और फोकस श्रोता प्रतिक्रिया और फ़िल्टर की गई सूची को अद्यतन करने के लिए जब एक नया अक्षर दर्ज किया जाता है ... प्लस फ़िल्टर को अपडेट करने के लिए।

आप में setOnItemClickListener की स्थापना द्वारा चयनित मान के स्टोर करने के लिए एक चर बना सकते हैं:

protected InputFilter[] getFilters() 
    { 
     InputFilter[] filters = new InputFilter[1]; 

     filters[0] = new InputFilter() 
     { 
      public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) 
      { 
       // limit input to digits and decimal/thousand separator only 
       // in case thousand separator is pressed, change it to decimal 
       // separator instead 
       String output = ""; 

       if (number.isFocused()) 
       { 
        for (int i = start; i < end; i++) 
        { 
         char c = source.charAt(i); 

         if (isDecimalOrThousandSeparator(c)) 
         { 
          output = output + Character.toString(decimalSeparator); 
         } 
         else if (Character.isDigit(c)) 
         { 
          output = output + Character.toString(c); 
         } 
        } 

        return output == "" ? null : output; 
       } 

       return null; 
      } 
     }; 

     return filters; 
    } 
13

मुझे जिस परियोजना पर मैं काम कर रहा हूं, उसके लिए मुझे ऐसी आवश्यकता की आवश्यकता होती है, और हालांकि मैं आपको आवश्यक तरीके से लागू करने के तरीके के बारे में बताऊंगा।

मैंने ऑटो-पूर्ण टेक्स्ट व्यू के लिए फोकस चेंज श्रोता पर जोड़ा और जांच की जब उपयोगकर्ता ने फोकस को ऑटो-पूर्ण से फोकस बदल दिया, और स्थिति को सीधे आगे बढ़ाया।

autoTextViewCountry.setOnFocusChangeListener(new View.OnFocusChangeListener() { 
     @Override 
     public void onFocusChange(View view, boolean b) { 
      if(!b) { 
       // on focus off 
       String str = autoTextViewCountry.getText().toString(); 

       ListAdapter listAdapter = autoTextViewCountry.getAdapter(); 
       for(int i = 0; i < listAdapter.getCount(); i++) { 
        String temp = listAdapter.getItem(i).toString(); 
        if(str.compareTo(temp) == 0) { 
         return; 
        } 
       } 

       autoTextViewCountry.setText(""); 

      } 
     } 
    }); 

तो मेरी कार्यान्वयन है: यदि लिखे गए पाठ जब कहते पंजीकरण के अगले चरण के लिए जारी रखने पर तो सरणी अनुकूलक में मौजूद नहीं है पर ध्यान केंद्रित पाठ दृश्य खाली बदल गया है, और बाद में, देखें कि इस पाठ दृश्य अगर खाली है या नहीं।

आशा है कि यह दृष्टिकोण किसी की मदद करेगा।

हैप्पी कोडिंग।