당황스럽게도 안드로이드에는 키보드가 떴는지 안떴는지를 알 수 있는 API도 없고, 이벤트도 없습니다.
우회해서 알아내야하는데요.
터치이벤트 자체를 낚아채서 강제로 이벤트를 주면서 키보드 상태를 알아내는 법. 화면사이즈 변경된 걸로 알아내는 법. 몇몇 방법이 있지만 재사용하기 편한 건 키보드가 뜨면서 화면크기가 변경된 걸 알아내는 뷰 하나 만들어서 화면에 붙이는 게 편하더군요.
주의점은 AndroidManifest.xml에서 android:windowSoftInputMode 에 adjustResize 속성을 추가해야합니다.
키보드 등장에 화면크기가 바뀌는 걸로 설정했기 때문에 키보드 등장에 의한 자동 스크롤(Pan)은 되지않습니다.
키보드 알아내는 뷰.
SoftKeyboardDectectorView.java 소스 내용
사용 예) 사용하는 activity의 onCreate같은 곳에 다음과 같이 사용
우회해서 알아내야하는데요.
터치이벤트 자체를 낚아채서 강제로 이벤트를 주면서 키보드 상태를 알아내는 법. 화면사이즈 변경된 걸로 알아내는 법. 몇몇 방법이 있지만 재사용하기 편한 건 키보드가 뜨면서 화면크기가 변경된 걸 알아내는 뷰 하나 만들어서 화면에 붙이는 게 편하더군요.
주의점은 AndroidManifest.xml에서 android:windowSoftInputMode 에 adjustResize 속성을 추가해야합니다.
키보드 등장에 화면크기가 바뀌는 걸로 설정했기 때문에 키보드 등장에 의한 자동 스크롤(Pan)은 되지않습니다.
키보드 알아내는 뷰.
SoftKeyboardDectectorView.java 소스 내용
package com.givenjazz.android;
import android.app.Activity;
import android.content.Context;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.view.View;
public class SoftKeyboardDectectorView extends View {
private boolean mShownKeyboard;
private OnShownKeyboardListener mOnShownSoftKeyboard;
private OnHiddenKeyboardListener onHiddenSoftKeyboard;
public SoftKeyboardDectectorView(Context context) {
this(context, null);
}
public SoftKeyboardDectectorView(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
Activity activity = (Activity)getContext();
Rect rect = new Rect();
activity.getWindow().getDecorView().getWindowVisibleDisplayFrame(rect);
int statusBarHeight = rect.top;
int screenHeight = activity.getWindowManager().getDefaultDisplay().getHeight();
int diffHeight = (screenHeight - statusBarHeight) - h;
if (diffHeight > 100 && !mShownKeyboard) { // 모든 키보드는 100px보다 크다고 가정
mShownKeyboard = true;
onShownSoftKeyboard();
} else if (diffHeight < 100 && mShownKeyboard) {
mShownKeyboard = false;
onHiddenSoftKeyboard();
}
super.onSizeChanged(w, h, oldw, oldh);
}
public void onHiddenSoftKeyboard() {
if (onHiddenSoftKeyboard != null)
onHiddenSoftKeyboard.onHiddenSoftKeyboard();
}
public void onShownSoftKeyboard() {
if (mOnShownSoftKeyboard != null)
mOnShownSoftKeyboard.onShowSoftKeyboard();
}
public void setOnShownKeyboard(OnShownKeyboardListener listener) {
mOnShownSoftKeyboard = listener;
}
public void setOnHiddenKeyboard(OnHiddenKeyboardListener listener) {
onHiddenSoftKeyboard = listener;
}
public interface OnShownKeyboardListener {
public void onShowSoftKeyboard();
}
public interface OnHiddenKeyboardListener {
public void onHiddenSoftKeyboard();
}
}
사용 예) 사용하는 activity의 onCreate같은 곳에 다음과 같이 사용
final SoftKeyboardDectectorView softKeyboardDecector = new SoftKeyboardDectectorView(this);
addContentView(softKeyboardDecector, new FrameLayout.LayoutParams(-1, -1));
softKeyboardDecector.setOnShownKeyboard(new OnShownKeyboardListener() {
@Override
public void onShowSoftKeyboard() {
//키보드 등장할 때
}
});
softKeyboardDecector.setOnHiddenKeyboard(new OnHiddenKeyboardListener() {
@Override
public void onHiddenSoftKeyboard() {
// 키보드 사라질 때
}
});


