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?

Christopher Perry
la source
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>
Alexander Oleynikov
la source
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"
Daniel Douglas
la source
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.

Artem Russakovskii
la source
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.

Dom
la source
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.

amalBit
la source
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 ()

ChaturaM
la source
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);

                    }
                }
            });
Petro
la source
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 :) :)

Sravani
la source
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.

Tushar patel
la source
8

Celui-ci a fonctionné pour moi

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING);
Suresh Pattu
la source
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"
Michael McDowell
la source
7

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

android:windowSoftInputMode="adjustResize"
Jose Kurian
la source
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
7
android:windowSoftInputMode="stateHidden|adjustNothing"

Ce code fonctionne.

amyShamna
la source
Je pense que android: windowSoftInputMode = "stateHidden | adjustPan" devrait également fonctionner.
Arthur Sady Cordeiro Rossetti
6

Ce fut le meilleur qui a fonctionné pour moi

android:windowSoftInputMode="adjustNothing"

Essayez!

rajlaxmi_jagdale
la source
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!

Ali Nawaz
la source
4
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);

Celui-ci fonctionne pour moi.

Zhang Slardar
la source
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É

Yils
la source
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"
Rafael Rodrigues
la source
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"
Hakim Khan
la source
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) {

            }
        }
    });

}
Saljith Kj
la source
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.

user3243900
la source
1

Essayez d'utiliser ceci:

android:windowSoftInputMode="stateHidden|adjustPan"
Ashish Gautam
la source
1

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

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
Shiv prakash Yadav
la source
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"
user3419461
la source
1

@manifest dans votre activité:

android:windowSoftInputMode="stateAlwaysHidden|adjustPan"
Juan Mendez
la source
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"
MILLION GASHAW
la source