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 une bonne tentative de solution complète, mais hélas, aucune solution complète n'a été publiée ici. J'ai passé quelques heures à comprendre les choses et voici ma solution complète avec une explication détaillée en bas :
Et dans AndroidManifest.xml, n'oubliez pas de définir :
android:windowSoftInputMode="adjustResize"
sur l'attribut qui correspond à ce type de mise en page.
Pensées :
J'ai réalisé que les RelativeLayout
sont les mises en page qui s'étendent sur tout l'espace disponible et sont ensuite redimensionnées lorsque le clavier apparaît.
Et les LinearLayout
sont des mises en page qui ne sont pas redimensionnées lors du processus de redimensionnement.
C'est pourquoi vous devez avoir 1 RelativeLayout
immédiatement après ScrollView
pour couvrir tout l'espace d'écran disponible. Et vous devez avoir un LinearLayout
à l'intérieur d'un RelativeLayout
sinon vos éléments à l'intérieur seraient écrasés lors du redimensionnement. Un bon exemple est "headerLayout". S'il n'y avait pas de LinearLayout
à l'intérieur de ce RelativeLayout
, le texte "facebook" serait écrasé et ne s'afficherait pas.
Dans les images de connexion "facebook" postées dans la question, j'ai également remarqué que toute la partie de connexion (mainLayout) est centrée verticalement par rapport à l'écran, d'où l'attribut :
android:layout_centerVertical="true"
sur la mise en page LinearLayout
. Et parce que mainLayout est à l'intérieur d'un LinearLayout
, cela signifie que cette partie ne se redimensionne pas (voir à nouveau l'image dans la question).
4 votes
Il est également bon de se rappeler que le redimensionnement ne fonctionne pas en plein écran (
Theme.AppCompat.Light.NoActionBar.FullScreen
), comme indiqué dans cette réponse -> stackoverflow.com/a/7509285/1307690