Android

[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)

 

 

Leave a Reply

error: Content is protected !!