Comment ajuster la mise en page lorsque le clavier souple apparaît

je voudrais ajuster/redimensionner la mise en page lorsque le clavier doux s'active, comme ci-dessous:

avant et après:

enter image description here enter image description here


Trouvé quelques ressources dans:

  1. Comment garder tous les champs et textes visibles alors que le clavier est affiché
  2. android clavier souple dépouilles de la mise en page lorsque apparaît
  3. ajuster la disposition lorsque le clavier souple est sur

mais les questions et les réponses sont plutôt ambiguës, voici la question avec une image plus claire de ce que je veux.

exigences:

  • Il devrait fonctionner sur le téléphone avec toutes les tailles d'écran.
  • a remarqué que l'espace de marge / rembourrage à "FACEBOOK" et " S'inscrire pour Facebook" a changé avant et après.
  • aucune vue parchemin n'est impliquée.
123
demandé sur Community 2013-05-07 08:08:21

9 réponses

il suffit d'ajouter

android:windowSoftInputMode="adjustResize"

dans votre AndroidManifest.xml où vous déclarez cette activité particulière et ceci ajustera l'option de mise en page redimensionner.

enter image description here

quelques codes sources ci-dessous pour le schéma de configuration

<?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>
155
répondu Venkatesh S 2015-02-27 00:30:19

cette question a été posée il y a quelques années et" secret Andro Geni "a une bonne explication de base et" tir38 " a également fait un bon essai sur la solution complète, mais hélas, il n'y a pas de solution complète affiché ici. J'ai passé quelques heures à comprendre les choses et voici ma solution complète avec une explication détaillée en bas:

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

et dans AndroidManifest.xml , n'oubliez pas de définir:

android:windowSoftInputMode="adjustResize"

sur l'étiquette <activity> que vous voulez une telle disposition.

pensées:

j'ai réalisé que RelativeLayout sont les dispositions qui s'étendent sur thru tout l'espace disponible et sont ensuite redimensionnée lorsque le clavier apparaît.

et LinearLayout sont des mises en page qui ne sont pas redimensionnées dans le processus de redimensionnement.

C'est pourquoi vous devez avoir 1 RelativeLayout immédiatement après ScrollView pour couvrir tout l'espace disponible sur l'écran. Et vous devez avoir un LinearLayout à l'intérieur d'un RelativeLayout sinon vos entrailles seraient écrasées quand le redimensionnement se produit. Un bon exemple est "headerLayout". S'il n'y avait pas un LinearLayout à l'intérieur de ce RelativeLayout " facebook " le texte serait écrasé et ne serait pas affiché.

dans les photos de connexion" facebook " postées dans la question j'ai également remarqué que toute la partie de connexion (mainLayout) est centré verticalement par rapport à l'écran entier, d'où l'attribut:

android:layout_centerVertical="true"

sur la disposition LinearLayout . Et puisque mainLayout est à l'intérieur d'un LinearLayout cela signifie que cette partie ne sera pas redimensionnée (encore une fois voir l'image en question).

25
répondu Yani2000 2016-02-01 15:12:42

ajouter cette ligne dans votre manifeste où votre activité est appelée

android:windowSoftInputMode="adjustPan|adjustResize"

ou

, vous pouvez ajouter cette ligne dans votre onCreate

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE|WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
13
répondu Ashish Jaiswal 2017-09-12 12:17:03

développeur Android a la bonne réponse, mais le code source fourni est assez verbeux et ne met pas réellement en œuvre le modèle décrit dans le diagramme.

voici un meilleur modèle:

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

C'est à vous de décider quelles vues vous utilisez pour les parties" défiler "et" pied de page". Sachez aussi que vous devez probablement mettre le ScrollView s fillViewPort .

9
répondu tir38 2015-06-24 20:09:25

il peut fonctionner pour tout type de mise en page.

  1. ajoutez ceci à votre étiquette d'activité dans AndroidManyfest.XML android: windowSoftInputMode= " adjustResize" par exemple:

  2. ajoutez ceci sur votre étiquette de mise en page dans activitypage.xml qui changera sa position. android: fitsSystemWindows= "true" et android:layout_alignParentBottom= " true" exemple:

3
répondu user3725137 2018-01-11 07:02:41

Cela permet de montrer tout voulu disposition caché par le clavier.

ajoutez ceci à l'étiquette d'activité dans AndroidManifest.xml

android: windowSoftInputMode= "adjusresize"



Entourez votre vue de la racine d'un ScrollView, de préférence avec scrollbars=none. Le ScrollView ne changera rien à votre mise en page sauf être utilisé pour résoudre ce problème.

et ensuite définir fitsSystemWindows=" true " sur la vue que vous voulez faire entièrement indiquée au-dessus du clavier. Cela rendra votre texte D'édition visible au-dessus du clavier, et il sera possible de faire défiler vers le bas jusqu'aux parties sous le texte D'édition mais dans la vue avec fitsSystemWindows="true".

android: fitsSystemWindows= "true"

par exemple:

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

si vous voulez afficher la partie complète de la vue fitsSystemWindows= "true" au-dessus du clavier au moment où le clavier apparaît, vous aurez besoin d'un peu de code pour faire défiler la vue vers le bas:

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

mise en page Complète exemple:

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

2
répondu Morten Holmgaard 2018-06-01 06:40:43

dans mon cas, ça m'a aidé.

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>

utilisez ceci dans manifest file

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

Maintenant, la partie la plus importante! Utilisez un thème comme celui-ci dans la balise Activity ou Application .

android:theme="@style/AppTheme"

et le thème sonne comme ceci

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

donc je manquais le thème. Ce qui m'a frustré toute la journée.

1
répondu Pradeep Kumar Kushwaha 2017-01-02 12:52:06

vous pouvez simplement définir ces options dans le AndroidManifest.fichier xml.

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

L'utilisation de adjustPan n'est pas recommandée par Google car L'utilisateur peut avoir besoin de fermer le clavier pour voir tous les champs d'entrée.

plus d'informations: Android App Manifest

1
répondu vovahost 2017-08-13 17:12:05

pour moi, il a fonctionné avec cette ligne de code:

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

mettez-le dans la méthode onCreate. Meilleur!

0
répondu Ian Žonja 2018-04-18 17:34:40