How can I get the height of virtual keyboard in Android? Is it possible?
I try to get it from the main window, but it gives me full height of the application. But I
You can't get the keyboard height, but you can get the height of your View, which is what you really want - and you'll get this data supplied to the onLayout call into the current view.
This solution is also hacky but solve the problem (atleast for me).
android:windowSoftInputMode="adjustResize"
flag in activity tag in manifest.Now main story is in onGlobalLayout()
. There i calculate the difference between the y axis of temp view and height of root view
final View view = findViewById(R.id.base); view.getViewTreeObserver().addOnGlobalLayoutListener(new 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
}
});
Try this
KeyboardView keyboardView = new KeyboardView(getApplicationContext(), null);
int height = (keyboardView.getKeyboard()).getHeight();
Toast.makeText(getApplicationContext(), height+"", Toast.LENGTH_LONG).show();
Let's suppose that the rootView of your layout is RelativeLayout. What you can do create a class CustomRelativeLayout which extends RelativeLayout and Overrides onSizeChanged Method inside it. So when the soft keyboard opens up, the height of the RelativeLayout will change and the change will be notified inside the onSizeChanged Method.
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
// oldh is the height when the layout was covering the whole screen
// h is the new height of the layout when the soft keyboard opened up
if(softKeyboardHeight > oldh * 0.15) {
Log.i("Here", Integer.toString(softKeyboardHeight));
// Keyboard has popped up
} else {
// Not the keyboard
}
}
In your Manifest file make these changes so that the Activity opens in Resize Mode and Not pan and scan mode. In Resize mode the Layout will be able to resize when keybaord opens up. To read more about pan-scan and Resize visit 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>
If you don't want android:windowSoftInputMode="adjustResize"
in your app.
You can try something like this:
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));
}
});
you can use this sample code. it is dirty solution but it works
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();