Spanish (SOLUCIONADO) Cómo salir de un edittext multiline

J M Movilla Cuadrado

Member
Licensed User
Si defino el edittext como multiline, al pulsar el [Enter] inserta una nueva línea, sin pasar por EditText1_EnterPressed, en lugar de aceptar y salir de edición.

Cómo siempre quedo pendiente de vosotros, seguro de que me daréis la solución. Mi agradecimiento previo.
 
Last edited:

bgsoft

Well-Known Member
Licensed User
Longtime User
Hola, por el EnterPressed siempre entra , si no pon esto y lo verás

B4X:
Sub EditText1_EnterPressed
    Log("Pulsado Enter")
End Sub

Un Enter es la suma de dos caracteres, CR (retorno de carro o carriage return) y LF (Salto de linea 0 line feed) , si quieres puedes capturarlo en el TextChanged buscando el valor ASCII que es el 10 (el ultimo caracter)

B4X:
Sub EditText1_TextChanged (Old As String, New As String)

Try
  UltimoChar = Asc(New.SubString(New.Length-1))
Catch
End Try       
   
End Sub

Saludos
 

J M Movilla Cuadrado

Member
Licensed User
Muchas gracias, amigo Jesús, por tu interés.

Pero siento decirte que NO PASA POR EditText1_EnterPressed; ni el log lo detecta ni poniendo msgbox("He pulsado Enter", "")

Había probado con

B4X:
Sub Activity_KeyUp (KeyCode As Int) As Boolean
    If KeyCode = KeyCodes.KEYCODE_ENTER Then
        EditText1_EnterPressed
    End If
End Sub

también sin resultado...

Adjunto cómo tengo diseñado el control, por si es ahí donde cometo el error.

----------------

En algún post he leído que el "SingleLine = False" no funcionaba bien si se definía en diseño; que había que hacerlo mediante código. Lo hice así y tampoco resultó.
 

Attachments

  • EditText.JPG
    EditText.JPG
    43.5 KB · Views: 314
Last edited:

bgsoft

Well-Known Member
Licensed User
Longtime User
Hola:

No se que estas haciendo, pero palabrita del niño Jesús :D que debe entrar.

Abre un nuevo proyecto y pon esto, y veras como si va

B4X:
Sub Globals
Dim EditText1 As EditText
En Sub

Sub Activity_Create(FirstTime As Boolean)

EditText1.Initialize("EditText1")
    EditText1.Color = Colors.White
    EditText1.TextColor = Colors.Black
    EditText1.SingleLine = False ' dale el valor que quieras
    EditText1.Wrap = True ' dale el valor que quieras
    Activity.AddView(EditText1,25%x,25%y,50%x,10%y) 
En Sub

Sub EditText1_TextChanged (Old As String, New As String)
   
   Dim UltimoChar = -1 As Int

   Try   
     UltimoChar = Asc(new.SubString(txt.Length-1))
   Catch
   End Try       
   
   Log(UltimoChar) ' cuando des al enter saldrá un 10 (LF)
   
   if UltimoChar = 10 then
      ' ha pulsado Enter ....
   end if
   
End Sub

Sub EditText1_EnterPressed
   Log("Pulsado Enter")
End Sub

Saludos
 

Jorge M A

Well-Known Member
Licensed User
¿Cómo estás probando tu aplicación? ¿en emulador o dispositivo físico?
Si es un dispositivo físico, verifica que no estés usando un teclado de terceros (algunos no disparan el evento EnterPressed) e intenta con el teclado nativo.

Por otro lado puedes echarle una mirada a la librería IME, especificamente intenta con IME.AddHandleActionEvent y maneja el evento HandleAction.
 

J M Movilla Cuadrado

Member
Licensed User
Gracias Jorge por tu intervención; no me fue necesario probar tu consejo, porque me ha funcionado el código que me envía Jesús, a quien no sé cómo agradecerle las manitas que me echa...

He puesto
B4X:
Sub EditText1_TextChanged (Old As String, New As String)
    Dim UltimoChar = -1 As Int
    Try
        UltimoChar = Asc(New.SubString(EditText1.Text.Length-1))
    Catch
        Log(LastException)
    End Try
    If UltimoChar = 10 Then
        EditText1.Text=EditText1.Text.SubString2(0,EditText1.Text.Length-1) ' Quito el salto de línea.
        EditText1_EnterPressed
    Else
        ....
    End If
End Sub
y va perfecto. Como si se hubieran volado las brujas...

(SOLUCIONADO)
 
Last edited:

bgsoft

Well-Known Member
Licensed User
Longtime User
Hola:

Me alegro que lo solucionaras.

Pero como te dije, un enter son dos caracteres, un CR y un LF, si los quieres quitar en vez de quitar un caracter debes quitar los dos:

B4X:
EditText1.Text=EditText1.Text.SubString2(0,EditText1.Text.Length-2)

Una pregunta tonta :D, si no vas a utilizar el multilineas para que lo pones? :rolleyes:

Saludos
 

J M Movilla Cuadrado

Member
Licensed User
Buenos días (aunque por estas latitudes no podemos andar con estos optimismos, entre nieve y un vientecillo congelador...)

1º- Lo primero que hice fue poner -2; pero vi que me desaparecía el último carácter que había introducido en el texto. Con -1 me queda el texto perfecto.

2º.- Sí utilizo el multilíneas, para permitir que se introduzcan datos de longitud superior a la anchura del edittext, que de otra forma va corriendo hacia la izquierda, y resulta difícil visualizar el punto en que estás introduciendo el último carácter.

Ahora estoy intentando presentar la lista de esos datos, de forma que cada línea tenga la altura correspondiente al tamaño del texto. Lo calculo con MeasureMultilineTextHeight, pero no veo forma de evitar el error que me da, sin informarme del mismo...
A buen seguro que sigue siendo consecuencia de mi ignorancia... Y como tengo tan extraordinarias experiencias en este foro (en vosotros, sus componentes...), me voy a permitir abusar nuevamente de vuestra generosidad, y publico mi nueva consulta. Hasta ahora...
 
Last edited:

bgsoft

Well-Known Member
Licensed User
Longtime User
Hola:

1º- Lo primero que hice fue poner -2; pero vi que me desaparecía el último carácter que había introducido en el texto. Con -1 me queda el texto perfecto.
Tienes razon, el edittext solo mete el salto de linea

2º.- Sí utilizo el multilíneas, para permitir que se introduzcan datos de longitud superior a la anchura del edittext, que de otra forma va corriendo hacia la izquierda, y resulta difícil visualizar el punto en que estás introduciendo el último carácter.

puedes configurar como quieres que se ponga el texto asi:

B4X:
   ' mirate las diferentes opciones que tiene el gravity y pon la que mejor te vaya   
   EditText1.Gravity = Gravity.LEFT
   EditText1.Gravity = Gravity.CENTER
   EditText1.Gravity = Gravity.CENTER_VERTICAL
   
   ' tambien puedes emplear dos de ellas asi:
    EditText1.Gravity = Bit.Or(Gravity.CENTER_VERTICAL,Gravity.CENTER_HORIZONTAL)

Saludos
 
Top