Получение размеров мягкой клавиатуры
Есть ли способ узнать размер клавиатуры, отображаемой на экране?
Я использую Cocos2dx для программирования, но я хочу знать высоту клавиатуры, отображаемой на экране в части Android или в части Cocos, это не имеет значения.
Я знаю, что у Keyboard есть метод getHeight(), но я не хочу создавать новые клавиатуры, я хочу использовать стандартную.
12 ответов
Мы сделали это с этим
myLayout.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
Rect r = new Rect();
parent.getWindowVisibleDisplayFrame(r);
int screenHeight = parent.getRootView().getHeight();
int heightDifference = screenHeight - (r.bottom - r.top);
Log.d("Keyboard Size", "Size: " + heightDifference);
}
});
Мы изменяем размеры только с клавиатуры, чтобы мы могли использовать это.
Rect r = new Rect();
View rootview = this.getWindow().getDecorView(); // this = activity
rootview.getWindowVisibleDisplayFrame(r);
Результатом этого является количество места, которое ваше приложение использует на экране (работает, даже если активность не изменяется). Очевидно, что оставшееся место на экране будет использовано клавиатурой (если она видна)
Найденный идентификатор здесь: https://github.com/freshplanet/ANE-KeyboardSize/blob/master/android/src/com/freshplanet/ane/KeyboardSize/getKeyboardY.java
Если ваша деятельность не полноэкранная, используйте код ниже:
content.getViewTreeObserver().addOnGlobalLayoutListener(
new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
// TODO Auto-generated method stub
if (keyBoardHeight <= 100) {
Rect r = new Rect();
content.getWindowVisibleDisplayFrame(r);
int screenHeight = content.getRootView()
.getHeight();
int heightDifference = screenHeight
- (r.bottom - r.top);
int resourceId = getResources()
.getIdentifier("status_bar_height",
"dimen", "android");
if (resourceId > 0) {
heightDifference -= getResources()
.getDimensionPixelSize(resourceId);
}
if (heightDifference > 100) {
keyBoardHeight = heightDifference;
}
Log.d("Keyboard Size", "Size: " + heightDifference);
}
// boolean visible = heightDiff > screenHeight / 3;
}
});
Если вы хотите рассчитать высоту виртуальной клавиатуры, когда ваша активность не изменяется в размере (AdjustPan), то вы можете использовать этот пример:
https://github.com/siebeprojects/samples-keyboardheight
Он использует скрытое окно, чтобы вычислить разницу в высоте между окном и корневым видом действия.
Ты не можешь сказать. Нет, правда: ты просто не можешь сказать.
Клавиатура не должна быть какой-либо конкретной формы. Его не нужно размещать в нижней части экрана ( многие из самых популярных опций этого не делают), он не должен сохранять свой текущий размер при изменении текстовых полей (почти ни один из них не зависит от флагов). Он даже не должен быть прямоугольным. Это также может занять весь экран.
После 2020 года, если ваш минимальный SDK больше или равен 21, вы можете проверить видимость и высоту IME с помощью следующих функций:
fun isKeyboardVisible(attachedView: View): Boolean {
val insets = ViewCompat.getRootWindowInsets(attachedView)
return insets?.isVisible(WindowInsetsCompat.Type.ime()) ?: false
}
fun getKeyboardHeight(attachedView: View): Int {
val insets = ViewCompat.getRootWindowInsets(attachedView)
return insets?.getInsets(WindowInsetsCompat.Type.ime())?.bottom ?: 0
}
Я знаю, что это старый пост, но я заметил, что выбранное для меня решение работает не на всех устройствах. Казалось, что есть расхождение, и поэтому я реализовал это, и это, кажется, подвох:
final int[] discrepancy = new int[1];
discrepancy[0] = 0;
// this gets the height of the keyboard
content.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
Rect r = new Rect();
View rootview = activity.getWindow().getDecorView(); // this = activity
rootview.getWindowVisibleDisplayFrame(r);
int screen_height = rootview.getRootView().getHeight();
int keyboard_height = screen_height - (r.bottom + r.top) - discrepancy[0];
if (discrepancy[0] == 0) {
discrepancy[0] = keyboard_height;
if (keyboard_height == 0) discrepancy[0] = 1;
}
int margin_bottom = keyboard_height + Helper.getDp(10, activity);
RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) carousel_container.getLayoutParams();
params.setMargins(0, 0, 0, margin_bottom);
//boolean visible = heightDiff > screenHeight / 3;
}
});
Когда слушатель впервые вызывается, он измеряет экран без клавиатуры, и если есть расхождение, я отвечаю за него в следующий раз. Если нет расхождений, я устанавливаю расхождение на 1, чтобы оно больше не равнялось 0.
В cocos2d-x у нас есть CCEditBox.
Внутри Extensions->GUI->CCEditBox вы можете найти класс CCEditBox.
Прелесть в том, что он скрывает клавиатуру постукивания где-то еще на сцене. и автоматически перемещает клавиатуру вверх в том случае, если поле редактирования было расположено слишком низко на сцене.
Если вы используете cocos2d-x v2.1.3, вы можете перейти к примеру проекта, перейдя в
samples->cpp->TestCpp-> классы:>ExtensionTest->EditBoxTest.
Я просто собираюсь использовать его вместо CCTextField отныне. просто наткнулся на это вчера:)
После нескольких часов поиска я нашел решение, если вы хотите установитьwindowSoftInput="adjustPan"
Вот фрагмент кода:
final View root = findViewById(android.R.id.content);
root.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
Rect r = new Rect();
{
root.getWindowVisibleDisplayFrame(r);
}
@Override
public void onGlobalLayout() {
Rect r2 = new Rect();
root.getWindowVisibleDisplayFrame(r2);
int keyboardHeight = r.height() - r2.height();
if (keyboardHeight > 100) {
root.scrollTo(0, keyboardHeight);
}
else {
root.scrollTo(0, 0);
}
}
});
В этом коде после того, как я нашел высоту клавиатуры, я прокручиваю вид вверх, чтобы не закрывать клавиатуру, что является основной причиной для определения высоты клавиатуры.
Согласно документам:
void getWindowVisibleDisplayFrame(Rect outRect)
: Получить общий видимый размер дисплея, в котором расположено окно, к которому прикреплен этот вид.
Полный ответ и работал отлично для меня:
Rect r = new Rect();
View rootview = this.getWindow().getDecorView(); // this = activity
rootview.getWindowVisibleDisplayFrame(r);
int keyboardHeight = rootview.getHeight() - r.bottom;
Извините за невозможность комментировать, два или три ответа помогли мне решить мою проблему, и они были связаны с использованием AddOnGlobalLayoutListener, а затем с определением оставшейся высоты до и после появления клавиатуры.
Решение, которое я использовал, было основано на ответе Rudy_TM.
ОДНАКО одна вещь, которую я должен был найти, состояла в том, что для того, чтобы этот метод работал, у вас должна быть где-то следующая строка
Window.SetSoftInputMode(SoftInput.AdjustResize);
Раньше у меня был SoftInput.AdjustNothing (или что-то в этом роде), и он не работал. Теперь это работает отлично. Спасибо за ответы!
ROOT_VIEW экрана дисплея Android может быть визуализирован как одноэкранный вид с VISIBLE DISPLAY FRAME, который отображает вид вашей активности.
Эта ВИДИМОСТЬ ДИСПЛЕЯ регулируется, когда МЯГКАЯ КЛАВИАТУРА отображается или скрывается от экрана.
ПРИМЕЧАНИЕ: пожалуйста, посмотрите на два изображения, нажав на ссылки, приведенные ниже для лучшего понимания
Таким образом, ROOT VIEW экрана дисплея может быть визуализирован как: RootView экрана дисплея
Настройка VISIBLE DISPLAY FRAME с открытием и закрытием SOFT KEYBOARD может быть визуализирована как: VISIBLE_DISPLAY_SCREEN настройка
Эта настройка VISUAL DISPLAY FRAME может быть очень хорошо использована для определения высоты клавиатуры как:
(когда софт клавиатура открыта)
SOFT_KEYBOARD_HEIGHT = ROOT_VIEW_HEIGHT - (VISUAL_DISPLAY_FRAME_HEIGHT + EXTRA_SCREEN_HEIGHT)
Код для достижения вышеупомянутого:
int mExtraScreenHeight=-1, mKeyboardHeight=-1;
boolean mKeyboardOpen;
rootView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
int rootViewHeight, visibleDisplayFrameHeight, fakeHeight;
/* (rootViewHeight - visibleDisplayFrameHeight) is not the real height of the keyboard
it is the fake height as it also consist of extra screen height
so FAKE_HEIGHT = KEYBOARD_HEIGHT + EXTRA_SCREEN_HEIGHT
To get keyboard height extra screen height must be removed from fake height
*/
Rect rect = new Rect();
rootView.getWindowVisibleDisplayFrame(rect);
rootViewHeight = rootView.getRootView().getHeight();
visibleDisplayFrameHeight = rect.height();
fakeHeight = rootViewHeight-visibleDisplayFrameHeight;
if (mExtraScreenHeight == -1){
mExtraScreenHeight=fakeHeight;
}
/* Suppose the soft keyboard is open then the VISIBLE_DISPLAY_FRAME is in reduced size
due to the space taken up by extra screen and the keyboard but when the soft keyboard closes
then KEYBOARD_HEIGHT=0 and thus FAKE_HEIGHT = EXTRA_SCREEN_HEIGHT
*/
else if (fakeHeight <= mExtraScreenHeight){
mExtraScreenHeight=fakeHeight;
mKeypadOpen=false;
}
else if (fakeHeight > mExtraScreenHeight){
mKeypadHeight=fakeHeight-mExtraScreenHeight;
mKeypadOpen=true;
}
}
});
ПРИМЕЧАНИЕ. Функция onGlobalLayout() будет вызываться только при изменении глобального макета, например при открытии программной клавиатуры. Таким образом, мягкая клавиатура должна быть открыта хотя бы один раз, чтобы получить высоту мягкой клавиатуры.
У меня это сработало;)