German Autovervollständigung in kompletter Textbox

so27

Active Member
Licensed User
Longtime User
Hallo zusammen,

ich habe beispielsweise eine Liste in welcher Farben stehen. Nun habe ich ein Textfeld in welches der User alles mögliche eintragen kann. Gibt er dann eine Farbe (egal an welcher Position des Cursors an), soll diese vorgeschlagen werden (ähnlich wie die Wortvorschläge an der Tastatur). Gibt es eine Möglichkeit, das so zu realisieren? Autocomplete macht das ja ganz nett, allerdings nur mit dem ersten Wort.

In dieser Art vielleicht?
 

pucki

Active Member
Licensed User
Die Frage die sich stellt ist, wo sollen die Autocomplete herkommen ?

Wenn du auf den Text eine Reaktion durch den Text haben willst, wäre eine eigene Datenbank dafür keine schlechte Idee. Dann einfach nach jeden Buchstaben der eingegeben wird eine SQL-Abfrage durchführen mit LIKE am ende, und das Ergebnis anzeigen. Eine Alternative bei nur wenig Möglichkeiten ist ein Array-Feld.

Mache ich dauernd, wenn ich die SQL-Datenbank durchsuchen lasse. Ich fülle einfach ein Grid / Listview mit den Ergebnis. Der Grund ist, das ich tippfaul bin, und meist nach 4-5 Zeichen schon weiß ob die Suche was wird. Allerdings benutzt ich dann 2 x LIKE so das ich nicht vorne auch richtig schreiben muss.

Und über den CASE Befehl nachdenken ;) Verhindert Probleme mit Groß / Kleinschreibung.

Auch kann man unnötige Dinge (2 Leerzeichen z.b.) dann filtern. Muss du halt nur ein Pharser schreiben, der Fehler abfängt. Oder du schreibst den Pharser so, das nach den letzten Leerzeichen im Text sucht und dann mit den Ergebnis die DB / das Array abfragt.

Die Reaktion kann man ja dann mit einer 2 Abfrage abfragen. z.B. durch ein Schlüsselcode in einen 2. Feld.

Leider gibst du zu wenig Infos an, das ich dir genau sagen kann wie du es coden kannst. Aber ich hoffe dir geholfen zu haben.

Das Ereignis ist : eingabefeld_TextChanged (Old As String, New As String)
Wobei Eingabefeld der name des Feldes ist, was überprüft werden soll. Musst halt immer nur NEW überwachen in den Beispiel.

Gruß

Pucki
 
Last edited:

so27

Active Member
Licensed User
Longtime User
Hallo @pucki ,

vielen Dank für Deine Antwort. In meinem Beispiel greife ich auf eine Textdatei zu (nicht Datenbank), welche Begriffe, die im Autocomplete verwendet werden soll, untereinander beinhaltet. Beispiel:

farben.txt (Dateiname)

Inhalt:
Rot
Gelb
Grün
Lila
...

Wenn ich nun in mein Textfeld eingeben würde:
"Die Farbe meines Autos ist Gr..." (hier sollte dann "Grün" vorgeschlagen werden).

Ist das möglich?
 

pucki

Active Member
Licensed User
Ich habe das mal getestet. Das Resultat ist komisch und schwer zu erklären. Die einfachste Lösung ist, auf das AutoCompleteEditText1 Teil zu verzichten.
Ich würde das mit ein normalen Text-Feld machen, und einen einfachen Listview. Das Listview unter den Textfeld positionieren.

Dann im Textfeld mit der Text_change funktion das Listview neu füllen. Dazu brauchst du nur die STRING-FUNCTION einbinden.
Sollte Standart sein, ansonsten hier im Forum einfach suchen.

Hier mal der Code . Bitte die Kommentare beachten.
B4X:
#Region  Project Attributes
    #ApplicationLabel: B4A Example
    #VersionCode: 1
    #VersionName:
    'SupportedOrientations possible values: unspecified, landscape or portrait.
    #SupportedOrientations: unspecified
    #CanInstallToExternalStorage: False
    #BridgeLogger : true
#End Region

#Region  Activity Attributes
    #FullScreen: False
    #IncludeTitle: True
#End Region

Sub Process_Globals
    'These global variables will be declared once when the application starts.
    'These variables can be accessed from all modules.
Dim farbe(10) As String
Dim anz_farben As Int

Dim sf As StringFunctions   ' [B]der Suchbegriff !!! [/B]
End Sub

Sub Globals
    'These global variables will be redeclared each time the activity is created.
    'These variables can only be accessed from this module.

    
    Private EditText1 As EditText
    Private ListView1 As ListView
End Sub

Sub Activity_Create(FirstTime As Boolean)
    'Do not forget to load the layout file created with the visual designer. For example:
    sf.Initialize
    Activity.LoadLayout("des_testi")
    sub_prg_ini ' sub aufruf Grundwerte setzen
    sub_pos_setzen ' sub zum setzen der Pos. des Listfeld aufgrund der Pos des Textfeld.
End Sub

Sub Activity_Resume

End Sub

Sub Activity_Pause (UserClosed As Boolean)

End Sub

Sub sub_prg_ini
    ' liste der Farben  (kannst du auch ins Edittext machen.  Ich habe nur die Angewohnheit diese ART von Daten zu bündeln. Dann muss ich bei änderungen nicht suchen
    farbe(1) = "grün"
    farbe(2) = "rot"
    farbe(3) = "gelb"
    farbe(4) = "blau"
    farbe(5) = "rosa"
    anz_farben = 5
    
End Sub


Sub sub_pos_setzen
    ' hier das Listfeld unter das Editfeld setzen
End Sub

Sub EditText1_TextChanged (Old As String, New As String)   ' wird bei jeden Tastedruck aufgerufen
    ListView1.Clear  ' listen löschen
    Dim i As Int = 0
    
    For i = 0 To anz_farben
        If sf.InString(farbe(i),New) >=0 Then   ' via String-funktion die Liste der Farben auf die gesuchte Zeichenkette durchsuchen
            ListView1.AddSingleLine(farbe(i))  ' bei Treffer in neue Liste aufnehmen
        End If
    Next
        
End Sub

Sub ListView1_ItemClick (Position As Int, Value As Object)
    ' hiemit übernahme machen oder was auch immer du willst.
End Sub

Ich hoffe dir gefällt meine Lösung. Ist mag das LISTVIEW. Das ist einfach zu handhaben und läuft verhältnismäßig Stressfrei.
Nur die Farben nerven mich. Deshalb benutze ich da immer folgenden Code. (Muss angepasst werden von dir)




B4X:
sub Farbe_setzen  ' sub nur als Demo
    Dim farbe_weiss As ColorDrawable
    Dim farbe_grau As ColorDrawable
    Dim farbe_black As ColorDrawable
    Dim farbe_hintergrund As ColorDrawable
    farbe_weiss.initialize(Colors.White,5)
    farbe_grau.initialize(Colors.Gray ,5)
    farbe_black.initialize(Colors.Black ,5)
    farbe_hintergrund.initialize(Colors.LightGray ,5)
    
    listview1.Background = farbe_weiss
    panel.background = farbe_hintergrund
    
end sub

Ich hoffe dir geholfen zu haben.


Gruß

Pucki
 

so27

Active Member
Licensed User
Longtime User
Vielen Dank @pucki . Das ist perfekt für meine Zwecke. Die Farbanpassung ist gut.
 
Top