J'ai un Activity
où il y a 5 EditText
s. Lorsque l'utilisateur clique sur le premier EditText
, le clavier virtuel s'ouvre pour y entrer une valeur. Je veux définir View
la visibilité de certains autres sur le Gone
moment où le clavier virtuel s'ouvre et aussi lorsque l'utilisateur clique sur le premier EditText
et aussi lorsque le clavier virtuel se ferme du même EditText
en appuyant sur le bouton arrière. Ensuite, je veux définir View
la visibilité de certains autres sur visible.
Y a-t-il un auditeur, un rappel ou un piratage lorsque le clavier virtuel s'ouvre à partir d'un clic sur le premier EditText
sous Android?
trying to detect the virtual keyboard height in Android.
X
et laY
position tombent sur / au-dessus du clavier =>SecurityException
=> décrémentezY
et réessayez => jusqu'à ce qu'aucune exception ne soit levée => laY
valeur actuelle est la hauteur du clavier. 2. si le clavier n'est pas ouvert => nonSecurityException
.SecurityException
est lancé => le clavier est ouvert. Sinon, le clavier est fermé.EditText
pas pour les autresEditText
. Comment puis-je distinguer cela?Réponses:
Cela ne fonctionne que lorsque
android:windowSoftInputMode
votre activité est définie suradjustResize
dans le manifeste. Vous pouvez utiliser un écouteur de disposition pour voir si la disposition racine de votre activité est redimensionnée par le clavier.J'utilise quelque chose comme la classe de base suivante pour mes activités:
L'exemple d'activité suivant l'utilise pour masquer une vue lorsque le clavier est affiché et l'afficher à nouveau lorsque le clavier est masqué.
La mise en page xml:
Et l'activité:
la source
rootLayout = (ViewGroup) findViewById(R.id.rootLayout);
?Du gâteau avec l'impressionnante bibliothèque KeyboardVisibilityEvent
Crédits pour Yasuhiro SHIMIZU
la source
Comme Vikram l'a souligné dans les commentaires, détecter si le clavier logiciel est affiché ou a disparu n'est possible qu'avec quelques horribles hacks.
Il suffit peut-être de définir un auditeur de focus sur l'edittext :
la source
setOnFocusChangeListener
écouteur sera appelé puis j'appuie sur en arrière puis il ferme le clavier et mais je n'ai pas cliqué sur d'autres vues, maintenant à nouveau je clique sur le même edittext qui a déjà le focus alors que se passera-t-il?onFocusChange()
cela ne sera pas appelé.Pour l'activité:
Pour le fragment:
la source
android:windowSoftInputMode="adjustResize"
manifeste?La réponse de Jaap ne fonctionnera pas pour AppCompatActivity. Au lieu de cela, obtenez la hauteur de la barre d'état et de la barre de navigation, etc. et comparez-la à la taille de la fenêtre de votre application.
Ainsi:
la source
Tu peux l'essayer:
la source
Vous pouvez utiliser ma fonction d'extension Rx (Kotlin).
Exemple:
la source
dip()
etgetScreenHeight()
Le code ci-dessous fonctionne pour moi,
la source
Si vous le pouvez, essayez d'étendre EditText et de remplacer la méthode 'onKeyPreIme'.
Comment pouvez-vous l'étendre:
Je pense que le recalcul de la hauteur de l'écran n'est pas réussi à 100% comme mentionné précédemment. Pour être clair, le remplacement de «onKeyPreIme» n'est pas appelé sur les méthodes «masquer le clavier logiciel par programme», MAIS si vous le faites n'importe où, vous devriez y faire la logique «onKeyboardHidden» et ne pas créer de solutions complètes.
la source
la source
setOnFocusChangeListener
écouteur sera appelé puis j'appuie sur en arrière puis il ferme le clavier et mais je n'ai pas cliqué sur d'autres vues, maintenant à nouveau je clique sur le même edittext qui a déjà le focus alors que se passera-t-il?onfocus
auditeur de temps n'appelle jamais, c'est que je ne regarde pas ce que vous suggérezUtilisez cette classe,
En
Android Manifest
,android:windowSoftInputMode="adjustResize"
est nécessaire.PS - Complètement pris d' ici .
la source
Pour le cas de
adjustResize
et FragmentActivity, la solution acceptée de @Jaap ne fonctionne pas pour moi.Voici ma solution:
la source
Une approche différente serait de vérifier quand l'utilisateur a arrêté de taper ...
Lorsqu'un TextEdit est en focus (l'utilisateur est / était en train de taper), vous pouvez masquer les vues (focus listener)
et utilisez un Handler + Runnable et un écouteur de changement de texte pour fermer le clavier (quelle que soit sa visibilité) et afficher les vues après un certain délai.
La principale chose à surveiller serait le délai que vous utilisez, qui dépendrait du contenu de ces TextEdits.
la source
Ce code fonctionne très bien
utilisez cette classe pour la vue racine:
}
et définissez l'écouteur du clavier en activité ou fragment:
la source
Vous pouvez gérer la visibilité du clavier en remplaçant deux méthodes dans votre activité:
onKeyUp()
etonKeyDown()
plus d'informations dans ce lien: https://developer.android.com/training/keyboard-input/commandsla source
Malheureusement, je n'ai pas une réputation suffisamment élevée pour commenter la réponse de Jaap van Hengstum. Mais j'ai lu quelques commentaires de personnes, ayant le problème qui
contentViewTop
est toujours0
et quionShowKeyboard(...)
est toujours appelé.J'ai eu le même problème et j'ai compris le problème que j'avais. J'ai utilisé un
AppCompatActivity
au lieu d'un «normal»Activity
. Dans ce cas,Window.ID_ANDROID_CONTENT
fait référence à unContentFrameLayout
et non auFrameLayout
avec la valeur supérieure droite. Dans mon cas, c'était bien d'utiliser le `` normal ''Activity
, si vous devez utiliser un autre type d'activité (je viens de tester leAppCompatActivity
, peut-être que c'est aussi un problème avec d'autres types d'activité comme leFragmentActivity
), vous devez accéder auFrameLayout
, qui est un ancêtre duContentFrameLayout
.la source
quand le clavier montre
est vrai, sinon cachez
la source
J'ai un peu modifié la réponse acceptée par Jaap. Mais dans mon cas, il y a peu d'hypothèses telles que
android:windowSoftInputMode=adjustResize
et le clavier n'apparaît pas au début lorsque l'application démarre. Et aussi, je suppose que l'écran en ce qui concerne correspond à la hauteur du parent.contentHeight > 0
cette vérification me permet de savoir si l'écran concerné est masqué ou affiché pour appliquer l'écoute d'événement de clavier pour cet écran spécifique. Je passe également la vue de mise en page de l'écran concernant dansattachKeyboardListeners(<your layout view here>)
laonCreate()
méthode de mon activité principale . Chaque fois que la hauteur de l'écran change, je l'enregistre dans uneprevContentHeight
variable pour vérifier plus tard si le clavier est affiché ou masqué.Pour moi, jusqu'à présent, cela a plutôt bien fonctionné. J'espère que cela fonctionne aussi pour les autres.
la source
La réponse de "Jaap van Hengstum" fonctionne pour moi, mais il n'est pas nécessaire de définir "android: windowSoftInputMode" comme il vient de le dire!
Je l'ai réduit (il détecte maintenant simplement ce que je veux, en fait un événement lors de l'affichage et du masquage du clavier):
et n'oubliez pas d'ajouter ceci
la source
Cela fonctionnera sans qu'il soit nécessaire de modifier votre activité
android:windowSoftInputMode
étape 1: étendez la classe EditText et remplacez ces deux:
étape 2: créez ces deux dans votre activité:
*** rappelez-vous que pour
clearFocus
travailler, vous devez rendre le parent ou le premier enfant de la hiérarchie parent focalisable.la source
Cela ne fonctionne pas comme souhaité ...
... ont vu de nombreux calculs de taille utiliser pour vérifier ...
Je voulais savoir s'il était ouvert ou non et j'ai trouvé
isAcceptingText()
donc cela ne répond vraiment pas à la question car il ne traite pas de l'ouverture ou de la fermeture plutôt que de l'ouverture ou de la fermeture, donc c'est du code associé qui peut aider les autres dans divers scénarios ...
dans une activité
dans un fragment
la source
vérifiez avec le code ci-dessous:
CODE XML:
CODE JAVA:
la source