So I am trying to build a simple todo APP for mobile as a learning experience.

I have a lineEdit which activates the virtual keyboard. This goes over the lineEdit.

I read that I should get the keyboard height with displayserver.virtual_keyboard_height() on an focus_entered() signal which is emitted from lineEdit.

When I try to do that, the value is 0. This is because the keyboard appears to slow. I put in a:

await get_tree().create_timer(1).timeout

Which gets the height of the keyboard but building in a 1 second delay can't possibly be the right solution here.

My question is: how did you solve this problem? And is it possible to not bother wit that at all? Is there a option in the project settings that makes it that, when the keyboard appears the whole app gets pushed up?

I don't really grasp how the keyboard interacts with the app. Is it considered an overlay or part of the app?

you are viewing a single comment's thread
view the rest of the comments
[–] 3 points 11 months ago* (last edited 11 months ago) (1 child)

I encountered this problem mylsef. The way I solved it was to do a scroll container and then do:

func _scroll_to_text_edit(text_edit : TextEdit) -> void:
 scroll_container.ensure_control_visible(text_edit)

For the height problem you have to do it inside a _process() so it runs in every frame:

func _process(_delta: float) -> void:
 if DisplayServer.has_feature(DisplayServer.FEATURE_VIRTUAL_KEYBOARD):
  var keyboard_height = DisplayServer.virtual_keyboard_get_height()
  if keyboard_height > 0:
   self.size.y = get_viewport_rect().size.y - keyboard_height
  else:
   self.size.y = get_viewport_rect().size.y

You can check my lame implementation here: https://github.com/4Robato/track-your-counters/blob/main/UI/main.gd

It's been a while and I forgot a bit the details and I can't take a deeper look now but I hope this helps!

  • source
  • hideshow 1 child comment