소프트 키보드가 나타날 때 레이아웃을 조정하는 방법


164

소프트 키보드가 활성화되면 아래와 같이 레이아웃을 조정 / 크기 조정하고 싶습니다.

이전과 이후:

여기에 이미지 설명을 입력하십시오여기에 이미지 설명을 입력하십시오


SO에서 몇 가지 리소스를 찾았습니다.

  1. 소프트 키보드가 표시된 상태에서 모든 필드와 텍스트를 표시하는 방법
  2. 안드로이드 소프트 키보드가 나타나면 레이아웃이 망칩니다.
  3. 소프트 키보드가 켜져있을 때 레이아웃 조정

그러나 질문과 답변은 다소 모호합니다. 여기에 내가 원하는 것의 명확한 그림이있는 질문이 있습니다.

요구 사항 :

  • 모든 화면 크기의 전화기에서 작동해야합니다.
  • "FACEBOOK"및 "Facebook 가입"의 여백 / 패딩 공간이 전후로 변경되었습니다.
  • 스크롤보기가 없습니다.

3
또한 크기 조정 전체 화면 (에 일을하지 않는 것을 가치가 기억하는 것입니다 Theme.AppCompat.Light.NoActionBar.FullScreen> -이 답변에 따라), stackoverflow.com/a/7509285/1307690
로마 Nazarevych

답변:


202

그냥 추가

android:windowSoftInputMode="adjustResize"

이 특정 활동을 선언하는 AndroidManifest.xml에서 레이아웃 크기 조정 옵션이 조정됩니다.

여기에 이미지 설명을 입력하십시오

레이아웃 디자인을위한 아래 소스 코드

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="20dp"
        android:text="FaceBook"
        android:textAppearance="?android:attr/textAppearanceLarge" />

    <EditText
        android:id="@+id/editText1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/textView1"
        android:layout_marginTop="30dp"
        android:ems="10"
        android:hint="username" >

        <requestFocus />
    </EditText>

    <EditText
        android:id="@+id/editText2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/editText1"
        android:layout_marginTop="20dp"
        android:ems="10"
        android:hint="password" />

    <Button
        android:id="@+id/button1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/editText2"
        android:layout_centerHorizontal="true"
        android:layout_marginLeft="18dp"
        android:layout_marginTop="20dp"
        android:text="Log In" />

    <TextView
        android:id="@+id/textView2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_marginTop="17dp"
        android:gravity="center"
        android:text="Sign up for facebook"
        android:textAppearance="?android:attr/textAppearanceLarge" />

</RelativeLayout>

2
+1 간단합니까? 추가 조건이 있습니까? 게시 한 이미지는 무엇입니까?
Roy Lee

2
친구는 내가 그 이미지 친구 배치 화면이 제대로 조정 ..hence하지 않을 경우 alignparentbottom = "true"를 표시합니다
Venkatesh S

정말 좋은 답변입니다. 도와 줘서 고마워 친구 와서 다행입니다.
Roy Lee

9
친구 : 소프트 키보드가 활성화되면 "페이스 북에 등록"이있는 TextView 만 자체적으로 조정 된 것으로 보입니다. 다른 사람들도 적응하기를 바랍니다. 해결 방법이 있습니까? 키보드가 활성화되기 전에 전체 레이아웃이 중앙에 있어야합니다.
Roy Lee

1
adjustResize를 수행 할 때 추가 패딩을 제공하는 방법이 있습니까? 현재 텍스트 커서의 하단이 화면의 하단과 정확하게 정렬되도록 크기가 조정됩니다. 텍스트 커서 아래에 5dp 간격을 추가하고 싶습니다.
Noitidart

39

이 질문은 몇 년 전에 제기되어 왔으며 "Secret Andro Geni"는 좋은 기본 설명을 가지고 있으며 "tir38"도 완벽한 솔루션에 대한 좋은 시도를했지만 여기에는 완전한 솔루션이 없습니다. 나는 물건을 알아내는 데 몇 시간을 보냈으며 아래에 자세한 설명이있는 완벽한 솔루션이 있습니다.

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

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="10dp">

        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_above="@+id/mainLayout"
            android:layout_alignParentTop="true"
            android:id="@+id/headerLayout">

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_centerVertical="true"
                android:gravity="center_horizontal">

                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:id="@+id/textView1"
                    android:text="facebook"
                    android:textStyle="bold"
                    android:ellipsize="marquee"
                    android:singleLine="true"
                    android:textAppearance="?android:attr/textAppearanceLarge" />

            </LinearLayout>

        </RelativeLayout>

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_centerVertical="true"
            android:id="@+id/mainLayout"
            android:orientation="vertical">

            <EditText
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:id="@+id/editText1"
                android:ems="10"
                android:hint="Email or Phone"
                android:inputType="textVisiblePassword">

                <requestFocus />
            </EditText>

            <EditText
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="10dp"
                android:id="@+id/editText2"
                android:ems="10"
                android:hint="Password"
                android:inputType="textPassword" />

            <Button
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="10dp"
                android:id="@+id/button1"
                android:text="Log In"
                android:onClick="login" />

        </LinearLayout>

        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:layout_below="@+id/mainLayout"
            android:id="@+id/footerLayout">

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_alignParentBottom="true">

                <RelativeLayout
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content">

                    <TextView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:id="@+id/textView2"
                        android:text="Sign Up for Facebook"
                        android:layout_centerHorizontal="true"
                        android:layout_alignBottom="@+id/helpButton"
                        android:ellipsize="marquee"
                        android:singleLine="true"
                        android:textAppearance="?android:attr/textAppearanceSmall" />

                    <Button
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_alignParentRight="true"
                        android:id="@+id/helpButton"
                        android:text="\?"
                        android:onClick="help" />

                </RelativeLayout>

            </LinearLayout>

        </RelativeLayout>

    </RelativeLayout>

</ScrollView>

그리고 AndroidManifest.xml 에서 설정하는 것을 잊지 마십시오.

android:windowSoftInputMode="adjustResize"

<activity>태그는 같은 레이아웃을 원하는.

생각 :

그 실현 한 RelativeLayout키보드가 팝업 때 사용 가능한 모든 공간을 통해 기간과 그 후 크기가 조정되는 레이아웃입니다.

그리고 LinearLayout크기 조정 과정에서 크기가 조정되지 않는 레이아웃입니다.

그렇기 때문에 사용 가능한 모든 화면 공간을 통해 RelativeLayout즉시 1을 확보해야 ScrollView합니다. 그리고 당신은 가질 필요가 LinearLayout, 안쪽 RelativeLayout크기 조정이 발생하면 다른 사용자의 내부 짓 눌린 얻을 것입니다. 좋은 예는 "headerLayout"입니다. LinearLayout내부에 없으면 RelativeLayout"페이스 북"텍스트가 찌그러져 표시되지 않습니다.

질문에 게시 된 "페이스 북"로그인 그림에서 전체 로그인 부분 (mainLayout)이 전체 화면과 관련하여 세로 중앙에 있으므로 속성이 다음과 같습니다.

android:layout_centerVertical="true"

상의 LinearLayout레이아웃. 그리고 mainLayout이 내부에 있기 때문에 LinearLayout해당 부분이 크기가 조정 되지 않음을 의미합니다 (문제의 그림 참조).


1
매력처럼 작동합니다! 바닥 글은 레이아웃의 맨 아래에 붙어있어 멋지지 않습니다. 바닥 글이 바닥에 닿지 않게하려면 어떻게해야합니까? 대신 바닥 글에 약간의 여백을 주면 레이아웃이 좋아 보입니다. 바닥 글의 상대적 레이아웃에 layout_margin 속성을 제공하여 약간의 변경을가했지만 이것으로 편집 텍스트의 마지막 절반을 덮고 있습니다. Plz 도와주세요.
Tara

에서 RelativeLayout의@ + ID / footerLayout 당신이 가지고 있는 LinearLayout 이 속성이 있습니다 android:layout_alignParentBottom="true". 이것은 바닥에 붙어 있습니다.
Yani2000

나중에, 염두에두고 내가 하단 여백 최소 10dp 또는 15dp해야 바닥 글의 구성 요소를 배치하는 방법을 묻는 것을
타라

당신이 무슨 말을하는지 모르겠습니다. 나는 footerLayouttextView2helpButton을 보유 하고있는 RelativeLayout 을 제공 android:layout_marginBottom="15dp"하여 이것을 직접 테스트했습니다 . 두 경우 모두 helpButton 이 찌그러집니다 (marginBottom 속성이 없어도). editText1 또는 editText2LinearLayout 안에 있기 때문에 결코 뭉개 지지 않습니다 . footerLayout 뿐만 아니라 다른 레이아웃에서도 여백을 설정 했습니까 ? 아무데도 없다면 처음부터 다시 시도하십시오! AndroidManifest에서 속성을 사용하여 재생할 수도 있습니다 . android:windowSoftInputMode
Yani2000

1
"그리고 LinearLayout은 크기 조정 프로세스에서 크기가 조정되지 않는 레이아웃입니다." -이것은 정말 유용한 정보입니다.
cylon

26

활동이 호출되는 매니페스트에이 줄을 추가하십시오.

android:windowSoftInputMode="adjustPan|adjustResize"

또는

이 줄을 onCreate

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

7
둘 다 사용해서는 안 adjustPanadjustResize. 이들은 다른 모드입니다. 여기에 대해 자세히 읽어보십시오 : stackoverflow.com/a/17410528/1738090 그리고 여기 : developer.android.com/guide/topics/manifest/activity-element
w3bshark

14

Android Developer는 정답을 제공하지만 제공된 소스 코드는 매우 장황하며 실제로 다이어그램에 설명 된 패턴을 구현하지 않습니다.

더 나은 템플릿은 다음과 같습니다.

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

    <RelativeLayout android:layout_width="match_parent"
                    android:layout_height="match_parent">

        <LinearLayout android:layout_width="match_parent"
                      android:layout_height="wrap_content"
                      android:orientation="vertical">

                <!-- stuff to scroll -->

        </LinearLayout>

        <FrameLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true">

            <!-- footer -->

        </FrameLayout>

    </RelativeLayout>

</ScrollView>

"스크롤링"및 "바닥 글"부품에 사용할 뷰를 결정하는 것은 사용자의 몫입니다. 또한 아마 설정해야 할 것을 알고 ScrollView이야 fillViewPort을 .


솔루션을 따라 시도했지만 LinearLayout프레임 및 상대 대신 두 개의을 사용 했지만 모든보기가 여전히 서로 위에 있습니다.
Henrique de Sousa

13

모든 종류의 레이아웃에 사용할 수 있습니다.

  1. 이것을 AndroidManifest.xml 의 활동 태그에 추가하십시오.

android : windowSoftInputMode = "adjustResize"

예를 들면 다음과 같습니다.

<activity android:name=".ActivityLogin"
    android:screenOrientation="portrait"
    android:theme="@style/AppThemeTransparent"
    android:windowSoftInputMode="adjustResize"/>
  1. activitypage.xml 의 레이아웃 태그에 위치를 변경하는 추가하십시오 .

android : fitsSystemWindows = "true"

android : layout_alignParentBottom = "true"

예를 들면 다음과 같습니다.

<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:fitsSystemWindows="true">

이 답변은 레이아웃 작업 방법에 대한 더 나은 정보를 제공합니다.
Tim

9

이를 통해 키보드에 의해 이전에 숨겨져있는 원하는 레이아웃을 표시 할 수 있습니다.

이것을 AndroidManifest.xml의 활동 태그에 추가하십시오.

android : windowSoftInputMode = "adjustResize"


루트보기를 ScrollView로 둘러싸십시오. 스크롤 바는 none입니다. ScrollView는이 문제를 해결하는 데 사용되는 것을 제외하고 레이아웃의 내용을 올바르게 변경하지 않습니다.

그런 다음 키보드 위에 완전히 표시하려는보기에서 fitsSystemWindows = "true"를 설정하십시오. 그러면 키보드 위에 EditText가 표시되고 EditText 아래의 부분으로 스크롤되지만 fitsSystemWindows = "true"인 뷰에서 아래로 스크롤 할 수 있습니다.

android : fitsSystemWindows = "true"

예를 들면 다음과 같습니다.

<ScrollView
    android:id="@+id/scrollView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:scrollbars="none">

    <android.support.constraint.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:fitsSystemWindows="true">

        ...

    </android.support.constraint.ConstraintLayout>
</ScrollView>   

키보드가 나타나는 순간에 키보드 위에 fitsSystemWindows = "true"보기의 전체 부분을 표시하려면보기를 맨 아래로 스크롤하는 코드가 필요합니다.

// Code is in Kotlin

setupKeyboardListener(scrollView) // call in OnCreate or similar


private fun setupKeyboardListener(view: View) {
    view.viewTreeObserver.addOnGlobalLayoutListener {
        val r = Rect()
        view.getWindowVisibleDisplayFrame(r)
        if (Math.abs(view.rootView.height - (r.bottom - r.top)) > 100) { // if more than 100 pixels, its probably a keyboard...
            onKeyboardShow()
        }
    }
}

private fun onKeyboardShow() {
    scrollView.scrollToBottomWithoutFocusChange()
}

fun ScrollView.scrollToBottomWithoutFocusChange() { // Kotlin extension to scrollView
    val lastChild = getChildAt(childCount - 1)
    val bottom = lastChild.bottom + paddingBottom
    val delta = bottom - (scrollY + height)
    smoothScrollBy(0, delta)
}

전체 레이아웃 예 :

<android.support.constraint.ConstraintLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:fitsSystemWindows="true">

    <RelativeLayout
        android:id="@+id/statisticsLayout"
        android:layout_width="match_parent"
        android:layout_height="340dp"
        android:background="@drawable/some"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent">

        <ImageView
            android:id="@+id/logoImageView"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="64dp"
            android:src="@drawable/some"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

    </RelativeLayout>

    <RelativeLayout
        android:id="@+id/authenticationLayout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginEnd="32dp"
        android:layout_marginStart="32dp"
        android:layout_marginTop="20dp"
        android:focusableInTouchMode="true"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@id/statisticsLayout">

        <android.support.design.widget.TextInputLayout
            android:id="@+id/usernameEditTextInputLayout"
            android:layout_width="match_parent"
            android:layout_height="68dp">

            <EditText
                android:id="@+id/usernameEditText"
                android:layout_width="match_parent"
                android:layout_height="wrap_content" />

        </android.support.design.widget.TextInputLayout>

        <android.support.design.widget.TextInputLayout
            android:id="@+id/passwordEditTextInputLayout"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_below="@id/usernameEditTextInputLayout">

            <EditText
                android:id="@+id/passwordEditText"
                android:layout_width="match_parent"
                android:layout_height="wrap_content" />

        </android.support.design.widget.TextInputLayout>

        <Button
            android:id="@+id/loginButton"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@id/passwordEditTextInputLayout"
            android:layout_centerHorizontal="true"
            android:layout_marginBottom="10dp"
            android:layout_marginTop="20dp" />

        <Button
            android:id="@+id/forgotPasswordButton"
            android:layout_width="wrap_content"
            android:layout_height="40dp"
            android:layout_below="@id/loginButton"
            android:layout_centerHorizontal="true" />

    </RelativeLayout>

</android.support.constraint.ConstraintLayout>


사용 android:fitsSystemWindows="true"... 나에게 감사 내가 원하는 원하는 결과를 준 무엇인가
CrandellWS

8

사용하는 사람들을 위해 ConstraintLayout을 , android:windowSoftInputMode="adjustPan|adjustResize"작동하지 않습니다.

소프트 키보드 리스너를 사용하고 , 상단 뷰의 하단 에서 하단으로 뷰의 제약 조건 을 설정 한 다음, 각 뷰의 수직 바이어스를 (제약 점 사이의 위치 백분율로) 수평 가이드 라인 (백분율로 위치)으로 설정하십시오 , 그러나 부모에게).

각 뷰마다 키보드 프로그래밍 방식으로 표시 될 때로 변경 app:layout_constraintBottom_toBottomOf하면 @+id/guideline됩니다 .

        <ImageView
        android:id="@+id/loginLogo"
        ...
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.15" />


        <RelativeLayout
        android:id="@+id/loginFields"
        ...
        app:layout_constraintVertical_bias=".15"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/loginLogo">

        <Button
        android:id="@+id/login_btn"
        ...
        app:layout_constraintVertical_bias=".25"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/loginFields"/>

일반적으로 소프트 키보드는 화면 높이의 50 %를 넘지 않습니다. 따라서 지침을 0.5로 설정할 수 있습니다.

        <android.support.constraint.Guideline
        android:id="@+id/guideline"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        app:layout_constraintGuide_percent="0.5"/>

이제 프로그래밍 방식으로 키보드가 표시 되지 않으면 모든 app:layout_constraintBottom_toBottomOf백을 부모로 설정할 수 있습니다 .

            unregistrar = KeyboardVisibilityEvent.registerEventListener(this, isOpen -> {
            loginLayout.startAnimation(AnimationManager.getFade(200));
            if (isOpen) {
                setSoftKeyViewParams(loginLogo, R.id.guideline, ConstraintLayout.LayoutParams.PARENT_ID, -1, "235:64", 0.15f,
                        63, 0, 63, 0);
                setSoftKeyViewParams(loginFields, R.id.guideline, -1, R.id.loginLogo, null, 0.15f,
                        32, 0, 32, 0);
                setSoftKeyViewParams(loginBtn, R.id.guideline, -1, R.id.useFingerPrintIdText, null, 0.5f,
                        32, 0, 32, 0);
            } else {
                setSoftKeyViewParams(loginLogo, ConstraintLayout.LayoutParams.PARENT_ID, ConstraintLayout.LayoutParams.PARENT_ID, -1, "235:64", 0.15f,
                        63, 0, 63, 0);
                setSoftKeyViewParams(loginFields, ConstraintLayout.LayoutParams.PARENT_ID, -1, R.id.loginLogo,null, 0.15f,
                        32, 0, 32, 0);
                setSoftKeyViewParams(loginBtn, ConstraintLayout.LayoutParams.PARENT_ID, -1, R.id.useFingerPrintIdText,null, 0.25f,
                        32, 0, 32, 0);
            }
        });

이 메소드를 호출하십시오.

    private void setSoftKeyViewParams(View view, int bottomToBottom, int topToTop, int topToBottom, String ratio, float verticalBias,
                                  int left, int top, int right, int bottom) {
    ConstraintLayout.LayoutParams viewParams = new ConstraintLayout.LayoutParams(view.getLayoutParams().width, view.getLayoutParams().height);
    viewParams.dimensionRatio = ratio;
    viewParams.bottomToBottom = bottomToBottom;
    viewParams.topToTop = topToTop;
    viewParams.topToBottom = topToBottom;
    viewParams.endToEnd = ConstraintLayout.LayoutParams.PARENT_ID;
    viewParams.startToStart = ConstraintLayout.LayoutParams.PARENT_ID;
    viewParams.verticalBias = verticalBias;
    viewParams.setMargins(Dimensions.dpToPx(left), Dimensions.dpToPx(top), Dimensions.dpToPx(right), Dimensions.dpToPx(bottom));
    view.setLayoutParams(viewParams);
}

중요한 것은 키보드가 표시되고 표시되지 않을 때 올바르게 확장되는 방식으로 수직 바이어스를 설정하는 것입니다.


2
더 간단한 방법은 ConstraintLayout을 ScrollView 또는 NestedScrollView 안에 넣는 것입니다. 계산 작업이 너무 많이 끝납니다. 그러나 ScrollView가 다른 문제를 일으킨다면 대답은 훌륭합니다.
Devenom

5

많은 답변이 옳습니다. 에서 AndroidManifest내가 쓴 :

<activity
    android:name=".SomeActivity"
    android:configChanges="orientation|keyboardHidden|screenSize" // Optional, doesn't affect.
    android:theme="@style/AppTheme.NoActionBar"
    android:windowSoftInputMode="adjustResize" />

내 경우에는에 테마를 추가 styles.xml했지만 자신 의 테마를 사용할 수 있습니다.

<style name="AppTheme.NoActionBar" parent="AppTheme">
    <!--  Hide ActionBar -->
    <item name="windowNoTitle">true</item>
    <item name="windowActionBar">false</item>
</style>

전체 화면 테마를 사용하면 크기 조정이 발생하지 않습니다.

<style name="AppTheme.FullScreenTheme" parent="AppTheme">
    <!--  Hide ActionBar -->
    <item name="windowNoTitle">true</item>
    <item name="windowActionBar">false</item>
    <!--  Hide StatusBar -->
    <item name="android:windowFullscreen">true</item>
</style>

또한 내 경우에는 adjustResize작동하지만 작동 adjustPan하지 않습니다.

의 경우 전체 화면 레이아웃 의 해결 방법을 참조 softkeyboard가 표시 될 때 전체 화면 모드에서 레이아웃 조정 방법 안드로이드 나에 https://gist.github.com/grennis/2e3cd5f7a9238c59861015ce0a7c5584을 .

또한 https://medium.com/@sandeeptengale/problem-solved-3-android-full-screen-view-translucent-scrollview-adjustresize-keyboard-b0547c7ced32 는 작동하지만 상태 표시 줄은 투명하므로 배터리, 시계, Wi- Fi 아이콘이 표시됩니다.

파일> 새로 작성> 활동> 전체 화면 활동으로 활동을 작성하는 경우 코드에서 사용됩니다.

fullscreen_content.systemUiVisibility =
    View.SYSTEM_UI_FLAG_LOW_PROFILE or
    View.SYSTEM_UI_FLAG_FULLSCREEN or
    View.SYSTEM_UI_FLAG_LAYOUT_STABLE or
    View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY or
    View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION or
    View.SYSTEM_UI_FLAG_HIDE_NAVIGATION

당신은 또한 결과를 달성하지 못할 것입니다. android:fitsSystemWindows="true"루트 컨테이너에서 사용할 수 있지만 StatusBar가 나타납니다. 따라서 첫 번째 링크에서 해결 방법을 사용하십시오.


@Harshilkakadiya, 감사합니다! 전체 모드가 아닌 일반 모드로 되돌리려면이 해결 방법을 제거해야합니다. 나는 그것에 많은 시간을 낭비했다. 레이아웃 아래의 경우 공백이 생겼습니다. 행운을 빕니다!
CoolMind

2

제 경우에는 도움이되었습니다.

main_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main2"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:orientation="vertical"
    tools:context="com.livewallpaper.profileview.loginact.Main2Activity">

<TextView
    android:layout_weight="1"
    android:layout_width="match_parent"
    android:text="Title"
    android:gravity="center"
    android:layout_height="0dp" />
<LinearLayout
    android:layout_weight="1"
    android:layout_width="match_parent"
    android:layout_height="0dp">
    <EditText
        android:hint="enter here"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
</LinearLayout>
<TextView
    android:layout_weight="1"
    android:text="signup for App"
    android:gravity="bottom|center_horizontal"
    android:layout_width="match_parent"
    android:layout_height="0dp" />
</LinearLayout>

manifest파일 에서 이것을 사용하십시오

<activity android:name=".MainActivity"
        android:screenOrientation="portrait"
        android:windowSoftInputMode="adjustResize"/>

이제 가장 중요한 부분! Activity또는 Application태그 에서 이와 같은 테마를 사용하십시오 .

android:theme="@style/AppTheme"

그리고 테마는 다음과 같습니다

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
    <item name="windowActionBar">false</item>
    <item name="windowNoTitle">true</item>
    <item name="windowActionModeOverlay">true</item>
</style>

그래서 나는 테마를 놓치고 있었다. 하루 종일 좌절했다.


2

AndroidManifest.xml 파일에서 이러한 옵션을 간단히 설정할 수 있습니다.

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

adjustPan사용자는 모든 입력 필드를보기 위해 키보드를 닫아야 할 수 있으므로 Google에서는 사용을 권장하지 않습니다.

추가 정보 : Android 앱 매니페스트


2

나를 위해이 코드 줄을 사용했습니다.

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

그냥 onCreate 메소드에 넣으십시오. 베스트!


1
이것이 이론적으로 질문에 대답 할 수는 있지만 이것이 왜 효과가 있는지 설명하는 것이 바람직합니다.
clinomaniac


1

이 확장 클래스 프레임을 사용하고 onLayout의 높이 크기를 다시 계산해야 할 때 onKeymeasures를 재정의하고 getKeyboardHeight ()를 사용하여 keyboardHeight를 뺍니다.

소프트 키보드로 크기를 조정해야하는 내 프레임 만들기

SizeNotifierFrameLayout frameLayout = new SizeNotifierFrameLayout(context) {
            private boolean first = true;

            @Override
            protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
                super.onLayout(changed, left, top, right, bottom);

                if (changed) {
                    fixLayoutInternal(first);
                    first = false;
                }
            }

            @Override
            protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
                super.onMeasure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(MeasureSpec.getSize(heightMeasureSpec) - getKeyboardHeight(), MeasureSpec.EXACTLY));
            }

            @Override
            protected boolean drawChild(Canvas canvas, View child, long drawingTime) {
                boolean result = super.drawChild(canvas, child, drawingTime);
                if (child == actionBar) {
                    parentLayout.drawHeaderShadow(canvas, actionBar.getMeasuredHeight());
                }
                return result;
            }


        };

SizeNotifierFrameLayout

public class SizeNotifierFrameLayout extends FrameLayout {

    public interface SizeNotifierFrameLayoutDelegate {
        void onSizeChanged(int keyboardHeight, boolean isWidthGreater);
    }

    private Rect                            rect            = new Rect();
    private Drawable                        backgroundDrawable;
    private int                             keyboardHeight;
    private int                             bottomClip;
    private SizeNotifierFrameLayoutDelegate delegate;
    private boolean                         occupyStatusBar = true;

    public SizeNotifierFrameLayout(Context context) {
        super(context);
        setWillNotDraw(false);
    }

    public Drawable getBackgroundImage() {
        return backgroundDrawable;
    }

    public void setBackgroundImage(Drawable bitmap) {
        backgroundDrawable = bitmap;
        invalidate();
    }

    public int getKeyboardHeight() {
        View rootView = getRootView();
        getWindowVisibleDisplayFrame(rect);
        int usableViewHeight = rootView.getHeight() - (rect.top != 0 ? AndroidUtilities.statusBarHeight : 0) - AndroidUtilities.getViewInset(rootView);
        return usableViewHeight - (rect.bottom - rect.top);
    }

    public void notifyHeightChanged() {
        if (delegate != null) {
            keyboardHeight = getKeyboardHeight();
            final boolean isWidthGreater = AndroidUtilities.displaySize.x > AndroidUtilities.displaySize.y;
            post(new Runnable() {
                @Override
                public void run() {
                    if (delegate != null) {
                        delegate.onSizeChanged(keyboardHeight, isWidthGreater);
                    }
                }
            });
        }
    }

    public void setBottomClip(int value) {
        bottomClip = value;
    }

    public void setDelegate(SizeNotifierFrameLayoutDelegate delegate) {
        this.delegate = delegate;
    }

    public void setOccupyStatusBar(boolean value) {
        occupyStatusBar = value;
    }

    protected boolean isActionBarVisible() {
        return true;
    }

    @Override
    protected void onDraw(Canvas canvas) {
        if (backgroundDrawable != null) {
            if (backgroundDrawable instanceof ColorDrawable) {
                if (bottomClip != 0) {
                    canvas.save();
                    canvas.clipRect(0, 0, getMeasuredWidth(), getMeasuredHeight() - bottomClip);
                }
                backgroundDrawable.setBounds(0, 0, getMeasuredWidth(), getMeasuredHeight());
                backgroundDrawable.draw(canvas);
                if (bottomClip != 0) {
                    canvas.restore();
                }
            } else if (backgroundDrawable instanceof BitmapDrawable) {
                BitmapDrawable bitmapDrawable = (BitmapDrawable) backgroundDrawable;
                if (bitmapDrawable.getTileModeX() == Shader.TileMode.REPEAT) {
                    canvas.save();
                    float scale = 2.0f / AndroidUtilities.density;
                    canvas.scale(scale, scale);
                    backgroundDrawable.setBounds(0, 0, (int) Math.ceil(getMeasuredWidth() / scale), (int) Math.ceil(getMeasuredHeight() / scale));
                    backgroundDrawable.draw(canvas);
                    canvas.restore();
                } else {
                    int actionBarHeight =
                            (isActionBarVisible() ? ActionBar.getCurrentActionBarHeight() : 0) + (Build.VERSION.SDK_INT >= 21 && occupyStatusBar ? AndroidUtilities.statusBarHeight : 0);
                    int   viewHeight = getMeasuredHeight() - actionBarHeight;
                    float scaleX     = (float) getMeasuredWidth() / (float) backgroundDrawable.getIntrinsicWidth();
                    float scaleY     = (float) (viewHeight + keyboardHeight) / (float) backgroundDrawable.getIntrinsicHeight();
                    float scale      = scaleX < scaleY ? scaleY : scaleX;
                    int   width      = (int) Math.ceil(backgroundDrawable.getIntrinsicWidth() * scale);
                    int   height     = (int) Math.ceil(backgroundDrawable.getIntrinsicHeight() * scale);
                    int   x          = (getMeasuredWidth() - width) / 2;
                    int   y          = (viewHeight - height + keyboardHeight) / 2 + actionBarHeight;
                    canvas.save();
                    canvas.clipRect(0, actionBarHeight, width, getMeasuredHeight() - bottomClip);
                    backgroundDrawable.setBounds(x, y, x + width, y + height);
                    backgroundDrawable.draw(canvas);
                    canvas.restore();
                }
            }
        } else {
            super.onDraw(canvas);
        }
    }

    @Override
    protected void onLayout(boolean changed, int l, int t, int r, int b) {
        super.onLayout(changed, l, t, r, b);
        notifyHeightChanged();
    }
}

0

이 코드는 저에게 효과적입니다. 키보드가 나타나면 화면을 스크롤 할 수 있습니다

AndroidManifest.xml에서

<activity android:name=".signup.screen_2.SignUpNameAndPasswordActivity"
                  android:screenOrientation="portrait"
                  android:windowSoftInputMode="adjustResize">
</activity>

activity_sign_up.xml

<?xml version="1.0" encoding="utf-8"?>
<ScrollView
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fillViewport="true"
        tools:context=".signup.screen_2.SignUpNameAndPasswordActivity">
    <LinearLayout
            android:fitsSystemWindows="true"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical">

        <LinearLayout
                android:layout_marginTop="@dimen/dp_24"
                android:layout_marginStart="@dimen/dp_24"
                android:layout_marginEnd="@dimen/dp_24"
                android:id="@+id/lin_name_password"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="vertical">

            <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_gravity="center_horizontal"
                    android:fontFamily="sans-serif-medium"
                    android:text="@string/name_and_password"
                    android:textColor="@color/colorBlack"
                    android:layout_marginTop="@dimen/dp_5"
                    android:textSize="@dimen/ts_16"/>

            <EditText
                    android:id="@+id/edit_full_name"
                    android:layout_width="match_parent"
                    android:layout_height="@dimen/dp_44"
                    app:layout_constraintTop_toTopOf="parent"
                    android:hint="@string/email_address_hint"
                    android:inputType="textPersonName"
                    android:imeOptions="flagNoFullscreen"
                    android:textSize="@dimen/ts_15"
                    android:background="@drawable/rounded_border_edittext"
                    android:layout_marginTop="@dimen/dp_15"
                    android:paddingStart="@dimen/dp_8"
                    android:paddingEnd="@dimen/dp_8"
                    android:maxLength="100"
                    android:maxLines="1"/>

            <EditText
                    android:id="@+id/edit_password"
                    android:layout_width="match_parent"
                    android:layout_height="@dimen/dp_44"
                    app:layout_constraintTop_toTopOf="parent"
                    android:hint="@string/password"
                    android:inputType="textPassword"
                    android:imeOptions="flagNoFullscreen"
                    android:textSize="@dimen/ts_15"
                    android:background="@drawable/rounded_border_edittext"
                    android:layout_marginTop="@dimen/dp_15"
                    android:paddingStart="@dimen/dp_8"
                    android:paddingEnd="@dimen/dp_8"
                    android:maxLength="100"
                    android:maxLines="1"/>

            <TextView
                    android:id="@+id/btn_continue_and_sync_contacts"
                    android:layout_width="match_parent"
                    android:layout_height="@dimen/dp_44"
                    android:gravity="center"
                    android:clickable="true"
                    android:focusable="true"
                    android:layout_marginTop="@dimen/dp_15"
                    android:background="@drawable/btn_blue_selector"
                    android:enabled="false"
                    android:text="@string/continue_and_sync_contacts"
                    android:textColor="@color/colorWhite"
                    android:textSize="@dimen/ts_15"
                    android:textStyle="bold"/>

            <TextView
                    android:id="@+id/btn_continue_without_syncing_contacts"
                    android:layout_width="match_parent"
                    android:layout_height="@dimen/dp_44"
                    android:gravity="center"
                    android:clickable="true"
                    android:focusable="true"
                    android:layout_marginTop="@dimen/dp_10"
                    android:enabled="false"
                    android:text="@string/continue_without_syncing_contacts"
                    android:textColor="@color/colorBlue"
                    android:textSize="@dimen/ts_15"
                    android:textStyle="bold"/>

        </LinearLayout>
        <!--RelativeLayout is scaled when keyboard appears-->
        <RelativeLayout
                android:layout_marginStart="@dimen/dp_24"
                android:layout_marginEnd="@dimen/dp_24"
                android:layout_marginBottom="@dimen/dp_20"
                android:layout_width="match_parent"
                android:layout_height="match_parent">

            <LinearLayout
                    android:layout_alignParentBottom="true"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:orientation="vertical">
                <TextView
                        android:id="@+id/tv_learn_more_1"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:clickable="true"
                        android:focusable="true"
                        android:layout_gravity="center_horizontal"
                        android:text="@string/learn_more_syncing_contacts"
                        android:textColor="@color/black_alpha_70"
                        android:gravity="center"
                        android:layout_marginBottom="1dp"
                        android:textSize="@dimen/ts_13"/>

                <TextView
                        android:id="@+id/tv_learn_more_2"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:clickable="true"
                        android:focusable="true"
                        android:layout_gravity="center_horizontal"
                        android:text="@string/learn_more"
                        android:fontFamily="sans-serif-medium"
                        android:textColor="@color/black_alpha_70"
                        android:textSize="@dimen/ts_13"/>
            </LinearLayout>
        </RelativeLayout>
    </LinearLayout>
</ScrollView>

rounded_border_edittext.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_activated="true">
        <shape android:shape="rectangle">
            <solid android:color="#F6F6F6"/>
            <corners android:radius="3dp"/>
            <stroke
                    android:width="1dp"
                    android:color="@color/red"/>
        </shape>
    </item>
    <item android:state_activated="false">
        <shape android:shape="rectangle">
            <solid android:color="#F6F6F6"/>
            <corners android:radius="3dp"/>
            <stroke
                    android:width="1dp"
                    android:color="@color/colorGray"/>
        </shape>
    </item>
</selector>

btn_blue_selector.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_enabled="true" android:state_pressed="true">
        <shape android:shape="rectangle">
            <corners android:radius="3dp"/>
            <solid android:color="@color/colorBlueLight"/>
            <stroke android:width="1dp" android:color="@color/colorBlueLight"/>
        </shape>
    </item>
    <item android:state_enabled="true">
        <shape android:shape="rectangle">
            <corners android:radius="3dp"/>
            <solid android:color="@color/colorBlue"/>
            <stroke android:width="1dp" android:color="@color/colorBlue"/>
        </shape>
    </item>
    <item android:state_enabled="false">
        <shape android:shape="rectangle">
            <corners android:radius="3dp"/>
            <solid android:color="@color/colorBlueAlpha"/>
            <stroke android:width="0dp" android:color="@color/colorBlueAlpha"/>
        </shape>
    </item>
</selector>

0

Xamarin에서 활동의 아래 코드를 등록하십시오.

 WindowSoftInputMode = Android.Views.SoftInput.AdjustResize | Android.Views.SoftInput.AdjustPan

Constraint Layout을 사용하는 경우 Relative Layout을 사용했습니다. 위의 코드는 아래 코드에서 작동합니다.

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