web-dev-qa-db-fra.com

Faites défiler l'écran vers le haut lorsque le clavier apparaît

J'ai une activité avec un editText au milieu. Lorsque je clique sur editText, le clavier apparaît et l'écran se déplace de sorte que editText se trouve juste au-dessus du clavier, couvrant les autres éléments ci-dessous.

Je ne veux pas redimensionner ni ajouter de remplissage à la mise en page. J'ai juste besoin que l'écran défile vers le haut de la quantité d'espace dont j'ai besoin pour voir aussi les autres trucs ci-dessous. En d'autres termes, je voudrais sélectionner la position du editText lorsque le clavier apparaît. Il suffirait également que l'écran défile complètement, me montrant le bas de la mise en page.

J'ai essayé de mettre la mise en page dans un scrollView en ajoutant ce code sur le editText

    editText.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            //make the view scroll down to the bottom
            scrollView.scrollTo(0, scrollView.getBottom());

        }
    });

mais ça ne marche pas. est-ce que quelqu'un a une idée? Merci d'avance!

22
giangiska

utiliser Android: windowSoftInputMode = "adjustPan"

"adjustResize"

La fenêtre principale de l'activité est toujours redimensionnée pour faire de la place pour le clavier virtuel à l'écran.

"adjustPan"

La fenêtre principale de l'activité n'est pas redimensionnée pour laisser de la place au clavier virtuel. Au contraire, le contenu de la fenêtre est 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. Ceci est généralement moins souhaitable que le redimensionnement, car l'utilisateur peut avoir besoin de fermer le clavier virtuel pour accéder et interagir avec les parties masquées de la fenêtre.

Par exemple dans votre fichier manifeste: -

       <activity
    Android:windowSoftInputMode="adjustPan"
    Android:name=".MainActivity"></activity>

Réponse tardive, mais cela aide sûrement n'importe qui.

29
Ranjith Kumar

J'ai eu un problème similaire une fois, j'ai résolu en utilisant:

    Android:windowSoftInputMode="adjustResize"

dans le fichier AndroidManifest.xml.

Si vous utilisez un RelativeLayout commencez par l'élément du bas qui doit être accroché au bas du parent, puis accrochez l'autre élément au-dessus du précédent.

Si vous utilisez LinearLayout enveloppez-le dans un RelativeLayout et accrochez le LinearLayout à parentBottom.

De cette façon, lorsque le clavier apparaît, vous verrez le bas de votre disposition.

J'espère que cela t'aides.

17
DrChivas

J'ai eu ce problème, j'ai résolu par ce code:

myEdittext.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {

                    myscrollview.postDelayed(new Runnable() {
                        @Override
                        public void run() {
                            View lastChild = myscrollview.getChildAt(myscrollview.getChildCount() - 1);
                            int bottom = lastChild.getBottom() + myscrollview.getPaddingBottom();
                            int sy = myscrollview.getScrollY();
                            int sh = myscrollview.getHeight();
                            int delta = bottom - (sy + sh);
                            myscrollview.smoothScrollBy(0, delta);
                        }
                    }, 200);
                }
            });
8
user6581344

Ça marche pour moi

Android:windowSoftInputMode="stateVisible|adjustResize"

dans androidmanifest pour l'activité

5
Vinayaka Dj

Ajoutez ceci bibliothèque à vos dépendances gradle:

dependencies {
    compile 'net.yslibrary.keyboardvisibilityevent:keyboardvisibilityevent:2.1.0'
}

et utilisez ce code:

KeyboardVisibilityEvent.setEventListener(getActivity(), new KeyboardVisibilityEventListener() {
    @Override
    public void onVisibilityChanged(boolean isOpen) {

        if (isOpen && MY_EDIT_TEXT.hasFocus()) {

            //scroll to last view
            View lastChild = scrollLayout.getChildAt(scrollLayout.getChildCount() - 1);
            int bottom = lastChild.getBottom() + scrollLayout.getPaddingBottom();
            int sy = scrollLayout.getScrollY();
            int sh = scrollLayout.getHeight();
            int delta = bottom - (sy + sh);

            scrollLayout.smoothScrollBy(0, delta);
        }
    }
});
2
Nobody8

Cela marche: -

Il y a un problème avec le défilement vers le haut lorsque le clavier s'ouvre dans Disposition de contrainte. Ne l'utilisez pas.

Pour obtenir "Faites défiler l'écran vers le haut lorsque le clavier apparaît" Essayez ceci

Utilisez Disposition linéaire et ScrollView

et fill_parent en mode Défilement. et tout champ de texte dans la vue de défilement.

<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
   Android:layout_width="match_parent"
   Android:layout_height="match_parent"
   Android:orientation="vertical"
   Android:gravity="center">

<ScrollView xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="fill_parent"
    Android:layout_height="fill_parent"
    Android:fillViewport="true">


</ScrollView>
</LinearLayout>
1
Mindfull Junkies

Cela n'a fonctionné pour moi qu'après être passé de Disposition de contrainte à Disposition linéaire et ajouté

Android:windowSoftInputMode="adjustResize".

et retiré

<item name="Android:windowFullscreen">true</item> du style Activité

0
Helio Bentes