Spanish [SOLUCIONADO] Saber que componente tenía el foco previamente a la pulsación de un botón

Gabino A. de la Gala

Active Member
Licensed User
Buenos días.

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.

Gracias y un saludo.
 

Gabino A. de la Gala

Active Member
Licensed User
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?

Un saludo.
 
Last edited:

Gabino A. de la Gala

Active Member
Licensed User
Me sigo contestando a mi mismo.

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...
 

Descartex

Well-Known Member
Licensed User
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"

Un saludo.
 

Gabino A. de la Gala

Active Member
Licensed User
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"

Un saludo.
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?

Gracias y un saludo.
 

Descartex

Well-Known Member
Licensed User
No, el nombre no esta accesible... no forma parte de las propiedades.
Un saludo.
 

Gabino A. de la Gala

Active Member
Licensed User
No, el nombre no esta accesible... no forma parte de las propiedades.
Un saludo.
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
 

Descartex

Well-Known Member
Licensed User
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.
 

Gabino A. de la Gala

Active Member
Licensed User
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.
Algún día nos dirás cómo. :D;)
 

Descartex

Well-Known Member
Licensed User
Algún día nos dirás cómo. :D;)
Ese dia ha llegado:
Tan sencillo como esto:
B4X:
Dim job As HttpJob
    job.Initialize("VideoThumb",Me)
    job.Tag=ivThumb
    job.Download(URLImagen)
Luego, en el JobDone:
B4X:
Case "VideoThumb"
                Dim iv As ImageView = Job.Tag
                iv.Bitmap=Job.GetBitmap
                iv.Gravity=Gravity.FILL
                Job.Release
Facil. sencillo y para toda la familia.

Un saludo.
 

Gabino A. de la Gala

Active Member
Licensed User
Ese dia ha llegado:
Tan sencillo como esto:
B4X:
Dim job As HttpJob
    job.Initialize("VideoThumb",Me)
    job.Tag=ivThumb
    job.Download(URLImagen)
Luego, en el JobDone:
B4X:
Case "VideoThumb"
                Dim iv As ImageView = Job.Tag
                iv.Bitmap=Job.GetBitmap
                iv.Gravity=Gravity.FILL
                Job.Release
Facil. sencillo y para toda la familia.

Un saludo.
La verdad es que éste "uso" del tag abre un abanico de posibilidades tremendo. Yo hasta ahora sólo lo utilizaba para memorizar un valor "concreto".
 

Descartex

Well-Known Member
Licensed User
La verdad es que éste "uso" del tag abre un abanico de posibilidades tremendo. Yo hasta ahora sólo lo utilizaba para memorizar un valor "concreto".
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"
;)
 
Top