Как узнать высоту софт-клавиатуры в приложении LibGDX

Я разрабатываю игру для Android с LibGDX. И мне нужно найти высоту программной клавиатуры, которую использует пользователь, так как я хочу отобразить некоторые объекты прямо над клавиатурой.

Я прочитал эту тему: как я могу получить мягкую высоту клавиатуры на Android?

Но комментарий говорит о том, что он не работает, и, кажется, также для использования с Android SDK. Я не уверен. Кто-нибудь знает способ, который определенно будет работать?

2 ответа

Надеюсь, кто-то найдет этот ответ полезным:

Существует тренировка для определения точной высоты программной клавиатуры, которая включает в себя Launcher Activity для отправки размера экрана в игру, когда происходит событие изменения размера экрана.

Сначала установите прослушиватель макета на ViewTreeObserver корневого представления вашей LauncherActivity:

public class AndroidLauncher extends AndroidApplication {
//...
    public void setListenerToRootView() {
        final View activityRootView = getWindow().getDecorView().findViewById(android.R.id.content);
        activityRootView.getViewTreeObserver().addOnGlobalLayoutListener(keyboardLayoutListener);
    }

    private ViewTreeObserver.OnGlobalLayoutListener keyboardLayoutListener = new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            Rect visibleDisplayFrame = new Rect();
            getWindow().getDecorView().getWindowVisibleDisplayFrame(visibleDisplayFrame);
            game.screenResize(visibleDisplayFrame.width(), visibleDisplayFrame.height());
        }
    };
//...
}

Если вы попытаетесь получить высоту корневого представления, оно не будет работать, так как большинство игр являются полноэкранными.

Не забудьте добавить и удалить слушателя в соответствующих случаях:

@Override
protected void onCreate (Bundle savedInstanceState) {
    //...
    setListenerToRootView();
}

@Override
protected void onDestroy () {
    super.onDestroy();
    removeListenerToRootView();
}

public void removeListenerToRootView() {
    final View activityRootView = getWindow().getDecorView().findViewById(android.R.id.content);
    activityRootView.getViewTreeObserver().removeOnGlobalLayoutListener(keyboardLayoutListener);
}

Затем объявите метод screenResize внутри класса Game, который получит размеры и отправит его на текущий экран:

public class YourGame extends Game {
//...
public ScreenBase currentScreen;
//...
    public void screenResize(float width, float height) {
        if(currentScreen != null)
            currentScreen.onScreenResize(width, height);
    }
//...
}

Каждый экран, который включает изменение, должен реализовывать метод onScreenResize. Представьте абстрактный базовый класс экрана с абстрактным методом onScreenResize. Переменная currentScreen должна быть установлена ​​в конструкторе:

public abstract class ScreenBase implements Screen {
//...

public ScreenBase(YourGame game) {
//...
    this.game = game;
    this.game.currentScreen = this;
//....
}

public abstract void onScreenResize(float width, float height);

Реализуйте их на любом экране:

public class LoginScreen extends ScreenBase {  
//...
    @Override
    public void onScreenResize(final float width, final float height) {
        if(Gdx.graphics.getHeight() > height) {
            Gdx.app.log("LoginScreen", "Height of keyboard: " + (Gdx.graphics.getHeight() - height));
        }
    }
}

Если ваша проблема в том, что ваши текстовые поля не видны, тогда я предлагаю использовать

void Gdx.input.getTextInput(Input.TextInputListener listener, java.lang.String title, java.lang.String text)

вместо этого, потому что это сгенерирует собственный модальный диалог ввода текста, который перемещается вверх и вниз с помощью клавиатуры. Я также пытался определить высоту клавиатуры, но пока не справился.

Смотрите также ответы на эту тему: Как libgdx обнаруживает присутствие клавиатуры

Другие вопросы по тегам