Как я могу получить высоту виртуальной клавиатуры в Android? Возможно ли это?
Я пытаюсь получить его из главного окна, но он дает мне полную высоту приложения. Но я хочу получить высоту клавиатуры.
Как я могу получить высоту виртуальной клавиатуры в Android? Возможно ли это?
Я пытаюсь получить его из главного окна, но он дает мне полную высоту приложения. Но я хочу получить высоту клавиатуры.
Вы не можете получить высоту клавиатуры, но вы можете получить высоту вашего представления, чего вы действительно хотите - и вы получите эти данные, которые будут отправлены на вызов onLayout в текущее представление.
вы можете использовать этот пример кода. это грязное решение, но оно работает
Thread t = new Thread(){
public void run() {
int y = mainScreenView.getHeight()-2;
int x = 10;
int counter = 0;
int height = y;
while (true){
final MotionEvent m = MotionEvent.obtain(
SystemClock.uptimeMillis(),
SystemClock.uptimeMillis(),
MotionEvent.ACTION_DOWN,
x,
y,
INTERNAL_POINTER_META_STATE);
final MotionEvent m1 = MotionEvent.obtain(
SystemClock.uptimeMillis(),
SystemClock.uptimeMillis(),
MotionEvent.ACTION_UP,
x,
y,
INTERNAL_POINTER_META_STATE);
boolean pointer_on_softkeyboard = false;
try {
getSingletonInstrumentation().sendPointerSync(m);
getSingletonInstrumentation().sendPointerSync(m1);
} catch (SecurityException e) {
pointer_on_softkeyboard = true;
}
if (!pointer_on_softkeyboard){
if (y == height){
if (counter++ < 100){
Thread.yield();
continue;
}
} else if (y > 0){
softkeyboard_height = mainScreenView.getHeight() - y;
}
break;
}
y--;
}
if (softkeyboard_height > 0 ){
// it is calculated and saved in softkeyboard_height
} else {
calculated_keyboard_height = false;
}
}
};
t.start();
Это решение также хаки, но решает проблему (по крайней мере для меня).
android:windowSoftInputMode="adjustResize"
в тег активности в манифесте.Теперь основная история находится в onGlobalLayout()
. Там я вычисляю разницу между осью y temp view и высотой корневого представления
final View view = findViewById (R.id.base); view.getViewTreeObserver(). addOnGlobalLayoutListener (новый OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
int rootViewHeight = view.getRootView().getHeight();
View tv = findViewById(R.id.temp_view);
int location[] = new int[2];
tv.getLocationOnScreen(location);
int height = (int) (location[1] + tv.getMeasuredHeight());
deff = rootViewHeight - height;
// deff is the height of soft keyboard
}
});
Если вы не хотите android:windowSoftInputMode="adjustResize"
в своем приложении.
Вы можете попробовать что-то вроде этого:
any_view.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
int height = main_layout.getHeight();
Log.w("Foo", String.format("layout height: %d", height));
Rect r = new Rect();
main_layout.getWindowVisibleDisplayFrame(r);
int visible = r.bottom - r.top;
Log.w("Foo", String.format("visible height: %d", visible));
Log.w("Foo", String.format("keyboard height: %d", height - visible));
}
});
Попробуйте это
KeyboardView keyboardView = new KeyboardView(getApplicationContext(), null);
int height = (keyboardView.getKeyboard()).getHeight();
Toast.makeText(getApplicationContext(), height+"", Toast.LENGTH_LONG).show();
Предположим, что rootView вашего макета - это RelativeLayout. Что вы можете сделать, создайте класс CustomRelativeLayout, который расширяет RelativeLayout и переопределяет метод onSizeChanged внутри него. Поэтому, когда программная клавиатура откроется, высота RelativeLayout изменится, и об этом будет сообщено в методе onSizeChanged.
public class CustomRelativeLayout extends RelativeLayout {
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
int softKeyboardHeight = oldh - h; // Assuming softKeyboard Opened up
if(softKeyboardHeight > oldh * 0.15) {
Log.i("Here", Integer.toString(softKeyboardHeight));
// Keyboard has popped up
} else {
// Not the keyboard
}
}
В файле манифеста внесите эти изменения, чтобы действие открывалось в режиме изменения размера, а не в режиме панорамирования и сканирования. В режиме изменения размера макет сможет изменить размер при открытии клавиатуры. Чтобы узнать больше о пан-сканировании и изменении размера посетите https://developer.android.com/training/keyboard-input/visibility
<activity
android:name=".MainActivity"
android:windowSoftInputMode="adjustResize">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>