204 votes

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

Je voudrais ajuster/redimensionner la mise en page lorsque le clavier virtuel est activé, comme ci-dessous :

Avant et Après :

entrer la description de l'image icientrer la description de l'image ici


J'ai trouvé quelques ressources sur SO :

  1. Comment garder tous les champs et textes visibles lorsque le clavier virtuel est affiché
  2. le clavier virtuel Android perturbe la mise en page lorsqu'il apparaît
  3. Ajuster la mise en page lorsque le clavier virtuel est affiché

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

Exigences :

  • Il doit fonctionner sur les téléphones de toutes tailles d'écran.
  • J'ai remarqué que l'espace de marge/remplissage autour de "FACEBOOK" et "Inscrivez-vous sur Facebook" a changé avant et après.
  • Aucune vue défilante n'est impliquée.

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

244voto

Android Developer Points 2203

Ajoutez simplement

android:windowSoftInputMode="adjustResize"

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

entrer la description de l'image ici

un peu de code source ci-dessous pour la conception de la mise en page

2 votes

+1 C'est si simple? Des conditions supplémentaires? De quoi parlait l'image que vous avez postée?

2 votes

Amis juste pour afficher alignparentbottom="true" si l'écran n'est pas correctement ajusté .. donc j'ai placé cette image ami

0 votes

Réponse très bonne en effet. Merci pour l'aide, mon ami. Content que tu sois venu.

45voto

Yani2000 Points 506

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

1 votes

Ça marche à merveille!! mais le pied de page est collé en bas de la mise en page, ce qui ne donne pas un bel aspect. Comment puis-je éviter que le pied de page reste collé en bas! Au lieu de cela, si je veux donner une marge au pied de page pour que la mise en page soit jolie. J'ai apporté quelques modifications en ajoutant l'attribut layout_margin à la mise en page relative du pied de page mais cela couvre la moitié de la zone de texte. S'il vous plaît aidez-moi.

0 votes

Dans RelativeLayout avec @+id/footerLayout, vous avez un LinearLayout qui a cet attribut: android:layout_alignParentBottom="true". Cela le fait coller en bas.

0 votes

Ya, en gardant à l’esprit que, je vous ai demandé comment faire les arrangements des composants de pied de page qui devraient avoir une marge inférieure d'au moins 10dp ou 15dp

36voto

Ashish Jaiswal Points 468

Ajoutez cette ligne dans votre Manifest là où votre Activity 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);

15 votes

Il ne faut jamais utiliser à la fois adjustPan et adjustResize. Ce sont des modes différents. En savoir plus à leur sujet ici : stackoverflow.com/a/17410528/1738090 Et ici : developer.android.com/guide/topics/manifest/activity-element

29voto

user3725137 Points 241

Cela peut fonctionner pour tous types de mises en page.

  1. ajoutez ceci à votre balise activity dans AndroidManifest.xml

android:windowSoftInputMode="adjustResize"

par exemple:

  1. ajoutez ceci à votre balise layout dans activitypage.xml qui changera sa position.

android:fitsSystemWindows="true"

et

android:layout_alignParentBottom="true"

par exemple:

1 votes

Cette réponse fournit de meilleures informations sur la façon de rendre n'importe quel agencement fonctionnel.

14voto

tir38 Points 387

Le développeur Android a la bonne réponse, mais le code source fourni est assez verbeux et n'implémente pas réellement le schéma décrit dans le diagramme.

Voici un meilleur modèle:

C'est à vous de décider quelles vues vous utilisez pour les parties "défilement" et "pied de page". Sachez également que vous devrez probablement définir le fillViewPort des ScrollView.

0 votes

J'ai essayé de suivre votre solution en utilisant deux LinearLayout au lieu de Frame et Relative, mais toutes les vues sont toujours les unes sur les autres.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X