관리 메뉴

한솔닷컴

안드로이드 풀스크린에서 키보드 겹침 문제 해결 본문

it/programming

안드로이드 풀스크린에서 키보드 겹침 문제 해결

훈솔 2015.11.05 17:48

안드로이드 풀스크린에서 키보드 겹침 문제 해결, 안드로이드 풀스크린에서 소프트키보드 밀어내기


안드로이드 애플리케이션 개발 중 EditText 영역을 클릭했을때 키보드가 올라와 텍스트 입력영역을 가리는 이슈가 있었다.

입력 자체기능에는 문제가 없지만 보면서 입력을 못하는 사태가 발생해 수정 해야 하는 상황인데,


검색중에 찾아낸것은 windowSoftInputMode 옵션에 adjustResize 혹은 adjustPan 을 주라는것.

그래서 AndroidManifest.xml 파일에 android:windowSoftInputMode="adjustResize" 를 주고 시도 해보았으나 실패.

android:windowSoftInputMode="adjustPan" 마저 실패 해버리고 그 이유에 대해 검색 하다 나온 결론은 fullscreenmode dosen't resize.


이게 뭔소린가 싶기도하고 멘탈도 바스러져 가는 찰나 언제나 나에게 큰 도움을 주는 자칭 '갓'택오버플로우 stackoverflow에서 해답이 나왔다.


http://stackoverflow.com/questions/7417123/android-how-to-adjust-layout-in-full-screen-mode-when-softkeyboard-is-visible/19494006#19494006


먼저 이 클래스를 복사하거나 코딩하여 자신의 패키지 안에 위치시킨다.

public class AndroidBug5497Workaround {

    // For more information, see https://code.google.com/p/android/issues/detail?id=5497
    // To use this class, simply invoke assistActivity() on an Activity that already has its content view set.

    public static void assistActivity (Activity activity) {
        new AndroidBug5497Workaround(activity);
    }

    private View mChildOfContent;
    private int usableHeightPrevious;
    private FrameLayout.LayoutParams frameLayoutParams;

    private AndroidBug5497Workaround(Activity activity) {
        FrameLayout content = (FrameLayout) activity.findViewById(android.R.id.content);
        mChildOfContent = content.getChildAt(0);
        mChildOfContent.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            public void onGlobalLayout() {
                possiblyResizeChildOfContent();
            }
        });
        frameLayoutParams = (FrameLayout.LayoutParams) mChildOfContent.getLayoutParams();
    }

    private void possiblyResizeChildOfContent() {
        int usableHeightNow = computeUsableHeight();
        if (usableHeightNow != usableHeightPrevious) {
            int usableHeightSansKeyboard = mChildOfContent.getRootView().getHeight();
            int heightDifference = usableHeightSansKeyboard - usableHeightNow;
            if (heightDifference > (usableHeightSansKeyboard/4)) {
                // keyboard probably just became visible
                frameLayoutParams.height = usableHeightSansKeyboard - heightDifference;
            } else {
                // keyboard probably just became hidden
                frameLayoutParams.height = usableHeightSansKeyboard;
            }
            mChildOfContent.requestLayout();
            usableHeightPrevious = usableHeightNow;
        }
    }

    private int computeUsableHeight() {
        Rect r = new Rect();
        mChildOfContent.getWindowVisibleDisplayFrame(r);
        return (r.bottom - r.top);
    }

}

사용법은 간단하다.

onCreate 이후에 아래 메소드를 호출해주면 된다.

    AndroidBug5497Workaround.assistActivity(this);


원리는 간단하다. 키보드를 찾아서 크기를 구하고 그 크기만큼 뷰 크기를 확보하는것.

아주 간단하지만 귀찮은것을 이사람이 해주었다!


너무 고마워서 백업 겸 남겨둔다.

역시 스택오버플로우

0 Comments
댓글쓰기 폼