Estoy preparando un programa en el que voy a tener 3 editbox y mi idea era tener un único botón para hacer la llamada a la librería de escaneado de código de barras.
Hasta ahora la lectura del código de barras siempre lo mandaba a un único editbox, con lo cual no había problema. Pero ahora necesito que el resultado de la lectura del código de barras vaya a parar al campo editbox que tenía el foco justo en el momento de pulsar el botón que lanza el escaneado.
Me respondo a mi mismo.
Daba por hecho que al pulsar el botón el foco se cambiaba al botón y lo perdía del editbox, pero tras estar mirando los logs, parece que el foco no se "quita" del editbox, con lo cual, creo que simplemente tengo que preguntar por .requestfocus.
De todas formas. ¿Hay manera de saber cuál es el componente del view que tenga el foco en un momento dado?
Parece que no va a ser tan fácil como pensaba en un principio, ya que no puedo preguntar por le estado de .requestfocus, ya que al hacerlo, activo el componente sobre el que hago la pregunta...
Puedes hacerlo de la siguiente forma:
Declaras una variable de tipo EditText, la cual contendrá el ultimo editText que tuvo el foco:
B4X:
Sub EditText_FocusChanged (HasFocus As Boolean)
If HasFocus Then Focused = Sender
End Sub
Teniendo en cuenta lo siguiente: Focused es una variable global de tipo EditText EditText es el nombre del evento de los EditText que quieres "revisar el foco"
Puedes hacerlo de la siguiente forma:
Declaras una variable de tipo EditText, la cual contendrá el ultimo editText que tuvo el foco:
B4X:
Sub EditText_FocusChanged (HasFocus As Boolean)
If HasFocus Then Focused = Sender
End Sub
Teniendo en cuenta lo siguiente: Focused es una variable global de tipo EditText EditText es el nombre del evento de los EditText que quieres "revisar el foco"
Muchas gracias. Así lo estoy haciendo y a mayores en el tag de cada uno de los editbox les estoy poniendo un valor diferente para luego en el momento necesario poder preguntar por el valor de Focused.tag. Perdón por la pregunta quizás "tonta". ¿Hay alguna forma de saber el nombre del componente asignado en cada momento al focused o no hay más remedio que utilizar el tag?
Una pena, ya que sería mucho más "cómodo". Quizás "San Erel" nos lea y en próximas versiones lo implemente.
De todas formas, con el truco de memorizar previamente el nombre del campo en el tag de cada edit estoy servido.
Muchas gracias.
La cosa al final quedará algo similar a:
B4X:
Globals
Private EditTextActivo As EditText
Sub EditText_FocusChanged (HasFocus As Boolean)
If HasFocus Then
EditTextActivo = Sender
Log("EditTextActivo: " & EditTextActivo.Tag)
Else
Dim EditTextActivo As EditText 'Haciendo esto se queda sin inicializar
End If
End Sub
Sub myABBarcode_BarcodeFound (barCode As String, formatName As String)
' Obtengo el nombre del edit activo que previamente lo almacene en el .Tag y en función de dicho valor procedo...
Dim NombreEditActivo As String = EditTextActivo.Tag
If NombreEditActivo.EqualsIgnoreCase("EditCodigo") Then
ValidarCodigoArticulo(barCode)
Else
RellenarCampo(NombreEditActivo, barCode)
End If
End Sub
En el Tag no solo puedes guardar texto, sino tambien objetos.
En mas de una ocasion he metido en el tag Maps y otros tipos de objetos... (es más, asi es como descargo imágenes)
Un saludo.
En el Tag no solo puedes guardar texto, sino tambien objetos.
En mas de una ocasion he metido en el tag Maps y otros tipos de objetos... (es más, asi es como descargo imágenes)
Un saludo.
Date cuenta que la propiedad Tag es un Object... con lo cual puede almacenar cualquier cosa... Al igual que los maps, lists, etc, en su interior tienen Objects...
Como diría Pitbull... "ya tu sabe"