wake-up-neo.com

So passen Sie das Layout an, wenn die Soft-Tastatur angezeigt wird

Ich möchte das Layout anpassen, wenn die Soft-Tastatur aktiviert ist, wie folgt:

Vorher und nachher: ​​

enter image description hereenter image description here


Paarressourcen in SO gefunden: 

  1. So bleiben alle Felder und Texte sichtbar, während die Soft-Tastatur angezeigt wird
  2. Android-Soft-Tastatur verschlechtert das Layout, wenn angezeigt wird
  3. Layout anpassen, wenn die Softtastatur eingeschaltet ist

Aber die Fragen und Antworten sind ziemlich vieldeutig, hier ist die Frage mit einem klareren Bild von dem, was ich will. 

Bedarf:

  • Es sollte auf dem Telefon mit allen Bildschirmgrößen funktionieren.
  • Es wurde festgestellt, dass sich der Rand/Auffüllbereich bei "FACEBOOK" und "Anmelden für Facebook" vor und nach dem Datum geändert hat. 
  • Es ist keine Bildlaufansicht betroffen.
128
Roy Lee

Einfach hinzufügen 

Android:windowSoftInputMode="adjustResize"

in Ihrer AndroidManifest.xml-Datei, in der Sie diese bestimmte Aktivität deklarieren. Dadurch wird die Option zur Größenänderung des Layouts angepasst.

enter image description here

quellcode unten für Layoutentwurf 

<?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>
164
Venkatesh S

Diese Frage wurde vor ein paar Jahren gestellt und "Secret Andro Geni" hat eine gute Basiserklärung und "tir38" hat auch einen guten Versuch mit der Gesamtlösung unternommen, aber leider gibt es keine vollständige Lösung hier ..__ verbringe ein paar Stunden damit, Dinge herauszufinden, und hier ist meine vollständige Lösung mit ausführlicher Erklärung unten:

<?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>

Und in AndroidManifest.xml , vergiss nicht zu setzen:

Android:windowSoftInputMode="adjustResize"

auf dem <activity>-Tag, an dem Sie ein solches Layout wünschen.

Gedanken:

Ich habe festgestellt, dass RelativeLayout die Layouts sind, die sich über den gesamten verfügbaren Speicherplatz erstrecken und die Größe dann geändert wird, wenn die Tastatur erscheint.

Und LinearLayout sind Layouts, deren Größenänderung beim Ändern nicht geändert wird.

Aus diesem Grund benötigen Sie 1 RelativeLayout unmittelbar nach ScrollView, um sich über den gesamten verfügbaren Bildschirmbereich zu erstrecken. Und Sie müssen eine LinearLayout in einer RelativeLayout haben, andernfalls würde Ihr Inneres bei der Größenanpassung zerstört werden. Ein gutes Beispiel ist "headerLayout". Wenn sich keine LinearLayout darin befinden würde, würde RelativeLayout "facebook" Text zerquetscht und nicht angezeigt.

Bei den in der Frage veröffentlichten "facebook" -Anmeldebildern ist mir auch aufgefallen, dass der gesamte Login-Teil (mainLayout) vertikal zum gesamten Bildschirm zentriert ist, daher das Attribut:

Android:layout_centerVertical="true"

im Layout LinearLayout. Und da sich mainLayout in einer LinearLayout befindet, bedeutet dies, dass die Größe des Teils nicht geändert wird (siehe auch Bild in Frage).

29
Yani2000

Fügen Sie diese Zeile in Ihr Manifest ein, wo Ihre Aktivität aufgerufen wird

Android:windowSoftInputMode="adjustPan|adjustResize"

oder 

sie können diese Zeile in Ihre onCreate einfügen.

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE|WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
17
Ashish Jaiswal

Android Developer hat die richtige Antwort, aber der bereitgestellte Quellcode ist ziemlich ausführlich und implementiert das im Diagramm beschriebene Muster nicht.

Hier ist eine bessere Vorlage:

<?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>

Es liegt an Ihnen zu entscheiden, welche Ansichten Sie für die Teile "Scrollen" und "Fußzeile" verwenden. Beachten Sie auch, dass Sie wahrscheinlich ScrollViews fillViewPort einstellen müssen.

11
tir38

Es kann für alle Arten von Layouts verwendet werden.

  1. fügen Sie dies zu Ihrem Aktivitäts-Tag in AndroidManifest.xml hinzu.

Android: windowSoftInputMode = "adjustResize"

zum Beispiel:

<activity Android:name=".ActivityLogin"
    Android:screenOrientation="portrait"
    Android:theme="@style/AppThemeTransparent"
    Android:windowSoftInputMode="adjustResize"/>
  1. fügen Sie dies in Ihrem Layout-Tag in activitypage.xml hinzu, das seine Position ändert.

Android: fitsSystemWindows = "true" 

und

Android: layout_alignParentBottom = "true"

zum Beispiel:

<RelativeLayout
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:layout_alignParentBottom="true"
Android:fitsSystemWindows="true">
7
user3725137

Dadurch kann jedes gewünschte Layout angezeigt werden, das zuvor von der Tastatur ausgeblendet wurde.

Fügen Sie dies dem Activity-Tag in AndroidManifest.xml hinzu

Android: windowSoftInputMode = "adjustResize"


Umgeben Sie Ihre Root-Ansicht mit einer ScrollView, vorzugsweise mit Scrollbalken = keine. Die ScrollView-Komponente ändert nichts an Ihrem Layout, es sei denn, es wird zur Lösung dieses Problems verwendet.

Und dann setSitsWindows = "true" in der Ansicht, die über der Tastatur vollständig angezeigt werden soll. Dies macht Ihren EditText oberhalb der Tastatur sichtbar und ermöglicht das Scrollen zu den Teilen unterhalb des EditText, aber in die Ansicht mit fitsSystemWindows = "true".

Android: fitsSystemWindows = "true"

Zum Beispiel:

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

Wenn Sie den vollständigen Teil der Ansicht "fitsSystemWindows =" true "über der Tastatur anzeigen möchten, sobald die Tastatur angezeigt wird, benötigen Sie etwas Code, um die Ansicht nach unten zu scrollen:

// 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)
}

Vollständiges Layoutbeispiel:

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

4

Viele Antworten sind richtig. In AndroidManifest schrieb ich:

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

In meinem Fall habe ich ein Thema in styles.xml hinzugefügt, aber Sie können Ihr eigenes verwenden:

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

Ich habe gemerkt, dass beim Ändern des Vollbild-Designs keine Größenanpassung erfolgt:

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

Auch in meinem Fall funktioniert adjustResize, aber adjustPan nicht.

Für Vollbild-Layouts siehe eine Problemumgehung in Android So passen Sie das Layout im Vollbildmodus an, wenn das Softkeyboard sichtbar ist oder in https://Gist.github.com/grennis/2e3cd5f7a9238c59861015ce0a7c5584 .

Auch https://medium.com/@sandeeptengale/problem-solved-3-Android-full-screen-view-translucent-scrollview-adjustresize-keyboard-b0547c7ced32 funktioniert, aber StatusBar ist transparent, also Batterie, Uhr, Wi-Fi-Symbole sind sichtbar.

Wenn Sie eine Aktivität mit Datei> Neu> Aktivität> Vollbildaktivität erstellen, wird der Code verwendet:

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

sie werden auch kein Ergebnis erzielen. Sie können Android:fitsSystemWindows="true" in einem Stammcontainer verwenden, StatusBar wird jedoch angezeigt. Verwenden Sie daher ab dem ersten Link Problemumgehungen.

3
CoolMind

In meinem Fall hat es geholfen.

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>

Verwenden Sie dies in manifest-Datei

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

Nun der wichtigste Teil! Verwenden Sie das Thema entweder im Activity- oder Application-Tag.

Android:theme="@style/AppTheme"

Und das Thema nahm so an

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

Also fehlte mir das Thema. Was mich den ganzen Tag frustriert hat.

Sie können diese Optionen einfach in der Datei AndroidManifest.xml festlegen.

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

Die Verwendung von adjustPan wird von Google nicht empfohlen, da der Benutzer möglicherweise die Tastatur schließen muss, um alle Eingabefelder anzuzeigen.

Weitere Informationen: Manifest für Android-Apps

2
vovahost

Für mich hat es mit dieser Codezeile funktioniert:

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

Legen Sie es einfach in die onCreate-Methode . Am besten!

1
Peter94

Bei Verwendung von ConstraintLayout funktioniert Android:windowSoftInputMode="adjustPan|adjustResize" nicht.

Was Sie tun können, ist die Verwendung eines Soft-Keyboard-Listener , um die Beschränkungen der Ansichten von unten nach unten in den oberen Ansichten festzulegen. Stellen Sie dann für jede Ansicht eine vertikale Abweichung (als Positionsprozentsatz zwischen Abhängigkeiten) zu einer horizontalen Hilfslinie ein (ebenfalls prozentual, aber zum übergeordneten Element positioniert).

Für jede Ansicht müssen wir nur app:layout_constraintBottom_toBottomOf in @+id/guideline ändern, wenn die Tastatur angezeigt wird , natürlich programmgesteuert.

        <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"/>

Im Allgemeinen nimmt eine Soft-Tastatur nicht mehr als 50% der Bildschirmhöhe ein. Somit können Sie die Richtlinie auf 0,5 einstellen.

        <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"/>

Wenn die Tastatur jetzt programmgesteuert nicht angezeigt wird , können wir alle app:layout_constraintBottom_toBottomOf auf übergeordnet zurücksetzen, umgekehrt.

            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);
            }
        });

Rufen Sie diese Methode auf:

    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);
}

Wichtig ist, dass Sie die vertikale Vorspannung so einstellen, dass sie korrekt skaliert wird, wenn die Tastatur angezeigt und nicht angezeigt wird.

1
NocTurn

Dieser Code funktioniert für mich. Wenn die Tastatur angezeigt wird, können Sie den Bildschirm scrollen

In 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>

round_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
Anh Duy

Fügen Sie diese Zeile in die Manifest-Datei ein:

Android:windowSoftInputMode="adjustResize"

Ich benutze diesen Extended-Klassenrahmen Und wenn ich die Höhe auf "Layout" neu berechnen muss, überschreibe ich onmeasure Und subtrahiere keyboardHeight mit getKeyboardHeight ().

Mein Erstellungsrahmen, dessen Größe mit dem Softkeyboard geändert werden muss

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
Arthur Melo