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?
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.yYou 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!
Thanks for the answer!
I will implement your solution as I don’t see a way to get the virtual keyboard to emit a signal when reaching full height.

