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?


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);

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


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);

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é.!!!!!!!!!!!!


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


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);

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.


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>

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


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.


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);

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>

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);

1

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

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

1

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

android:fitsSystemWindows="true"

@ 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.


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.


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é.

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.