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

Discussion in 'Spanish Forum' started by Gabino A. de la Gala, May 27, 2018.

  1. Gabino A. de la Gala

    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.
     
  2. Gabino A. de la Gala

    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: May 27, 2018
  3. Gabino A. de la Gala

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

    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:
    Code:
    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 likes this.
  5. Gabino A. de la Gala

    Gabino A. de la Gala Active Member Licensed User

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

    Descartex Well-Known Member Licensed User

    No, el nombre no esta accesible... no forma parte de las propiedades.
    Un saludo.
     
  7. Gabino A. de la Gala

    Gabino A. de la Gala Active Member Licensed User

    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:

    Code:
    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
     
  8. Descartex

    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 likes this.
  9. Gabino A. de la Gala

    Gabino A. de la Gala Active Member Licensed User

    Algún día nos dirás cómo. :D;)
     
  10. Descartex

    Descartex Well-Known Member Licensed User

    Ese dia ha llegado:
    Tan sencillo como esto:
    Code:
    Dim job As HttpJob
        job.Initialize(
    "VideoThumb",Me)
        job.Tag=ivThumb
        job.Download(URLImagen)
    Luego, en el JobDone:
    Code:
    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 likes this.
  11. Gabino A. de la Gala

    Gabino A. de la Gala Active 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".
     
  12. Descartex

    Descartex Well-Known Member Licensed User

    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"
    ;)
     
Loading...
  1. This site uses cookies to help personalise content, tailor your experience and to keep you logged in if you register.
    By continuing to use this site, you are consenting to our use of cookies.
    Dismiss Notice