Estoy intentando limitar la longitud de la cadena introducida en un Textfield a una longitud preestablecida, pero me ocurre que al hacerlo el cursor salta a la primera posición de la cadena.
B4X:
Sub txtTitulo_TextChanged (old As String, new As String)
Dim longitud As Int = txtTitulo.Text.Length
If longitud > maxTitulo Then 'Variable preestablecida con la longitud máxima
'He probado con las dos opciones siguientes
' txtTitulo.Text = old '*1*
txtTitulo.Text = new.SubString2(0, maxTitulo) '*2*
End If
End Sub
Cuando la longitud de la cadena introducida llega al tope, y se ejecuta la línea marcada como *1* o *2*, el cursor me salta a la primera posición de la cadena. Lo ideal es que el cursor no cambiase de sitio.
Sub txt1_TextChanged (Old As String, New As String)
Dim sb As StringBuilder
sb.Initialize
For i = 0 To New.Length - 1
If "0123456789".IndexOf(New.CharAt(i)) > -1 Then
sb.Append(New.CharAt(i))
End If
Next
If sb.ToString.Length > 3 Then
txt1.Text = sb.ToString.SubString2(0,3)
Else
txt1.Text = sb.ToString
End If
txt1.SetSelection(txt1.Text.Length, txt1.Text.Length)
End Sub
Conocía ese hilo, pero no le había echado muchas cuentas porque veía que usaba un método similar al mío para limitar la longitud. En lo que no había reparado es en: txt1.SetSelection(txt1.Text.Length, txt1.Text.Length) que lo que hace es situar el cursor al final de la cadena cuando se alcanza la longitud máxima establecida.
He aprovechado esta idea, pero mejorándola para que el cursor no salte al final, sino que permanezca en la misma posición en la que estaba al escribir y alcanzar la longitud máxima.
B4X:
Sub txtTitulo_TextChanged (old As String, new As String)
Dim posicion As Int = txtTitulo.SelectionStart
Dim longitud As Int = txtTitulo.Text.Length
If longitud <= maxTitulo Then 'Variable preestablecida con la longitud máxima
lblTituloCount.Text = txtTitulo.Text.Length & "/" & maxTitulo
Else
txtTitulo.Text = old
txtTitulo.SetSelection(posicion-1, posicion-1)
End If
lblTitulo.Text = txtTitulo.Text
End Sub