Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Desarrollo en Delphi para Android (https://www.clubdelphi.com/foros/forumdisplay.php?f=57)
-   -   Teclado virtual se superpone a los controles de entrada (https://www.clubdelphi.com/foros/showthread.php?t=92397)

MAXIUM 16-10-2017 04:52:59

¿Como saber la dimensión del teclado virtual?
 
Esa es la pregunta, ¿como puedo obtener las dimensiones del teclado virtual en Android.

La idea es que los Edit no queden debajo del teclado. Ya se que hay un ejemplo de Embarcadero, pero a veces ese ejemplo no funciona y al implementarlo en mi APP no hace nada.

También quisiera que funcionará en un Memo cada vez que hay salto de línea :)

AgustinOrtu 16-10-2017 17:55:48

No debería ser siempre el mismo ancho que el de la pantalla?

MAXIUM 16-10-2017 19:09:06

Cita:

Empezado por AgustinOrtu (Mensaje 521761)
No debería ser siempre el mismo ancho que el de la pantalla?

¿Y el alto?

MAXIUM 19-10-2017 18:32:05

Teclado virtual se superpone a los controles de entrada
 
La solución sería agregar esta línea al AndroidManifest.xml del proyecto. Por IDE no se donde encontrarlo, pero si lo agrego al archivo, al compilar se borra.

android:windowSoftInputMode="adjustPan"

Por código sería

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);

pero no se como implementarlo en Delphi.

jhonalone 20-10-2017 13:32:01

Hola MAXIUM.

A ver si te sirve este hilo.

Si funciona, me lo cuentas. A mí me va a interesar en un futuro. Gracias.

Saludos

MAXIUM 20-10-2017 15:01:11

Cita:

Empezado por jhonalone (Mensaje 521867)
Hola MAXIUM.

A ver si te sirve este hilo.

Si funciona, me lo cuentas. A mí me va a interesar en un futuro. Gracias.

Saludos

Es demasiado código para algo que se soluciona con una línea usando Android Studio.

Además, el ejemplo a veces funciona y no logro aplicarlo a un Memo.

jhonalone 20-10-2017 22:46:54

A ver MAXIUM, en un TMemo, cuando abres una línea con ENTER y no cabe en el espacio que tú has reservado para el componente en tiempo de diseño, el mismo componente te habilita una nueva línea y desplaza el resto hacia arriba. Aquí no tienes problema.

Por otro lado, todos sabemos que Android Studio funciona distinto de Delphi.
Las Apps creadas con este programa, ocupan menos recursos que las compiladas con Delphi.
Tienes razón en que este programa necesita menos código que que Delphi (en bastantes acciones)
Claro, el código se genera directamente en Java. Delphi tiene que emular Java de alguna manera.

También me extraña que, si vas a programar la App en Android Studio, hagas esta pregunta en el foro de Delphi.

Saludos.

MAXIUM 21-10-2017 01:03:12

Cita:

Empezado por jhonalone (Mensaje 521898)
A ver MAXIUM, en un TMemo, cuando abres una línea con ENTER y no cabe en el espacio que tú has reservado para el componente en tiempo de diseño, el mismo componente te habilita una nueva línea y desplaza el resto hacia arriba. Aquí no tienes problema.

Por otro lado, todos sabemos que Android Studio funciona distinto de Delphi.
Las Apps creadas con este programa, ocupan menos recursos que las compiladas con Delphi.
Tienes razón en que este programa necesita menos código que que Delphi (en bastantes acciones)
Claro, el código se genera directamente en Java. Delphi tiene que emular Java de alguna manera.


Lamento no hacerme entender. Me refiero al código requerido para que el teclado virtual no se solape sobre los controles de entrada.

Ejemplo, a la izquierda un programa en DELPHI para Android, con un button, label y un par de edit al pie.

Al seleccionar los edit, el teclado virtual se superpone.

----

Este es el código Delphi sugerido por Embarcadero para evitar que se superponga: http://docwiki.embarcadero.com/CodeE...bleForm_Sample
Código Delphi [-]
procedure TFormMain.FormCreate(Sender: TObject);
begin
  VKAutoShowMode := TVKAutoShowMode.Always;
  VertScrollBox1.OnCalcContentBounds := CalcContentBoundsProc;
end;

procedure TFormMain.CalcContentBoundsProc(Sender: TObject;
                                       var ContentBounds: TRectF);
begin
  if FNeedOffset and (FKBBounds.Top > 0) then
  begin
    ContentBounds.Bottom := Max(ContentBounds.Bottom,
                                2 * ClientHeight - FKBBounds.Top);
  end;
end;

procedure TFormMain.RestorePosition;
begin
  VertScrollBox1.ViewportPosition := PointF(VertScrollBox1.ViewportPosition.X, 0);
  MainLayout1.Align := TAlignLayout.Client;
  VertScrollBox1.RealignContent;
end;

procedure TFormMain.UpdateKBBounds;
var
  LFocused : TControl;
  LFocusRect: TRectF;
begin
  FNeedOffset := False;
  if Assigned(Focused) then
  begin
    LFocused := TControl(Focused.GetObject);
    LFocusRect := LFocused.AbsoluteRect;
    LFocusRect.Offset(VertScrollBox1.ViewportPosition);
    if (LFocusRect.IntersectsWith(TRectF.Create(FKBBounds))) and
       (LFocusRect.Bottom > FKBBounds.Top) then
    begin
      FNeedOffset := True;
      MainLayout1.Align := TAlignLayout.Horizontal;
      VertScrollBox1.RealignContent;
      Application.ProcessMessages;
      VertScrollBox1.ViewportPosition :=
        PointF(VertScrollBox1.ViewportPosition.X,
               LFocusRect.Bottom - FKBBounds.Top);
    end;
  end;
  if not FNeedOffset then
    RestorePosition;
end;

procedure TFormMain.FormFocusChanged(Sender: TObject);
begin
  UpdateKBBounds;
end;

procedure TFormMain.FormVirtualKeyboardHidden(Sender: TObject;
                                           KeyboardVisible: Boolean;
                                           const Bounds: TRect);
begin
  FKBBounds.Create(0, 0, 0, 0);
  FNeedOffset := False;
  RestorePosition;
end;

procedure TFormMain.FormVirtualKeyboardShown(Sender: TObject;
                                          KeyboardVisible: Boolean;
                                          const Bounds: TRect);
begin
  FKBBounds := TRectF.Create(Bounds);
  FKBBounds.TopLeft := ScreenToClient(FKBBounds.TopLeft);
  FKBBounds.BottomRight := ScreenToClient(FKBBounds.BottomRight);
  UpdateKBBounds;
end;

En Android Studio solo coloco los componentes y ya

----

Y este es el código requerido para la misma función usando Android Studio:
Código Delphi [-]
NADA

¿Cual es el objetivo de la comparación?

Simplemente encontrar el equivalente en código o configuración del IDE en Delphi que realice lo mismo y que debería ser automático.

Cita:

Empezado por jhonalone (Mensaje 521898)
También me extraña que, si vas a programar la App en Android Studio, hagas esta pregunta en el foro de Delphi.

Saludos.

Como trato de explicar, mi intención no es programar en Android Studio, sino en Delphi...

Casimiro Notevi 21-10-2017 01:17:53

Pero eso es algo automático en android, no hay que hacer nada para que se desplace la pantalla al salir el teclado.

MAXIUM 21-10-2017 01:30:50

Cita:

Empezado por Casimiro Notevi (Mensaje 521903)
Pero eso es algo automático en android, no hay que hacer nada para que se desplace la pantalla al salir el teclado.

Exacto, pero no ocurre en Delphi XE. Te obligan a escribir todo ese código para algo tan simple

https://www.youtube.com/watch?v=D1DsS1131_c


jhonalone 21-10-2017 19:39:56

Hola MAXIUM.

Cita:

Exacto, pero no ocurre en Delphi XE. Te obligan a escribir todo ese código para algo tan simple
En mi pueblo se dice que "no hay atajo sin trabajo". Cuando encuentras ése "atajo" en Android, es porque alguien se ha tomado el "trabajo" de implementarlo. Ojala todo estuviera ya preparado para usar, (¿dónde estaría nuestro trabajo? ¡Cualquiera podría programar sin ningún esfuerzo ni estudio!).

Algo tenemos que poner de nuestra parte... Bien es verdad que cuando podemos usar un trabajo que ya está hecho, sería de tontos repetirlo.

En el tema que nos ocupa, hay bastante gente que ha tratado de resolverlo en Delphi, tomándose un esfuerzo, (como es natural). Ya que (como muchas otras cosas que no serían muy útiles) Embarcadero todavía no ha hecho ése trabajo por nosotros. ¡Y creo que no es poco, que podamos programar para Android desde Delphi!. Seguro que en otras versiones venideras nos facilitará esto y muchas otras cosas. Eso sí, ¡habrá que pagarlo!

Buscando por ahí he encontrado esta unidad que, sólo con citarla en la cláusula uses, hace todo el trabajo por nosotros.

He leído que hay gente trabajando en ella, pero todavía no está perfeccionada por completo.

Yo hice una prueba y funciona "razonablemente" bien. Si tienes en la pantalla un Edit solamente, la primera vez que lo pulsas el teclado virtual se superpone... luego ya no... (¡?)

Bueno, como tenemos el código fuente, tal vez podamos resolver éste y otros inconvenientes que pueda presentarnos...

Ya tenemos un punto de partida... y, para nosotros, no es mucho código citar la unit vkbdhelper en el apartado uses

Seguiremos "trabajando en este atajo"

Perdona por haberme extendido tanto.

Saludos.

AgustinOrtu 21-10-2017 20:06:24

Cita:

Empezado por jhonalone (Mensaje 521914)
Hola MAXIUM.

En mi pueblo se dice que "no hay atajo sin trabajo". Cuando encuentras ése "atajo" en Android, es porque alguien se ha tomado el "trabajo" de implementarlo. Ojala todo estuviera ya preparado para usar, (¿dónde estaría nuestro trabajo? ¡Cualquiera podría programar sin ningún esfuerzo ni estudio!).

Estaba a punto de comentar lo mismo. Android Studio no es magico, es tal y como dice jhonalone, alguien programo ese comportamiento. El problema de muchas "soluciones" que aparecen en la comunidad, es que son chapuceras a falta de un mejor termino, es decir, funcionan bien, pero hay que pegar un choclazo de codigo y replicarlo en cada proyecto. No es tan sencillo llegar a la simpleza de que simplemente poniendo un componente, o incluyendo una simple unidad, ya se resuelve todo el trabajo

Ahora, por otra parte, en algunas situaciones se ha demostrado como Delphi permite hacer muy simple lo que en las herramientas nativas como Android Studio toma mas lineas:

https://www.youtube.com/watch?v=q-xJRw2H-ZU

jhonalone 21-10-2017 20:28:48

Hola Agustín.

Muy cierto lo que dices.
Cita:

Ahora, por otra parte, en algunas situaciones se ha demostrado como Delphi permite hacer muy simple lo que en las herramientas nativas como Android Studio toma mas lineas
En muchas tareas Delphi nos facilita mucho las cosas. Mucho más que otros lenguajes de desarrollo. En otras pues tal vez menos... Esto es lo que hay...

Saludos.

MAXIUM 21-10-2017 20:49:32

Hola a todos, gracias por responder el hilo.

Imagino que la idea de todo lenguaje de alto nivel, es de abstraernos y concentrarnos en otros puntos. Así nacen las bibliotecas (librerias) y componentes en general.

Pero también hay razón que detrás de eso hay un esfuerzo de otros y se debe agradecer junto con aportar cuando se puede.

Probaré la unit mencionada y les comento. Esa es la idea del foro, que podamos compartir soluciones para cualquiera que tenga la misma inquietud, tenga una solución y no se atasque en su proyecto.

MAXIUM 22-10-2017 00:46:44

Cita:

Empezado por jhonalone (Mensaje 521914)
Buscando por ahí he encontrado esta unidad que, sólo con citarla en la cláusula uses, hace todo el trabajo por nosotros.

Cita:

vkbdhelper.pas

Force focused control visible when Android/IOS Virtual Keyboard showed or hiden

How to use?

place vkdbhelper into your project uses section. No more code needed.


----

kurono 22-10-2017 02:48:36

y el ejemplo que motraste mas arriba de embarcadero que tal funciona

MAXIUM 22-10-2017 03:22:03

Cita:

Empezado por kurono (Mensaje 521923)
y el ejemplo que motraste mas arriba de embarcadero que tal funciona

No funciona :(

Tal parece que no resulta para todas las versiones de Firemonkey. Embarcadero tiene una tarea pendiente https://stackoverflow.com/questions/...eyboard-height

kurono 22-10-2017 03:25:47

acabo de bajar la unit vkdbhelper y ya la probe funciona a la primera creo que me quedo con esta

MAXIUM 22-10-2017 03:46:59

Cita:

Empezado por kurono (Mensaje 521925)
acabo de bajar la unit vkdbhelper y ya la probe funciona a la primera creo que me quedo con esta

¿Que versión de Delphi estas usando?

kurono 22-10-2017 05:18:06

delphi xe7 update 1


La franja horaria es GMT +2. Ahora son las 21:15:07.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi