[EditText] 소프트키보드가 뷰(Activity)를 밀어 올리는 것을 방지 하는 방법
EditText 위젯 사용시 입력을 위해 EditText를 클릭하면 소프트키보드가 밑에서 올라옵니다. 이때 액티비티 뷰 역시 함께 멀어올려서 뷰가 압축되는 현상이 발생합니다.
<EditText
android:id="@+id/create_edit_text"
android:layout_width="match_parent"
android:layout_height="100dp"
android:inputType="text"
android:layout_marginLeft="15dp"
android:layout_marginRight="15dp"
android:textColorHint="@color/blue_grey_4"
android:hint=""
android:lines="5"
android:textColor="@color/color_black"
android:maxLength="20"/>
액티비티 뷰 위로 키보드 올라오게 하는 방법
AndroidManifest.xml 파일에서 activity 태그에 android:windowSoftInputMode 값으로 adjustPan를 적용합니다.
<activity android:windowSoftInputMode="adjustPan">
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.test">
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<application
android:name=".QRCodeReaderApplication"
android:allowBackup="false"
android:fullBackupContent="false"
android:hardwareAccelerated="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity
android:name=".MainActivity"
android:configChanges="keyboard|keyboardHidden|orientation|screenSize"
android:screenOrientation="portrait"
android:windowSoftInputMode="adjustPan"
android:theme="@style/AppTheme.NoActionBar">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
프로그래밍방식으로 처리하는 방법
액티비티 생명주기 중에 onCreate()에서 setSoftInputMode()메소드를 사용하여 LayoutParams.SOFT_INPUT_ADJUST_PAN 를 설정합니다. onResume() 안에서 설정해도 됩니다.
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//키보드가 뷰를 밀어올리는 것을 방지
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
}
}
android:windowSoftInputMode 값 리스트
속성 값 | 설명 |
“stateUnspecified” | 소프트웨어 키보드의 상태(숨김 또는 표시)를 지정하지 않습니다. 시스템이 적당한 상태를 선택하거나 테마 설정에 의존합니다.
이는 소프트 키보드의 동작에 대한 기본 설정입니다. |
“stateUnchanged” | 액티비티가 앞으로 나올 때 소프트 키보드가 마지막으로 사용된 상태(숨김 또는 표시)를 유지합니다. |
“stateHidden” | 사용자가 다른 액티비티를 떠나고 해당 액티비티로 이동하는 방식으로 해당 액티비티를 선택하면 소프트 키보드가 숨겨집니다. |
“stateAlwaysHidden” | 액티비티의 기본 창에 입력 포커스가 있는 경우 소프트 키보드가 항상 숨겨집니다. |
“stateVisible” | 일반적으로 해당할 경우(사용자가 액티비티의 기본 창으로 이동하는 경우) 소프트 키보드가 표시됩니다. |
“stateAlwaysVisible” | 사용자가 다른 액티비티를 떠나고 해당 액티비티로 이동하는 방식으로 해당 액티비티를 선택하면 소프트 키보드가 표시됩니다. |
“adjustUnspecified” | 소프트 키보드를 위한 공간을 확보하도록 액티비티의 기본 창 크기를 조정하거나, 현재 포커스가 화면에 표시되도록 해당 창의 콘텐츠를 이동할지 여부를 지정하지 않습니다. 해당 창의 콘텐츠가 콘텐츠를 스크롤할 수 있는 레이아웃 뷰를 가지고 있는지 여부에 따라 시스템이 해당 모드 중 하나를 자동으로 선택합니다. 그러한 뷰가 있는 경우, 스크롤이 모든 창의 콘텐츠를 더 작은 공간에 표시할 수 있다는 가정하에 해당 창의 크기가 조정됩니다.
이는 기본 창의 동작에 대한 기본 설정입니다. |
“adjustResize” | 화상 소프트 키보드를 위한 공간을 확보하도록 액티비티의 기본 창 크기를 항상 조정합니다. |
“adjustPan” | 소프트 키보드를 위한 공간을 확보하기 위해 액티비티의 기본 창 크기를 조정하는 작업을 수행하지 않습니다. 그 대신에 키보드가 현재 포커스를 가리지 않고 사용자가 입력하는 것을 항상 볼 수 있도록 해당 창의 콘텐츠가 자동으로 이동합니다. 이는 일반적으로 창의 크기를 조정하는 것보다 바람직하지 않습니다. 사용자가 소프트 키보드를 닫고 창의 가려진 부분에 가서 상호작용해야 할 수도 있기 때문입니다. |
REFERENCE : 개발자 문서(developer.android.com/guide/topics/manifest/activity-element.html#wsoft)