Android_Programma
Android softkeyboard 에 따른 event 발생 시키기
k1rha
2012. 3. 21. 02:55
소프트키보드 상태에 따라 이벤트 발생시키기 Android 2011/11/18 13:55 Posted by 기분째즈 당황스럽게도 안드로이드에는 키보드가 떴는지 안떴는지를 알 수 있는 API도 없고, 이벤트도 없습니다. 우회해서 알아내야하는데요. 터치이벤트 자체를 낚아채서 강제로 이벤트를 주면서 키보드 상태를 알아내는 법. 화면사이즈 변경된 걸로 알아내는 법. 몇몇 방법이 있지만 재사용하기 편한 건 키보드가 뜨면서 화면크기가 변경된 걸 알아내는 뷰 하나 만들어서 화면에 붙이는 게 편하더군요. 주의점은 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() { // 키보드 사라질 때 } });<br>