Déplacer les dispositions vers le haut lorsque le clavier virtuel est affiché?

139

J'ai quelques éléments dans un RelativeView avec l'attribut align bottom défini, lorsque le clavier virtuel apparaît, les éléments sont masqués par le clavier logiciel.

Je voudrais qu'ils se déplacent vers le haut pour que, s'il y a suffisamment d'espace sur l'écran, ils soient affichés au-dessus du clavier, ou pour que la section au-dessus du clavier puisse faire défiler afin que l'utilisateur puisse toujours voir les éléments.

Des idées sur la façon d'aborder cela?

Dinedal
la source
Mise à jour de la référence du blog des développeurs Android
Jayabal
@Dinedal Comment définir l'alignement de l'attribut inférieur sur votre RelativeView ???
KJEjava48

Réponses:

95

Vous pouvez également utiliser ce code dans la onCreate()méthode:

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
Bobs
la source
11
Pour moi, même si je règle AdjustPan screnn move uniquement jusqu'au texte d'édition sur lequel j'ai cliqué mais pas sur toute la mise en page
murt le
33

Ajoutez AndroidManifest.xml pour votre activité:

android:windowSoftInputMode="adjustPan|adjustResize"
Serhii Bohutskyi
la source
22
Selon la documentation, le comportement n'est pas spécifié si vous utilisez ici deux indicateurs "ajuster ...". Voir developer.android.com/guide/topics/manifest/…
user1806772
22

Apportez des modifications à l'activité de votre fichier Manifest comme

windowSoftInputMode="adjustResize"

OU

Apportez des modifications à votre onCreate()méthode dans la classe d'activité comme

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
Jose Kurian
la source
11
Pourquoi utilisez-vous des drapeaux différents?
CoolMind
La version actuelle nécessite le préfixe Android: android: windowSoftInputMode = "AdjustResize"
Andrea Leganza
21

problème similaire auquel je faisais face avec ma mise en page qui consiste en une vue de défilement à l'intérieur. Chaque fois que j'essaie de sélectionner du texte dans EditText, la barre d'action Copier / Couper / Coller est déplacée vers le haut avec le code ci-dessous en tant que telle, elle ne redimensionne pas la mise en page

android:windowSoftInputMode="adjustPan"

En le modifiant comme ci-dessous

1) AndroidManifest.xml

android:windowSoftInputMode="stateVisible|adjustResize"

2) fichier style.xml, en style activité

<item name="android:windowActionBarOverlay">true</item>

Ça a marché.!!!!!!!!!!!!

Ronak Poriya
la source
18

Dans AndroidManifest.xml, n'oubliez pas de définir:

 android:windowSoftInputMode="adjustResize"

et pour RelativeLayout dans ScrollView, définissez:

 android:layout_gravity="center" or android:layout_gravity="bottom" 

ça ira

Zahra.HY
la source
android: layout_gravity = "center" a fonctionné, merci! :) maintenant EditText se déplace sur le clavier comme je le voulais
Pavel Biryukov
11

pour Activity dans sa méthode oncreate, insérer sous la ligne

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

et pour les fragments dans sa méthode onCreate

getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
Rahul_Pawar
la source
10

Il y a 3 étapes à suivre pour faire défiler l'écran vers le haut.

  1. Écrivez dans le fichier manifeste de votre activité:

android: windowSoftInputMode = "AdjustResize"

  1. Ajoutez la ligne suivante dans la méthode oncreate () de votre activité

getWindow (). setSoftInputMode (WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);

  1. Ensuite, placez votre vue entière dans "Scrollview" dans un fichier XML comme:
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:background="@drawable/bg"
    android:layout_height="match_parent" 
    > 
    <RelativeLayout
         android:layout_width="fill_parent"
        android:layout_height="match_parent"
        android:layout_gravity="center" >
        <TextView />
         .........
        <TextView />
        <EditText >
            <requestFocus />
        </EditText>
        <Button />
    </RelativeLayout>
 </ScrollView>

PS N'oubliez pas d'ajouter android: layout_gravity = "center" dans la disposition relative parent.

Heena Arora
la source
6

J'ai essayé une méthode de Diego Ramírez, ça marche. Dans AndroidManifest:

    <activity
        android:name=".MainActivity"
        android:windowSoftInputMode="stateHidden|adjustResize">
        ...
    </activity>

Dans activity_main.xml:

<LinearLayout ...
    android:orientation="vertical">

<Space
    android:layout_width="wrap_content"
    android:layout_height="0dp"
    android:layout_weight="1" />

<EditText
    android:id="@+id/edName"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:ems="10"
    android:hint="@string/first_name"
    android:inputType="textPersonName" />

<EditText ...>
...
</LinearLayout>
CoolMind
la source
6
<activity name="ActivityName"
    android:windowSoftInputMode="adjustResize">
    ...
</activity>

Ajoutez NestedScrollView autour de la mise en page que vous souhaitez faire défiler, cela fonctionnera parfaitement

Prakash Reddy
la source
3

J'ai trouvé une solution à mes problèmes qui est à peu près la même que la vôtre.

Tout d'abord, je n'ai qu'un LinearLayout avec 2 éléments, un ImageView et un LinearLayout qui contient 2 EditText et un Button, donc je devais les garder séparés en plein écran sans clavier, et quand le clavier apparaît, ils devraient regarder de plus près.

J'ai donc ajouté la vue entre eux avec l'attribut height en 0dp et weight 1, ce qui m'a permis de garder mes vues séparées l'une de l'autre. et lorsque le clavier apparaît, comme il n'a pas de hauteur fixe, il se redimensionne simplement et conserve l'aspect.

Voila! Le redimensionnement de la disposition et la distance entre mes vues sont les mêmes lorsque le clavier est ou non présent.

Diego Ramírez Vásquez
la source
6
Pourquoi ne publiez-vous pas le code pour une meilleure compréhension?
johnkarka
J'ai posté un exemple de code ci-dessus: stackoverflow.com/a/31994697/2914140 .
CoolMind
vous pouvez y parvenir de manière moins piratée en utilisant a ConstraintLayoutet en épinglant une section supérieure en haut et une section inférieure en bas. Lorsque le clavier s'ouvre, il se redimensionnera naturellement en comprimant l'espace au milieu (si vous l'utilisez adjustResize)
hmac
2
If user want this task using manifest then add this line in manifest
In manifest add this line: - android:windowSoftInputMode="adjustPan"
    e.g.
     <activity
           android:name=".ui.home.HomeActivity"
           android:screenOrientation="portrait"
           android:windowSoftInputMode="adjustPan">
     </activity>


    In Java File or Kotlin File(Programically) : - If user want this using Activity then add below line in onCreate Method

    activity!!.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
safal bhatia
la source
Bonjour et bienvenue sur stackoverflow, et merci pour votre réponse. Plutôt que de simplement publier un bloc de code, pouvez-vous expliquer brièvement quel est le problème que vous avez résolu et comment vous l'avez résolu? Cela aidera les personnes qui trouveront cette question à l'avenir à mieux comprendre le problème et comment y faire face.
Plutian
1

Voici le code manifeste complet

<activity
        android:name=".activities.MainActivity"
        android:windowSoftInputMode="adjustResize"
        android:label="@string/app_name">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
Dantalian
la source
1

si vous êtes dans des fragments, vous devez ajouter le code ci-dessous à votre onCreate sur votre activité, cela résout le problème pour moi

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
Pratik Mohanrao Gondil
la source
1

Dans votre fichier manifeste, ajoutez la ligne ci-dessous. Ça va marcher

<activity name="MainActivity"
    android:windowSoftInputMode="stateVisible|adjustResize">
    ...
</activity>
Shivam Garg
la source
1

Je viens d'ajouter la ligne suivante à la mise en page de niveau supérieur et tout a fonctionné:

android:fitsSystemWindows="true"
Darush
la source
@ yash786 est peut-être un bouton d'affichage sous edittext qui reçoit un focus? Deuxième question pouvez-vous partager votre fichier de mise en page ou me répondre comment vous ajoutez edittext au dessus du clavier?
Heroes84
cela fonctionne pour moi événement sans Android: windowSoftInputMode = "stateVisible | AdjustResize"
zoom
0

D'accord, c'est très tard, mais j'ai découvert que si vous ajoutez une vue de liste sous votre texte d'édition, le clavier déplacera toutes les mises en page sous cet edittext sans déplacer la vue de liste.

<EditText
android:id="@+id/et"
android:layout_height="match_parent"
android:layout_width="match_parent"



/>

<ListView
    android:layout_width="match_parent"
    android:layout_height="match_parent"//can make as 1dp
    android:layout_below="@+id/et" // set to below editext
    android:id="@+id/view"
    >
**<any layout**

C'est la seule solution qui a fonctionné pour moi.

Omar Boshra
la source
0

Pas un seul conseil ne résout mon problème. Ajuster le panoramique ressemble presque au travail Ajuster le redimensionner . Si je ne règle rien à la mise en page, je ne bouge pas vers le haut, mais cela masque mon texte édité en bas que j'écris correctement. Donc, après 24 heures de recherche continue, j'ai trouvé cette source et cela résout mon problème.

Mahbubur Rahman Khan
la source
0

Il est peut-être tard mais je veux ajouter quelques éléments. Dans Android Studio version 4.0.1 et Gradle version 6.1.1, le windowSoftInputMode ne fonctionnera pas comme prévu si vous ajoutez les indicateurs suivants dans votre activité:

getWindow().setFlags(
                WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS,
                WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS
        );

Après avoir perdu beaucoup de temps, j'ai trouvé ce hack. Pour que adjustResizeou AdjustPanou tout attribut de windowSoftInputModefonctionne correctement, vous devez le supprimer de votre activité.

Shehryar Aɱɩŋ
la source