마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

소프트 키보드가 나타날 시 UI 변화 문제

0 추천

안녕하십니까.

 

앱 화면에서 EditText를 선택하면 소프트 키보드가 나타나는데,

키보드가 나타나면 퍼센트로 설정해 둔 view들의 크기(높이)가 조금씩 변경됩니다.

UI가 변경되지 않게 하기 위하여 manifest에서 아래 옵션을 설정했더니

android:windowSoftInputMode="adjustPan"

스크롤이 작동하지 않는 문제가 발생 합니다.

 

즉 제가 구현하고 싶은 모습은,

소프트 키보드가 나타나도 UI의 크기에는 변화가 없고 스크롤을 사용할 수 있어야 합니다.

방법이 없을까요?

여기 안드로이드펍이나 stackoverflow를 아무리 뒤져봐도 방법을 찾을 수 없어서 질문을 남기게 되었습니다.

 

아래는 해당 UI의 xml 코드 일부 입니다.

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/sv_login"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fillViewport="true">

<LinearLayout
    android:id="@+id/ly_login"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_marginTop="10dp">

    <LinearLayout
        android:id="@+id/ly_login_nbread"
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight=".51">
         .....
    <LinearLayout
        android:id="@+id/ly_login_id_password"
        android:orientation="vertical"
        android:background="#F6A623"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight=".45">
        ....
 

 

 

jaykim (160 포인트) 님이 2017년 2월 1일 질문

2개의 답변

+1 추천
android:windowSoftInputMode="adjustResize"

혹시 위처럼은 해보셨나용?

Development Guy (70,570 포인트) 님이 2017년 2월 1일 답변
답변 감사 드립니다. 그런데 adjustResize로 하면 softkeyboard가 나타났다 사라졌다 할 때마다 퍼센트로 된 view들의 크기가 변동되는 문제가 있어서 adjunstPan으로 한 것입니다.
+1 추천

질문자님이 요구하는대로 하시려면 스크롤뷰 내부 레이아웃이 고정크기여야합니다.

제대로 동작할지는 모르겠으나 샘플 코드 올려봅니다.

scrollView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
			@Override
			public void onGlobalLayout() {
				int w = scrollView.getLayoutParams().width;
				int h = scrollView.getLayoutParams().height;
				
				//스크롤뷰 내부 레이아웃 크기 고정 시키기
				LinearLayout linearLayout;		//<-- 내부 레이아웃이라고 치고
				LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(w, h);
				linearLayout.setLayoutParams(layoutParams);
			}
		});

이렇게 비슷하게 한번 시도해보세요.

 

만약 setLayoutParam 정상동작 안하면 핸들러에서 돌려보세요.

Development Guy (70,570 포인트) 님이 2017년 2월 1일 답변
답변 감사합니다. 참고해서 테스트 해 보겠습니다.
...