Android: Comment empêcher le clavier logiciel de pousser ma vue vers le haut?


386

J'ai un tiroir coulissant vertical au bas de mon application. Lorsque le clavier virtuel s'ouvre, il pousse la languette du tiroir vers le haut, de sorte qu'il se trouve au sommet du clavier. En fait, je veux qu'il reste en bas de l'écran, devenant masqué lorsque le clavier est affiché.

Quelqu'un d'autre se heurte à ce problème? Vous savez comment le réparer?


1
salut, j'ai le même problème que le drapeau que vous avez utilisé dans le fichier manifeste, pouvez-vous m'aider avec cela
Nixit Patel

1
Cette question est dupliquée ici: stackoverflow.com/questions/5516216/…
WonderWorker

Réponses:


656

Vous pouvez simplement changer le windowSoftInputModedrapeau de votre activité adjustPandans votre AndroidMainfest.xmlfichier à l'intérieur de votre balise d'activité.

Consultez la documentation officielle pour plus d'informations.

<activity
   ...
   android:windowSoftInputMode="adjustPan"> 
</activity>

43
Je ne veux pas que la vue panoramique, je veux qu'elle reste statique où elle est, et que le clavier couvre tout ce qu'il va couvrir.
Christopher Perry

5
En faisant un panoramique, cela signifie que la vue défilera pour rendre visible la vue dans laquelle vous tapez. En d'autres termes, si le clavier qui vient d'apparaître n'a pas masqué la vue focalisée, il restera statique.
Alexander Oleynikov

18
Je fais face au même problème. a fait l'indicateur windowSoftInputMode pour "adjustPan" dans le fichier manifeste. mais ne fonctionne pas. comment le résoudre
Subrat

20
N'aide pas dans mon cas d'avoir une rangée de boutons en bas de l'écran et un ScrollView au-dessus d'eux. Les boutons sont poussés vers le haut, quelle que soit la valeur de windowSoftInputMode.
Artem Russakovskii

3
ne fonctionne pas dans un fragment. Comment le faire en fragment?
Prashanth Debbadwar

175

Aucune des réponses n'a fonctionné pour moi, mais cela a fait l'affaire:

android:windowSoftInputMode="adjustNothing"

6
Cela fait apparaître le clavier en superposition de contenu, sans faire de mise en page pour recalculer sa hauteur.
Reinherd

13
Cela résout le problème du clavier poussant le contenu vers le haut, ce qui est ce que moi et l'OP voulions atteindre.
Daniel Douglas

8
emprunt à @Dom que vous pouvez utiliser getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING);pour définir cette valeur par programme
Bron Davies

1
Celui-ci fonctionne pour moi, contrairement aux autres réponses (jelly bean 4.1)
Virus721

Parfait! Cela fonctionne également dans mon cas. Je montre une boîte de dialogue contenant un edittext à l'intérieur. Dès que la boîte de dialogue s'ouvre, le clavier apparaît également. J'ai essayé "adjustPan", mais il a bloqué la fonction d'apparition du clavier. Donc, "adjustNothing" a mieux fonctionné dans mon cas.
sembozdemir

85

Dans mon cas, la raison pour laquelle les boutons ont été poussés était parce que la vue au-dessus d'eux était un ScrollView, et elle s'est effondrée avec les boutons poussés au-dessus du clavier, quelle que soit la valeur que android:windowSoftInputModeje définissais.

J'ai pu éviter que ma rangée inférieure de boutons ne soit poussée vers le haut par le clavier virtuel en définissant android:isScrollContainer="false"celui ScrollViewqui se trouve au-dessus des boutons.


2
Mais dans ce cas, le clavier virtuel couvre une partie de l'écran et il n'y a aucun moyen de faire défiler vers le bas. Il semble qu'il n'y ait qu'une seule façon d'empêcher le panneau inférieur de s'afficher en haut du clavier - le cacher lorsque le clavier est ouvert ...
Dmitry

1
Ça y est! Ce paramètre est à mon avis très intéressant à remarquer, comme c'est le seul moyen que j'ai trouvé pour obtenir les effets de la propriété manquante "adjustNothing"!
rupps

Je l'utilise avec Textview Working great tnx
Sunil Chaudhary

2
@Artem Russakovskii Je ne sais pas qui vous êtes, mais je vous aime pour cette solution. Merci beaucoup.
Lev

1
@Artem Russakovskii cela fonctionne parfaitement. Merci beaucoup.
SkypeDogg

72

Vous pouvez essayer d'ajouter cet attribut dynamiquement, en plaçant le code suivant dans la onCreateméthode de votre activité:

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

Cela a fonctionné pour moi, mais cela:

android:windowSoftInputMode="adjustPan"

n'a pas.


Avez-vous ajouté le android:windowSoftInputMode="adjustPan"fichier dans AndroidManifest.xml?
Habeeb Perwad

Non, car cela n'a pas vraiment fait de différence pour moi. La première ligne de code a fait l'affaire. :) @HabeebPerwad
Dom

J'ai ajouté la ligne des secondes dans le fichier AndoidManifest.xml. Je pense qu'après cela, cela a fonctionné. donc juste demandé.
Habeeb Perwad

1
@Dom, comment utiliser " getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING);" dans un fragment?
Tushar Gogna

1
Finalement! Cela marche! J'avais un contrôleur (s'étend de FragmentActivity) et quelques vues attachées à lui (les vues s'étendent de RelativeLayout). Donc, dans la vue gênante, j'ai fait controller.getWindow()...comme vous l'avez dit. Œuvres
Alaa M.

39

Ces réponses ici ne m'ont pas aidé. J'ai donc essayé ceci:

android:windowSoftInputMode="adjustResize"

Cela a fonctionné comme un charme, maintenant l'en-tête de mon application ne disparaît pas. C'est plus lisse.


Cela fonctionne presque parfaitement pour moi. Le seul problème est que la barre / ligne de suggestion du clavier cache toujours ma disposition. Avez-vous rencontré un tel problème?
Sufian

Je n'ai pas rencontré ce problème. @Sufian
amalBit

Je n'avais rencontré aucun problème à l'époque. Maintenant, je ne suis pas sûr. @Sufian
amalBit

Pour ceux qui peuvent faire face à un problème similaire, cela était probablement dû à TabLayout. Le problème a disparu une fois que j'ai défini sa visibilité sur View.GONE. Il serait peut-être temps de repenser ma mise en page.
Sufian

13

Pour faire cela par programme dans un fragment, vous pouvez utiliser le code suivant

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

Placez ceci dans onResume ()


11

Pour les futurs lecteurs.

Je voulais un contrôle spécifique sur ce problème, alors voici ce que j'ai fait:

À partir d'un fragment ou d'une activité, masquez vos autres vues (qui ne sont pas nécessaires lorsque le clavier est en place), puis restaurez-les pour résoudre ce problème:

            rootView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
                @Override
                public void onGlobalLayout() {
                    Rect r = new Rect();
                    rootView.getWindowVisibleDisplayFrame(r);
                    int heightDiff = rootView.getRootView().getHeight() - (r.bottom - r.top);

                    if (heightDiff > 100) { // if more than 100 pixels, its probably a keyboard...
                    //ok now we know the keyboard is up...
                        view_one.setVisibility(View.GONE);
                        view_two.setVisibility(View.GONE);

                    }else{
                    //ok now we know the keyboard is down...
                        view_one.setVisibility(View.VISIBLE);
                        view_two.setVisibility(View.VISIBLE);

                    }
                }
            });

1
@Skynet Vous avez absolument raison! C'était une solution personnalisée que j'ai utilisée pour mon propre problème.
Petro

7
Hé, c'était génial. Cependant, lorsque le clavier est fermé, il y a une courte période (millisecondes) pendant laquelle la vue passe à visible. Donc, au lieu de définir directement la visibilité, j'ai utilisé view.post(Runnable runnable)et défini la visibilité à partir de là. Cela s'est avéré super pour moi
daisura99

9

Une seule ligne à ajouter ...

Ajoutez l' android:windowSoftInputMode="stateHidden|adjustPan"activité requise de votre manifest file.

Je viens de me résoudre :) :)


8

Pour les utilisateurs de xamarin, ajoutez ce code à l'attribut Activity de la classe MainActivity,

WindowSoftInputMode =Android.Views.SoftInput.AdjustNothing

ou vous pouvez ajouter ce code Window.SetSoftInputMode(Android.Views.SoftInput.AdjustNothing)à la méthode OnCreate de la classe MainActivity.


8

Celui-ci a fonctionné pour moi

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING);

7

Jusqu'à présent, les réponses ne m'ont pas aidé car j'ai un bouton et un champ textInput (côte à côte) en dessous de textView qui continuait à être caché par le clavier, mais cela a résolu mon problème:

android:windowSoftInputMode="adjustResize"

7

Ajoutez le code suivant à «l'activité» du fichier manifeste.

android:windowSoftInputMode="adjustResize"

Cela fonctionne bien. Cependant, juste pour vous conseiller, cela ne fonctionne pas bien lorsque vous utilisez pour cent. Parce qu'il réajuste certains éléments. Donc, si vous avez des éléments Contraintes avec pourcentage, vous aurez un problème. Utilisez plutôt wrap_content et cela fonctionnera très bien.
Thiago Silva


6

Ce fut le meilleur qui a fonctionné pour moi

android:windowSoftInputMode="adjustNothing"

Essayez!


4

Eh bien, j'ai regardé ces réponses, mais dans mon cas, je suis tombé dans le même problème et j'ai trouvé refuge grâce à une solution très pratique et plus simple qui consiste à mettre un très petit attribut innocent dans votre balise Scrollview résidant dans votre fichier xml. C'est

android:isScrollContainer="false"

Bonne chance!


4
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);

Celui-ci fonctionne pour moi.


2

Pour la vue de défilement:

si après avoir ajouté android:windowSoftInputMode="stateHidden|adjustPan"votre manifeste Android et ne fonctionne toujours pas.

Il peut être affecté car lorsque le clavier apparaît, il sera dans une vue de défilement et si votre bouton / aucun objet n'est pas dans votre vue de défilement, les objets suivront le clavier et bougeront sa position.

Vérifiez votre xml où se trouve votre bouton et assurez-vous qu'il se trouve sous votre support de défilement et non en dehors.

J'espère que cela vous aidera. :RÉ


2

Dans mon cas, j'avais besoin que le clavier reste caché et juste après le clic du bouton, ma disposition doit être ajustée, alors j'ai juste ajouté cette commande dans le manifeste et elle est devenue très juste.

android:windowSoftInputMode="stateHidden|adjustResize"

2

Lorsque vous souhaitez masquer la vue lorsque vous ouvrez le clavier.

Ajoutez ceci dans votre activité dans le fichier manifeste

android:windowSoftInputMode="stateHidden|adjustPan"

2

Aucun d'eux n'a fonctionné pour moi, essayez celui-ci

 private void scrollingWhileKeyboard() {
    drawerlayout.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {

            Rect r = new Rect();
            try {
                drawerlayout.getWindowVisibleDisplayFrame(r);
                int screenHeight = drawerlayout.getRootView().getHeight();
                int keypadHeight = screenHeight - r.bottom;
                if (keypadHeight > screenHeight * 0.15) {
                    tabLayout.setVisibility(View.GONE);
                } else {
                    tabLayout.setVisibility(View.VISIBLE);
                }
            } catch (NullPointerException e) {

            }
        }
    });

}

1

La fenêtre principale de l'activité ne sera pas redimensionnée pour laisser de la place au clavier virtuel. Au contraire, le contenu de la fenêtre sera automatiquement balayé afin que le focus actuel ne soit jamais masqué par le clavier et que les utilisateurs puissent toujours voir ce qu'ils tapent.

android:windowSoftInputMode="adjustPan"

Cela pourrait être une meilleure solution pour ce que vous vouliez.


1

Essayez d'utiliser ceci:

android:windowSoftInputMode="stateHidden|adjustPan"

1

Ce code peut vous aider. Utilisez-le dans votre oncreateméthode.

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

J'ai essayé mais j'ai des problèmes où la vue coupe un peu la partie inférieure de la vue et pousse la vue pour superposer l'heure ci-dessus? Avez-vous des idées sur la mise en page qui change ou sur ce qui est nécessaire? stackoverflow.com/questions/39909897/…
Lion789

1

Inclure dans votre fichier manifeste sous l'activité que vous souhaitez afficher. Mais assurez-vous de ne pas utiliser l'activité plein écran

android:windowSoftInputMode="adjustPan"

1

@manifest dans votre activité:

android:windowSoftInputMode="stateAlwaysHidden|adjustPan"

1

J'ai résolu mon problème en ajoutant

 android:windowSoftInputMode="adjustNothing" 

Dans le fichier manifeste, ajoutez.

et rendre la contrainte Recyclerviews isScrollContainer à false.

android:isScrollContainer="false"
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.