J'ai beaucoup recherché pour ajuster la mise en page lorsque le clavier logiciel est actif et je l'ai implémenté avec succès, mais le problème survient lorsque j'utilise android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
cette balise d'activité dans le fichier manifeste.
Pour cela, j'ai utilisé android:windowSoftInputMode="adjustPan|adjustResize|stateHidden"
différentes options mais pas de chance.
Après cela, j'ai implémenté par FullScreen
programme et essayé différentes mises en page avec lesquelles travailler, FullScreen
mais en vain.
J'ai fait référence à ces liens et j'ai consulté de nombreux articles liés à ce problème:
http://android-developers.blogspot.com/2009/04/updating-applications-for-on-screen.html
http://davidwparker.com/2011/08/30/android-how-to-float-a-row-above-keyboard/
Voici le code xml:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout android:id="@+id/masterContainerView"
android:layout_width="fill_parent" android:layout_height="fill_parent"
android:orientation="vertical" xmlns:android="http://schemas.android.com/apk/res/android"
android:background="#ffffff">
<ScrollView android:id="@+id/parentScrollView"
android:layout_width="fill_parent" android:layout_height="wrap_content">
<LinearLayout android:layout_width="fill_parent"
android:layout_height="fill_parent" android:orientation="vertical">
<TextView android:id="@+id/setup_txt" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:text="Setup - Step 1 of 3"
android:textColor="@color/top_header_txt_color" android:textSize="20dp"
android:padding="8dp" android:gravity="center_horizontal" />
<TextView android:id="@+id/txt_header" android:layout_width="fill_parent"
android:layout_height="40dp" android:text="AutoReply:"
android:textColor="@color/top_header_txt_color" android:textSize="14dp"
android:textStyle="bold" android:padding="10dp"
android:layout_below="@+id/setup_txt" />
<EditText android:id="@+id/edit_message"
android:layout_width="fill_parent" android:layout_height="wrap_content"
android:text="Some text here." android:textSize="16dp"
android:textColor="@color/setting_editmsg_color" android:padding="10dp"
android:minLines="5" android:maxLines="6" android:layout_below="@+id/txt_header"
android:gravity="top" android:scrollbars="vertical"
android:maxLength="132" />
<ImageView android:id="@+id/image_bottom"
android:layout_width="fill_parent" android:layout_height="wrap_content"
android:layout_below="@+id/edit_message" />
</LinearLayout>
</ScrollView>
<RelativeLayout android:id="@+id/scoringContainerView"
android:layout_width="fill_parent" android:layout_height="50px"
android:orientation="vertical" android:layout_alignParentBottom="true"
android:background="#535254">
<Button android:id="@+id/btn_save" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_alignParentRight="true"
android:layout_marginTop="7dp" android:layout_marginRight="15dp"
android:layout_below="@+id/edit_message"
android:text = "Save" />
<Button android:id="@+id/btn_cancel" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_marginTop="7dp"
android:layout_marginRight="10dp" android:layout_below="@+id/edit_message"
android:layout_toLeftOf="@+id/btn_save" android:text = "Cancel" />
</RelativeLayout>
</RelativeLayout>
Je veux que les 2 boutons inférieurs montent lorsque le clavier virtuel apparaît.
la source
android:windowSoftInputMode="adjustPan"
dites-moi si ce travail ..adjustResize
etadjustPan
en même temps, à partir du javadoc deandroid.view.WindowManager.LayoutParams#SOFT_INPUT_ADJUST_RESIZE
: "Cela ne peut pas être combiné avec {@link SOFT_INPUT_ADJUST_PAN}"Réponses:
Sur la base de la solution de contournement de yghm, j'ai codé une classe de commodité qui me permet de résoudre le problème avec une ligne unique (après avoir ajouté la nouvelle classe à mon code source bien sûr). Le one-liner est:
Et la classe d'implémentation est:
J'espère que cela aide quelqu'un.
la source
return (r.bottom - r.top);
parreturn r.bottom
pour le faire fonctionner sur mon HTC One Mini, sinon la vue d'activité serait poussée trop haut par la taille de la barre d'état. Cependant, je ne l'ai pas encore testé sur un autre appareil. J'espère que cela peut aider.frameLayoutParams.height = usableHeightSansKeyboard;
je dois utiliserframeLayoutParams.height = usableHeightNow;
Si je ne le fais pas, certains éléments tombent en dehors de l'écran.Étant donné que la réponse a déjà été choisie et que le problème est connu pour être un bogue, j'ai pensé ajouter un "Contournement possible".
Vous pouvez basculer en mode plein écran lorsque le clavier virtuel est affiché. Cela permet à "AdjustPan" de fonctionner correctement.
En d'autres termes, j'utilise toujours @android: style / Theme.Black.NoTitleBar.Fullscreen dans le cadre du thème de l'application et stateVisible | AdjustResize dans le cadre du mode de saisie de la fenêtre d'activité, mais pour les faire fonctionner ensemble, je dois basculer en mode plein écran avant que le clavier ne se lève.
Utilisez le code suivant:
Désactiver le mode plein écran
Activer le mode plein écran
Remarque - l'inspiration est venue de: Masquage du titre en mode plein écran
la source
J'ai essayé la solution de Joseph Johnson , mais comme d'autres, j'ai rencontré le problème de l'écart entre le contenu et le clavier. Le problème se produit car le mode d'entrée logicielle est toujours panoramique lors de l'utilisation du mode plein écran. Ce panoramique interfère avec la solution de Joseph lorsque vous activez un champ de saisie qui serait masqué par l'entrée logicielle.
Lorsque l'entrée logicielle apparaît, le contenu est d'abord déplacé en fonction de sa hauteur d'origine, puis redimensionné selon la mise en page demandée par la solution de Joseph. Le redimensionnement et la mise en page ultérieure n'annulent pas le panoramique, ce qui entraîne un écart. L'ordre complet des événements est:
Il n'est pas possible de désactiver le panoramique, mais il est possible de forcer le décalage du panoramique à 0 en modifiant la hauteur du contenu. Cela peut être fait dans l'écouteur, car il est exécuté avant le panoramique. Le réglage de la hauteur du contenu à la hauteur disponible permet une expérience utilisateur fluide, c'est-à-dire sans scintillement.
J'ai également apporté ces modifications. Si l'un de ces problèmes pose problème, faites-le moi savoir:
getWindowVisibleDisplayFrame
. LeRect
est mis en cache pour éviter un peu de déchets inutiles.Il a été testé sur un Nexus 5 et des émulateurs exécutant des niveaux d'API 16 à 24 avec des tailles d'écran allant de petit à grand.
Le code a été porté sur Kotlin, mais le portage de mes modifications vers Java est simple. Dis-moi si tu as besoin d'aide:
la source
possiblyResizeChildOfContent
appel et dans l'removeListener
appel, et même après avoir atteint leremoveListener
point d'arrêt, ilpossiblyResizeChildOfContent
est toujours appelé. Quelqu'un d'autre a-t-il ce problème?Je viens de trouver une solution simple et fiable si vous utilisez l'approche de l'interface utilisateur système ( https://developer.android.com/training/system-ui/immersive.html ).
Cela fonctionne dans le cas où vous utilisez
View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
, par exemple si vous utilisezCoordinatorLayout
.Cela ne fonctionnera pas pour
WindowManager.LayoutParams.FLAG_FULLSCREEN
(celuiandroid:windowFullscreen
avecSYSTEM_UI_FLAG_LAYOUT_STABLE
lequel vous pouvez également définir le thème ), mais vous pouvez obtenir un effet similaire avec (qui "a le même effet visuel" selon la documentation ) et cette solution devrait fonctionner à nouveau.Je l'ai testé sur mon appareil exécutant Marshmallow.
La clé est que les claviers programmables sont également l'une des fenêtres du système (comme la barre d'état et la barre de navigation), de sorte que le
WindowInsets
système distribué par le système contient des informations précises et fiables à ce sujet.Pour le cas d'utilisation comme celui
DrawerLayout
où nous essayons de dessiner derrière la barre d'état, nous pouvons créer une mise en page qui ignore uniquement l'encart supérieur et applique l'encart inférieur qui tient compte du clavier logiciel.Voici ma coutume
FrameLayout
:Et pour l'utiliser:
Cela devrait théoriquement fonctionner pour tout appareil sans modification insensée, bien mieux que tout piratage qui tente de prendre une taille d'écran aléatoire
1/3
ou1/4
de référence.(Cela nécessite l'API 16+, mais j'utilise le plein écran uniquement sur Lollipop + pour dessiner derrière la barre d'état, c'est donc la meilleure solution dans ce cas.)
la source
Veuillez noter que
android:windowSoftInputMode="adjustResize"
cela ne fonctionne pas lorsqueWindowManager.LayoutParams.FLAG_FULLSCREEN
est défini pour une activité. Vous avez deux options.Soit désactiver le mode plein écran pour votre activité. L'activité n'est pas redimensionnée en mode plein écran. Vous pouvez le faire soit en xml (en changeant le thème de l'activité) soit en code Java. Ajoutez les lignes suivantes dans votre méthode onCreate ().
OU
Utilisez un autre moyen pour atteindre le mode plein écran. Ajoutez le code suivant dans votre méthode onCreate ().
Veuillez noter que la méthode 2 ne fonctionne que sous Android 4.1 et supérieur.
la source
J'ai dû faire face à ce problème aussi et j'ai eu un travail autour duquel j'ai vérifié sur HTC One, Galaxy s1, s2, s3, note et HTC sensation.
mettre un écouteur de mise en page globale sur la vue racine de votre mise en page
et là-dedans, j'ai vérifié la différence de hauteur et si la différence de hauteur de l'écran est plus grande qu'un tiers de la hauteur de l'écran, nous pouvons supposer que le clavier est ouvert. l'a pris de cette réponse .
ce n'est probablement pas à l'épreuve des balles et peut-être que sur certains appareils, cela ne fonctionnera pas mais cela a fonctionné pour moi et j'espère que cela vous aidera aussi.
la source
J'ai implémenté la solution Joseph Johnson et cela a bien fonctionné, j'ai remarqué qu'après avoir utilisé cette solution, le tiroir de l'application ne se fermait pas correctement. J'ai ajouté une fonctionnalité pour supprimer l'écouteur removeOnGlobalLayoutListener lorsque l'utilisateur ferme le fragment où se trouvent les edittexts.
utilise la classe où se trouvent mes edittexts
la source
Ajoutez
android:fitsSystemWindows="true"
à la mise en page, et cette mise en page sera redimensionnée.la source
Pour le faire fonctionner avec FullScreen:
Utilisez le plugin de clavier ionique. Cela vous permet d'écouter quand le clavier apparaît et disparaît.
OnDeviceReady ajoute ces écouteurs d'événements:
La logique:
Fondamentalement, si leur différence est moins, c'est la quantité de pixels que le clavier couvre de votre entrée. Donc, si vous ajustez votre div parent par cela, cela devrait le neutraliser.
L'ajout de délais d'attente à la logique dit que 300 ms devrait également optimiser les performances (car cela permettra au clavier d'apparaître.
la source
J'ai essayé le cours de Joseph Johnson et cela a fonctionné, mais n'a pas tout à fait répondu à mes besoins. Plutôt que d'émuler android: windowSoftInputMode = "AdjustResize", j'avais besoin d'émuler android: windowSoftInputMode = "AdjustPan".
J'utilise ceci pour une vue Web en plein écran. Pour faire un panoramique de la vue de contenu à la bonne position, je dois utiliser une interface javascript qui fournit des détails sur la position de l'élément de page qui a le focus et qui reçoit donc l'entrée du clavier. J'ai omis ces détails, mais j'ai fourni ma réécriture de la classe de Joseph Johnson. Il vous fournira une base très solide pour implémenter un panoramique personnalisé par rapport à son redimensionnement.
la source
En effet, l'apparence du clavier souple ne semble pas affecter le
Activity
en aucune façon, peu importe ce quewindowSoftInputMode
je sélectionne dans leFullScreen
mode.Bien que je n'ai pas pu trouver beaucoup de documentation sur cette propriété, je pense que le
FullScreen
mode a été conçu pour les applications de jeu qui ne nécessitent pas beaucoup d'utilisation du clavier logiciel. Si la vôtre est une activité qui nécessite une interaction de l'utilisateur via un clavier logiciel, veuillez reconsidérer l'utilisation d'un thème non plein écran. Vous pouvez désactiver la barre de titre à l'aide d'unNoTitleBar
thème. Pourquoi voudriez-vous masquer la barre de notification?la source
Continuez comme ça
android:windowSoftInputMode="adjustResize"
. Parce qu'il est donné de ne garder qu'un seul hors de"adjustResize"
et"adjustPan"
(Le mode de réglage de la fenêtre est spécifié avec AdjustResize ou AdjustPan. Il est fortement recommandé de toujours spécifier l'un ou l'autre). Vous pouvez le découvrir ici: http://developer.android.com/resources/articles/on-screen-inputs.htmlCela fonctionne parfaitement pour moi.
la source
J'utilise actuellement cette approche et cela fonctionne comme un charme. L'astuce est que nous obtenons la hauteur du clavier du partir de différentes méthodes sur 21 ci-dessus et ci-dessous, puis nous l'utilisons comme remplissage inférieur de notre vue racine dans notre activité. J'ai supposé que votre mise en page n'avait pas besoin d'un rembourrage supérieur (va sous la barre d'état) mais dans le cas où vous le faites, informez-moi pour mettre à jour ma réponse.
MainActivity.java
N'oubliez pas d'adresser votre vue racine avec un identifiant:
activity_main.xml
J'espère que ça aide quelqu'un.
la source
utilisez uniquement
android:windowSoftInputMode="adjustResize|stateHidden
lorsque vous utilisez AdjustPan, puis désactivez la propriété de redimensionnementla source
la source
basé sur https://stackoverflow.com/a/19494006/1815624 et le désir d'y arriver ...
idée mise à jour
combinant les réponses de
Code pertinent:
Source complète sur https://github.com/CrandellWS/AndroidBug5497Workaround/blob/master/AndroidBug5497Workaround.java
vieille idée
Créer une valeur statique de la hauteur des conteneurs avant d'ouvrir le clavier Définir la hauteur du conteneur en fonction du
usableHeightSansKeyboard - heightDifference
moment où le clavier s'ouvre et la remettre à la valeur enregistrée lors de sa fermetureMéthodes dans MainActivity
Exemple de conteneur XML
de même des marges peuvent être ajoutées si nécessaire ...
Une autre considération est d'utiliser le rembourrage.Un exemple de ceci peut être trouvé à:
https://github.com/mikepenz/MaterialDrawer/issues/95#issuecomment-80519589
la source
1) Créez KeyboardHeightHelper:
2) Laissez votre activité en plein écran:
activity.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
3) Écoutez les changements de hauteur du clavier et ajoutez un rembourrage inférieur pour votre vue:
Ainsi , à chaque fois que le clavier apparaîtra à l'écran, le remplissage inférieur de votre vue changera et le contenu sera réorganisé.
la source
Vous voulez que la barre du bas colle au bas de la vue, mais lorsque le clavier est affiché, ils doivent se déplacer vers le haut pour être placés au-dessus du clavier, non?
Vous pouvez essayer cet extrait de code:
Le BottomBar restera au bas de la vue et le LinearLayout contenant le ScrollView prendra ce qui reste de la vue après l'affichage de la barre supérieure / inférieure et du clavier. Faites-moi savoir si cela fonctionne également pour vous.
la source
Merci Joseph pour ta réponse. Cependant, dans la méthode possiblementResizeChildOfContent (), la partie
ne fonctionnait pas pour moi, car la partie inférieure de la vue est devenue cachée. J'ai donc dû prendre une variable globale restoreHeight, et dans le constructeur, j'ai inséré la dernière ligne
puis j'ai remplacé l'ancienne partie mentionnée par
Mais je ne sais pas pourquoi votre code n'a pas fonctionné pour moi. Ce serait d'une grande aide si quelqu'un pouvait faire la lumière à ce sujet.
la source
J'utilisais uniquement le mode plein écran pour masquer la barre d'état. Cependant, je souhaite que l'application se redimensionne lorsque le clavier est affiché. Toutes les autres solutions (probablement en raison de l'âge du poste) étaient compliquées ou impossibles pour mon utilisation (je veux éviter de changer le code Java pour le sac de PhoneGap Build).
Au lieu d'utiliser le plein écran, j'ai modifié ma configuration pour Android pour qu'elle ne soit pas en plein écran:
Et ajouté le
cordova-plugin-statusbar
, via la ligne de commande:Une fois l'application chargée, j'appelle simplement une méthode sur le plugin pour se cacher, comme:
Cela fonctionne comme un charme. Le seul inconvénient est que la barre d'état est rapidement visible pendant le chargement de l'application. Pour mes besoins, ce n'était pas un problème.
la source
J'ai essayé toutes les réponses possibles de stackOverflow, finalement j'ai résolu après une semaine de recherche longue. J'ai utilisé la disposition des coordonnées et j'ai changé cela avec linearLayout et mon problème est résolu. Je ne sais pas si la disposition des coordonnées a des bogues ou quoi que ce soit de mon erreur.
la source
J'ai essayé de nombreuses solutions, notamment celles de Joseph Johnson et Johan Stuyts. Mais en conséquence, j'ai un espace blanc entre le contenu et le clavier sur certains appareils (comme Lenovo s820) dans tous les cas. J'ai donc apporté quelques modifications à leurs codes et j'ai finalement obtenu une solution fonctionnelle.
Mon idée est basée sur l'ajout d'une marge en haut du contenu lorsque le clavier est affiché.
Comme vous pouvez le voir, j'ajoute 30 px à la différence car il y a un petit espace blanc entre le haut de l'écran et la zone de contenu avec marge. Et je ne sais pas d'où il apparaît, alors j'ai décidé de réduire simplement les marges et maintenant cela fonctionne exactement comme j'avais besoin.
la source
Aujourd'hui, le problème d'ajustement de la taille en mode plein écran ne fonctionne pas pour Android SDK.
À partir des réponses que j'ai trouvées:
la solution - mais la solution montre ce problème sur l'image:
Ensuite, j'ai trouvé la solution et supprimez la seule action inutile:
Alors, consultez mon code de solution fixe sur Kotlin:
Mon code d'implémentation de correction de bogue:
la source
N'utilisez pas:
parce que ça marche mal. Au lieu de cela, utilisez:
la source
Dans mon cas, ce problème a commencé à se produire une fois que j'ai ajouté Crosswalk à mon application Cordova. Mon application n'est pas utilisée en plein écran et sous Android: windowSoftInputMode = "AdjustPan".
J'avais déjà le plugin de clavier ionique dans l'application, donc détecter si le clavier était haut ou bas était facile grâce à lui:
J'ai essayé tous les correctifs ci-dessus, mais la ligne simple qui a fini par le faire pour moi était ce morceau de css:
J'espère que cela vous fera gagner les quelques jours que j'ai passés là-dessus. :)
la source