web-dev-qa-db-fra.com

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

J'ai quelques éléments dans une vue relative avec l'ensemble d'attributs d'alignement du bas; lorsque le clavier logiciel s'affiche, les éléments sont masqués par le clavier logiciel.

Je voudrais qu'ils montent de sorte que, s'il y a suffisamment d'espace à l'écran, ils soient affichés au-dessus du clavier, ou que la section au-dessus du clavier puisse défiler pour que l'utilisateur puisse toujours voir les éléments.

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

107
Dinedal

Oui, consultez cet article sur le site du développeur Android qui décrit comment le framework traite le clavier virtuel qui apparaît.

L'attribut Android:windowSoftInputMode peut être utilisé pour spécifier ce qui se passe activité par activité: si la mise en page est redimensionnée ou défile, etc.

83
Christopher Orr

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

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

Ajoutez le fichier AndroidManifest.xml pour votre activité:

Android:windowSoftInputMode="adjustPan|adjustResize"
30
Serhii Bohutskyi

Modifiez l’activité de votre fichier Manifest comme 

windowSoftInputMode="adjustResize"

OU

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

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
20
Jose Kurian

problème similaire que je faisais face avec ma mise en page qui consistent en vue de défilement à l'intérieur . Lorsque 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, dans le style d'activité

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

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

14
Ronak Poriya

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

9
Zahra.HY

pour l'activité dans son insertion de méthode oncreate au-dessous de la ligne 

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

et pour des fragments dans sa méthode onCreate 

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

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

  1. Ecrivez dans le fichier manifeste de votre activité:

Android: windowSoftInputMode = "ajuster-redimensionner"

  1. Ajouter 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. Puis 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>

P.S. N'oubliez pas d'ajouter Android: layout_gravity = "center" dans la disposition parent.

5
Heena Arora

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>
4
CoolMind

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 contenant 2 EditText et un Button. J’avais donc besoin de les garder séparés en plein écran sans clavier et, lorsque le clavier apparaît, ils devraient être plus proches.

J'ai donc ajouté la vue entre eux avec l'attribut height dans 0dp et weight 1, ce qui me permet de garder mes vues séparées l'une de l'autre. et quand le clavier semble avoir une hauteur fixe, il ne fait que redimensionner et garder l’aspect.

Voila! La mise en page est redimensionnée et la distance entre mes vues est la même lorsque le clavier est absent ou non.

3

Voici le code complet du manifeste

<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
Dantalian

si vous êtes en 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>
0
Shivam Garg

Très bien, c'est très tard, mais j'ai découvert que si vous ajoutez une vue liste sous votre texte d'édition, le clavier déplacera toutes les mises en page sous cet edittext sans déplacer la 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
Omar Ahmed

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

Android:fitsSystemWindows="true"
0
Darush

 enter image description here

Here is the solution for this fix
- Android:windowSoftInputMode="adjustResize" in Manifest File
- Make a class "CommentKeyBoardFix.Java" and copy and paste the below code.

public class CommentKeyBoardFix
{
private View mChildOfContent;
private int usableHeightPrevious;
private FrameLayout.LayoutParams frameLayoutParams;
private Rect contentAreaOfWindowBounds = new Rect();

public CommentKeyBoardFix(Activity activity)
{
    FrameLayout content = activity.findViewById(Android.R.id.content);
    mChildOfContent = content.getChildAt(0);
    mChildOfContent.getViewTreeObserver().addOnGlobalLayoutListener(this::possiblyResizeChildOfContent);
    frameLayoutParams = (FrameLayout.LayoutParams) mChildOfContent.getLayoutParams();
}

private void possiblyResizeChildOfContent()
{
    int usableHeightNow = computeUsableHeight();
    if (usableHeightNow != usableHeightPrevious)
    {
        int heightDifference = 0;
        if (heightDifference > (usableHeightNow /4))
        {
            // keyboard probably just became visible
            frameLayoutParams.height = usableHeightNow - heightDifference;
        }
        else
        {
            // keyboard probably just became hidden
            frameLayoutParams.height = usableHeightNow;
        }
        mChildOfContent.layout(contentAreaOfWindowBounds.left, contentAreaOfWindowBounds.top, contentAreaOfWindowBounds.right, contentAreaOfWindowBounds.bottom);
        mChildOfContent.requestLayout();
        usableHeightPrevious = usableHeightNow;
    }
}

private int computeUsableHeight()
{
    mChildOfContent.getWindowVisibleDisplayFrame(contentAreaOfWindowBounds);
    return contentAreaOfWindowBounds.height();
}
}

And then call this class in your Activity or Fragment
setContentView(R.layout.your_comments_layout)
CommentKeyBoardFix(this) ---> For Kotlin
or
new CommentKeyBoardFix(this) ---> For Java
0
yash786