소프트 키보드가 표시 될 때 레이아웃을 위로 이동 하시겠습니까?


139

소프트 키보드가 나타날 때 요소가 소프트 키보드에 의해 숨겨지면 하단 정렬 속성이 설정된 RelativeView에 몇 가지 요소가 있습니다.

화면 공간이 충분하면 키보드 위에 표시되거나 키보드 위의 섹션을 스크롤 가능하게하여 사용자가 여전히 요소를 볼 수 있도록 위로 이동하고 싶습니다.

이것에 접근하는 방법에 대한 아이디어가 있습니까?



@Dinedal U RelativeView에 하단 속성 정렬을 어떻게 설정합니까 ???
KJEjava48

답변:



95

이 코드를 onCreate()메소드 에서 사용할 수도 있습니다 .

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);

11
adjustPan screnn을 설정 한 경우에도 클릭 한 편집 텍스트까지만 이동하지만 전체 레이아웃은 이동하지 않습니다.
murt


22

다음과 같이 매니페스트 파일의 활동을 변경하십시오.

windowSoftInputMode="adjustResize"

또는

다음 onCreate()과 같이 활동 클래스에서 메소드를 변경하십시오.

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);

11
왜 다른 깃발을 사용합니까?
CoolMind

windowSoftInputMode = "adjustResize"안드로이드 : 현재 버전은 안드로이드 접두사 필요
안드레아 Leganza

21

비슷한 문제 내부 스크롤보기를 구성하는 레이아웃에 직면했습니다. EditText에서 텍스트를 선택하려고 할 때마다 복사 / 잘라 내기 / 붙여 넣기 작업 표시 줄이 아래 코드와 함께 위로 이동하여 레이아웃 크기가 조정되지 않습니다.

android:windowSoftInputMode="adjustPan"

아래와 같이 수정하여

1) AndroidManifest.xml

android:windowSoftInputMode="stateVisible|adjustResize"

2) 활동 스타일의 style.xml 파일

<item name="android:windowActionBarOverlay">true</item>

효과가있었습니다. !!!!!!!!!!!!


18

AndroidManifest.xml에서 다음을 설정하는 것을 잊지 마십시오.

 android:windowSoftInputMode="adjustResize"

그리고 ScrollView 내부의 RelativeLayout의 경우 다음을 설정하십시오.

 android:layout_gravity="center" or android:layout_gravity="bottom" 

괜찮을거야


android : layout_gravity = "center"가 작동했습니다. 감사합니다! :) 내가 원하는대로 키보드를 통해 지금 글고 이동
파벨 Biryukov

11

oncreate 메소드의 활동에 대해 아래 행 삽입

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);

onCreate 메소드의 조각

getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);

10

화면을 위로 스크롤하려면 3 단계를 수행하십시오.

  1. 활동에 대한 매니페스트 파일을 작성하십시오.

android : windowSoftInputMode = "adjustResize"

  1. 활동의 oncreate () 메소드에 다음 행을 추가하십시오.

getWindow (). setSoftInputMode (WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);

  1. 그런 다음 XML 파일의 "Scrollview"에 전체 뷰를 배치하십시오.
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:background="@drawable/bg"
    android:layout_height="match_parent" 
    > 
    <RelativeLayout
         android:layout_width="fill_parent"
        android:layout_height="match_parent"
        android:layout_gravity="center" >
        <TextView />
         .........
        <TextView />
        <EditText >
            <requestFocus />
        </EditText>
        <Button />
    </RelativeLayout>
 </ScrollView>

추신 부모 친척 레이아웃에 android : layout_gravity = "center"를 추가하는 것을 잊지 마십시오.


6

Diego Ramírez의 방법을 시도했지만 작동합니다. AndroidManifest에서 :

    <activity
        android:name=".MainActivity"
        android:windowSoftInputMode="stateHidden|adjustResize">
        ...
    </activity>

activity_main.xml에서 :

<LinearLayout ...
    android:orientation="vertical">

<Space
    android:layout_width="wrap_content"
    android:layout_height="0dp"
    android:layout_weight="1" />

<EditText
    android:id="@+id/edName"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:ems="10"
    android:hint="@string/first_name"
    android:inputType="textPersonName" />

<EditText ...>
...
</LinearLayout>

6
<activity name="ActivityName"
    android:windowSoftInputMode="adjustResize">
    ...
</activity>

스크롤하려는 레이아웃 주위에 NestedScrollView를 추가하면 완벽하게 작동합니다.


3

내 문제에 대한 해결책이 당신과 똑같다는 것을 발견했습니다.

우선, 2 개의 요소가있는 LinearLayout 만 있고 ImageView 및 LinearLayout에는 2 개의 EditText와 하나의 버튼이 포함되어 있으므로 키보드없이 전체 화면으로 분리해야하며 키보드가 나타나면 더 가깝게 보입니다.

그래서 0dp와 weight 1의 height 속성을 사용하여 뷰를 추가하여 뷰를 서로 다른 형식으로 분리 할 수있게했습니다. 키보드 높이가 고정 높이가 아니기 때문에 키보드 크기가 조정되면 가로 세로 크기 만 조정되고 유지됩니다.

짜잔! 키보드의 존재 여부에 따라 레이아웃 크기와 뷰 사이의 거리가 동일합니다.


6
이해를 돕기 위해 코드를 게시하지 않는 이유는 무엇입니까?
johnkarka

위의 샘플 코드를 게시했습니다 : stackoverflow.com/a/31994697/2914140 .
CoolMind

ConstraintLayout상단 섹션을 사용하고 하단 섹션을 하단에 고정 하여 덜 해킹 된 방식으로이를 달성 할 수 있습니다 . 키보드가 열리면 중간에 공간을 adjustResize
잡아 당겨

2
If user want this task using manifest then add this line in manifest
In manifest add this line: - android:windowSoftInputMode="adjustPan"
    e.g.
     <activity
           android:name=".ui.home.HomeActivity"
           android:screenOrientation="portrait"
           android:windowSoftInputMode="adjustPan">
     </activity>


    In Java File or Kotlin File(Programically) : - If user want this using Activity then add below line in onCreate Method

    activity!!.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);

안녕하세요, stackoverflow에 오신 것을 환영합니다. 귀하의 답변에 감사드립니다. 코드 블록을 게시하는 대신 어떤 문제를 해결하고 어떻게 해결했는지 간단히 설명 할 수 있습니까? 이렇게하면 앞으로이 질문을 찾는 사람들이 문제와 그 해결 방법을 더 잘 이해할 수 있습니다.
Plutian

1

다음은 전체 매니페스트 코드입니다.

<activity
        android:name=".activities.MainActivity"
        android:windowSoftInputMode="adjustResize"
        android:label="@string/app_name">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

1

조각에 있다면 활동의 onCreate에 아래 코드를 추가해야 문제가 해결됩니다.

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);

1

매니페스트 파일에서 아래 줄을 추가하십시오. 작동합니다

<activity name="MainActivity"
    android:windowSoftInputMode="stateVisible|adjustResize">
    ...
</activity>

1

방금 최상위 레이아웃에 다음 줄을 추가하고 모든 것이 작동했습니다.

android:fitsSystemWindows="true"

@ yash786은 포커스를받는 편집 텍스트 아래에 단추를 표시 할 수 있습니까? 두 번째 질문은 레이아웃 파일을 공유하거나 keybord의 상단에 edittext를 추가하는 방법에 대해 대답 할 수 있습니까?
Heroes84

그것은 안드로이드없이 나를 위해 작동합니다 : windowSoftInputMode = "stateVisible | adjustResize"
zoom

0

자, 이것은 매우 늦었지만 편집 텍스트 아래에 목록보기를 추가하면 키보드가 ListView를 이동하지 않고 해당 편집 텍스트 아래의 모든 레이아웃을 이동합니다.

<EditText
android:id="@+id/et"
android:layout_height="match_parent"
android:layout_width="match_parent"



/>

<ListView
    android:layout_width="match_parent"
    android:layout_height="match_parent"//can make as 1dp
    android:layout_below="@+id/et" // set to below editext
    android:id="@+id/view"
    >
**<any layout**

이것은 나를 위해 일한 유일한 솔루션입니다.


0

하나의 조언이 내 문제를 해결하지 못합니다. 팬 조정 은 거의 작업 조정 크기 와 같습니다 . 내가 레이아웃보다 아무것도 조정하지 않으면 위로 이동하지 않지만 내가 편집중인 하단의 편집 텍스트를 숨 깁니다. 따라서 24 시간 연속 검색 후이 소스를 발견 하고 문제를 해결했습니다.


0

늦었을 수도 있지만 몇 가지를 추가하고 싶습니다. Android Studio 버전 4.0.1 및 Gradle 버전 6.1.1 windowSoftInputMode 에서 활동에 다음 플래그를 추가하면 예상대로 작동하지 않습니다.

getWindow().setFlags(
                WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS,
                WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS
        );

많은 시간을 낭비한 후, 나는 그 핵을 발견했다. 위해서는 adjustResize하거나 AdjustPan또는의 특성을 windowSoftInputMode제대로 할 일이, 당신은 당신의 활동에서 그것을 제거해야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.