2012-11-15 7 views
15

Ich habe eine Autocomplete-Textansicht zur Verfügung gestellt, um dem Benutzer Vorschläge anzuzeigen. Basierend auf dem vom Benutzer ausgewählten Element, erhalte ich die ID des Elements und verwende sie in Datenbankseite . Jetzt ist mein Problem, den Benutzer einzuschränken, um Auswahl nur von der Autovervollständigung-Textansicht zu treffen (d. H. Der Benutzer sollte seinen eigenen Text nicht eingeben). Es ist eine Kundenanforderung. Wie macht man das?Android: Benutzer nur zur Auswahl von Autovervollständigung Textansicht einschränken

+0

Ihre Frage Aufruf ist nicht klar. Welche Auswahl möchten Sie einschränken/wo sonst können die Nutzer eine Auswahl treffen? – stoilkov

+1

Versuchen Sie, den Benutzer auf das Bearbeiten von textView einzuschränken, sodass er nur eines der Elemente in der Autocomplete-Auswahl auswählen kann? – Drejc

+0

@Drejc ja das ist, was ich benötigt –

Antwort

22

Hier ist eine ziemlich einfache Lösung:

Sie eine Variable erstellen können den eingestellten Wert zu speichern, indem setOnItemClickListener in Ihre AutoCompleteTextView. Dann können Sie null diesen Wert immer wenn ein Benutzer das Feld eingibt, indem Sie TextWatcher zu ihm hinzufügen. Schließlich können Sie validieren, dass Ihre Variable nicht null ist, bevor Sie fortfahren.

+1

aber wenn der Benutzer eingegebene Wert, der in der Liste erscheint die 'my_var' sollte nicht null sein! – dvrm

+0

@dvrm dann müssen Sie den Adapter nach dem Text suchen, den der Benutzer eingegeben hat, und den Wert aus dem Adapter auf jedem onTextChanged auswählen. Nehmen wir an, der Benutzer tippt "name" in die actv ein und sucht dann nach "n", "na", "nam" und "name". Wenn Sie eine Übereinstimmung erhalten, wählen Sie diesen Wert. Auf diese Weise wird das Element in der Liste ausgewählt, ob sie darauf klicken oder nicht, solange der Text – regretoverflow

+0

brilliante Anwendung des Geistes entspricht. Vielen Dank. –

1

Ok Ich nehme an, Sie möchten die Eingabe des Benutzers auf die Texte beschränken, die in der Liste der in der Vorschlagsliste aufgeführten Artikel enthalten sind. wenn

Zum Beispiel haben Sie:

  • One
  • Zwei
  • Drei

dann der Benutzer nur für das erste Zeichen "O" und "T" geben könnte. Und so weiter nach dem zuvor eingegebenen Text.

Um dies zu erreichen Sie die setFilters Methode der Textview nutzen können:

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

Zusätzlich würden Sie wahrscheinlich brauchen die Text ändern Zuhörer und Fokus Zuhörer zu reagieren und aktualisieren Sie die gefilterten Liste wenn ein neues Zeichen eingegeben wird ... plus um den Filter zu aktualisieren. Hier

ist ein Beispiel für Dezimalzahl Filter ich an einem Projekt verwendet haben:

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

Ich habe zufällig eine solche Anforderung für ein Projekt, an dem ich arbeite, benötigt, und ich werde euch teilen, wie ich das benötigte implementiert habe.

Ich habe einen Listener für den Fokuswechsel für die Auto-Vervollständigen-Textansicht hinzugefügt und überprüft, wenn der Fokus des Benutzers den Fokus von der Autovervollständigung geändert hat, und die Situation direkt bearbeitet.

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(""); 

      } 
     } 
    }); 

Also meine Implementierung ist: Wenn der eingegebene Text in dem Array Adapter nicht existiert dann auf Fokus leeren Sie die Textansicht geändert, und später, wenn zur nächsten Stufe der Mitsprache Registrierung fortfahren, prüfen Sie, ob diese Textansicht ist leer oder nicht.

Hoffe dieser Ansatz hilft jemandem.

Glückliche Kodierung.

3

NiceAutoCompleteTextView werden Ihnen die Möglichkeit geben, zu prüfen, ob eine Auswahl aus dem Dropdown-Popup gemacht wurde, von isSelectionFromPopup()

Verwandte Themen