Comment ajuster la disposition lorsque le clavier virtuel apparaît

164

Je voudrais ajuster / redimensionner la disposition lorsque le clavier virtuel est activé, comme ci-dessous:

Avant et après:

entrez la description de l'image icientrez la description de l'image ici


Quelques ressources trouvées dans SO:

  1. Comment garder tous les champs et textes visibles pendant que le clavier virtuel est affiché
  2. Le clavier logiciel Android gâche la disposition lorsqu'il apparaît
  3. Ajuster la disposition lorsque le clavier virtuel est activé

Mais les questions & réponses sont plutôt ambiguës, voici la question avec une image plus claire de ce que je veux.

Exigences:

  • Cela devrait fonctionner sur un téléphone avec toutes les tailles d'écran.
  • A noté que la marge / espace de remplissage à «FACEBOOK» et «Inscription à Facebook» a changé avant et après.
  • Aucune vue de défilement n'est impliquée.
Roy Lee
la source
3
Il convient également de rappeler que le redimensionnement ne fonctionne pas en plein écran ( Theme.AppCompat.Light.NoActionBar.FullScreen), selon cette réponse -> stackoverflow.com/a/7509285/1307690
Roman Nazarevych

Réponses:

202

Il suffit d'ajouter

android:windowSoftInputMode="adjustResize"

dans votre AndroidManifest.xml où vous déclarez cette activité particulière et cela ajustera l'option de redimensionnement de la mise en page.

entrez la description de l'image ici

un peu de code source ci-dessous pour la conception de la mise en page

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="20dp"
        android:text="FaceBook"
        android:textAppearance="?android:attr/textAppearanceLarge" />

    <EditText
        android:id="@+id/editText1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/textView1"
        android:layout_marginTop="30dp"
        android:ems="10"
        android:hint="username" >

        <requestFocus />
    </EditText>

    <EditText
        android:id="@+id/editText2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/editText1"
        android:layout_marginTop="20dp"
        android:ems="10"
        android:hint="password" />

    <Button
        android:id="@+id/button1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/editText2"
        android:layout_centerHorizontal="true"
        android:layout_marginLeft="18dp"
        android:layout_marginTop="20dp"
        android:text="Log In" />

    <TextView
        android:id="@+id/textView2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_marginTop="17dp"
        android:gravity="center"
        android:text="Sign up for facebook"
        android:textAppearance="?android:attr/textAppearanceLarge" />

</RelativeLayout>
Venkatesh S
la source
2
+1 C'est simple? Des conditions supplémentaires? De quelle image avez-vous posté?
Roy Lee
2
amis juste pour montrer alignparentbottom = "true" si l'écran n'est pas ajusté correctement .. d'où j'ai placé cette image ami
Venkatesh S
Très bonne réponse en effet. Merci pour l'aide, mon pote. Content que tu sois venu.
Roy Lee
9
Ami, il semble que seul le TextView avec "Inscrivez-vous à Facebook" s'est ajusté lorsque le clavier logiciel est activé, les autres restent inchangés. J'espère que d'autres pourront également s'adapter. Une solution de contournement? Et toute la mise en page devrait être au centre avant l'activation du clavier,
Roy Lee
1
Existe-t-il un moyen de donner un rembourrage supplémentaire quand il ajusteResize? Actuellement, il est redimensionné afin que le bas du curseur de texte s'aligne EXACTEMENT avec le bas de l'écran. Je veux avoir un espace supplémentaire de 5dp sous le curseur de texte visible.
Noitidart
39

Cette question a été posée il y a quelques années et "Secret Andro Geni" a une bonne explication de base et "tir38" a également fait une bonne tentative sur la solution complète, mais hélas il n'y a pas de solution complète affichée ici. J'ai passé quelques heures à comprendre les choses et voici ma solution complète avec des explications détaillées en bas:

<?xml version="1.0" encoding="utf-8"?>
<ScrollView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fillViewport="true">

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="10dp">

        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_above="@+id/mainLayout"
            android:layout_alignParentTop="true"
            android:id="@+id/headerLayout">

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_centerVertical="true"
                android:gravity="center_horizontal">

                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:id="@+id/textView1"
                    android:text="facebook"
                    android:textStyle="bold"
                    android:ellipsize="marquee"
                    android:singleLine="true"
                    android:textAppearance="?android:attr/textAppearanceLarge" />

            </LinearLayout>

        </RelativeLayout>

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_centerVertical="true"
            android:id="@+id/mainLayout"
            android:orientation="vertical">

            <EditText
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:id="@+id/editText1"
                android:ems="10"
                android:hint="Email or Phone"
                android:inputType="textVisiblePassword">

                <requestFocus />
            </EditText>

            <EditText
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="10dp"
                android:id="@+id/editText2"
                android:ems="10"
                android:hint="Password"
                android:inputType="textPassword" />

            <Button
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="10dp"
                android:id="@+id/button1"
                android:text="Log In"
                android:onClick="login" />

        </LinearLayout>

        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:layout_below="@+id/mainLayout"
            android:id="@+id/footerLayout">

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_alignParentBottom="true">

                <RelativeLayout
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content">

                    <TextView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:id="@+id/textView2"
                        android:text="Sign Up for Facebook"
                        android:layout_centerHorizontal="true"
                        android:layout_alignBottom="@+id/helpButton"
                        android:ellipsize="marquee"
                        android:singleLine="true"
                        android:textAppearance="?android:attr/textAppearanceSmall" />

                    <Button
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_alignParentRight="true"
                        android:id="@+id/helpButton"
                        android:text="\?"
                        android:onClick="help" />

                </RelativeLayout>

            </LinearLayout>

        </RelativeLayout>

    </RelativeLayout>

</ScrollView>

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

android:windowSoftInputMode="adjustResize"

sur l' <activity>étiquette que vous voulez une telle mise en page.

Pensées:

J'ai réalisé que ce RelativeLayoutsont les dispositions qui couvrent tout l'espace disponible et qui sont ensuite redimensionnées lorsque le clavier apparaît.

Et ce LinearLayoutsont des mises en page qui ne sont pas redimensionnées lors du processus de redimensionnement.

C'est pourquoi vous devez en avoir 1 RelativeLayoutimmédiatement après ScrollViewpour couvrir tout l'espace d'écran disponible. Et vous devez avoir un LinearLayoutintérieur pour RelativeLayoutque votre intérieur soit écrasé lorsque le redimensionnement se produit. Un bon exemple est "headerLayout". S'il n'y avait pas de contenu à l' LinearLayoutintérieur, le RelativeLayouttexte "facebook" serait écrasé et ne serait pas affiché.

Dans les images de connexion "facebook" publiées dans la question, j'ai également remarqué que toute la partie de connexion (mainLayout) est centrée verticalement par rapport à tout l'écran, d'où l'attribut:

android:layout_centerVertical="true"

sur la LinearLayoutmise en page. Et parce que mainLayout est à l'intérieur d'un, LinearLayoutcela signifie que cette partie n'est pas redimensionnée (voir à nouveau l'image en question).

Yani2000
la source
1
Fonctionne comme un charme !! mais le pied de page est collé au bas de la mise en page, ce qui n'est pas beau. comment éviter de coller le pied de page en bas! au lieu de cela, si je veux donner une marge au pied de page pour que la mise en page soit bonne. J'ai apporté quelques modifications en donnant l'attribut layout_margin à la disposition relative du pied de page, mais avec cela, il couvre la dernière moitié du texte d'édition. Plz aidez-moi.
Tara
En RelativeLayout avec @ + id / footerLayout vous avez un LinearLayout qui a cet attribut: android:layout_alignParentBottom="true". Cela le fait coller au fond.
Yani2000
oui, en gardant à l'esprit que, je vous ai demandé comment faire des arrangements des composants de pied de page qui devraient avoir une marge inférieure d'au moins 10dp ou 15dp
Tara
Je n'ai aucune idée de ce dont vous parlez. Je viens de tester cela moi-même en donnant android:layout_marginBottom="15dp"à footerLayout , puis à RelativeLayout qui contient textView2 et helpButton . Dans les deux cas, helpButton est écrasé (même sans l'attribut marginBottom). En aucun cas, editText1 ou editText2 ne sont jamais écrasés, car ils sont à l'intérieur d'un LinearLayout . Avez-vous peut-être défini une marge sur une autre mise en page (pas seulement footerLayout )? Essayez à partir de zéro si vous n'allez nulle part! Vous pouvez également jouer avec l' android:windowSoftInputModeattribut dans AndroidManifest.
Yani2000
1
"Et LinearLayout sont des mises en page qui ne sont pas redimensionnées lors du processus de redimensionnement." - c'est une information vraiment utile.
cylon
26

Ajoutez cette ligne dans votre manifeste où votre activité est appelée

android:windowSoftInputMode="adjustPan|adjustResize"

ou

vous pouvez ajouter cette ligne dans votre onCreate

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE|WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
Ashish Jaiswal
la source
7
Vous ne devez jamais utiliser à la fois adjustPanet adjustResize. Ce sont des modes différents. Pour en savoir plus, cliquez ici: stackoverflow.com/a/17410528/1738090 Et ici: developer.android.com/guide/topics/manifest/activity-element
w3bshark
14

Le développeur Android a la bonne réponse, mais le code source fourni est assez détaillé et n'implémente pas réellement le modèle décrit dans le diagramme.

Voici un meilleur modèle:

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:fillViewport="true">

    <RelativeLayout android:layout_width="match_parent"
                    android:layout_height="match_parent">

        <LinearLayout android:layout_width="match_parent"
                      android:layout_height="wrap_content"
                      android:orientation="vertical">

                <!-- stuff to scroll -->

        </LinearLayout>

        <FrameLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true">

            <!-- footer -->

        </FrameLayout>

    </RelativeLayout>

</ScrollView>

C'est à vous de décider quelles vues vous utilisez pour les parties "défilement" et "pied de page". Sachez également que vous avez probablement de régler le ScrollViews fillViewPort .

tir38
la source
J'ai essayé de suivre votre solution, mais en utilisant deux LinearLayouts au lieu du cadre et du relatif, mais toutes les vues sont toujours au-dessus l'une de l'autre.
Henrique de Sousa
14

Cela peut fonctionner pour tout type de mise en page.

  1. ajoutez ceci à votre balise d'activité dans AndroidManifest.xml

android: windowSoftInputMode = "AdjustResize"

par exemple:

<activity android:name=".ActivityLogin"
    android:screenOrientation="portrait"
    android:theme="@style/AppThemeTransparent"
    android:windowSoftInputMode="adjustResize"/>
  1. ajoutez ceci sur votre balise de mise en page dans activitypage.xml qui changera sa position.

android: correspond àSystemWindows = "vrai"

et

android: layout_alignParentBottom = "true"

par exemple:

<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:fitsSystemWindows="true">
utilisateur3725137
la source
Cette réponse fournit de meilleures informations sur la façon de faire fonctionner n'importe quelle mise en page.
Tim
9

Cela permet d'afficher toute disposition voulue précédemment masquée par le clavier.

Ajoutez ceci à la balise d'activité dans AndroidManifest.xml

android: windowSoftInputMode = "AdjustResize"


Entourez votre vue racine avec un ScrollView, de préférence avec des barres de défilement = aucun. Le ScrollView ne changera correctement rien avec votre mise en page sauf être utilisé pour résoudre ce problème.

Et puis définissez fitsSystemWindows = "true" sur la vue que vous souhaitez afficher entièrement au-dessus du clavier. Cela rendra votre EditText visible au-dessus du clavier, et permettra de faire défiler les parties sous le EditText mais dans la vue avec fitSystemWindows = "true".

android: correspond àSystemWindows = "vrai"

Par exemple:

<ScrollView
    android:id="@+id/scrollView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:scrollbars="none">

    <android.support.constraint.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:fitsSystemWindows="true">

        ...

    </android.support.constraint.ConstraintLayout>
</ScrollView>   

Si vous souhaitez afficher la partie complète de la vue fitSystemWindows = "true" au-dessus du clavier au moment où le clavier apparaît, vous aurez besoin d'un code pour faire défiler la vue vers le bas:

// Code is in Kotlin

setupKeyboardListener(scrollView) // call in OnCreate or similar


private fun setupKeyboardListener(view: View) {
    view.viewTreeObserver.addOnGlobalLayoutListener {
        val r = Rect()
        view.getWindowVisibleDisplayFrame(r)
        if (Math.abs(view.rootView.height - (r.bottom - r.top)) > 100) { // if more than 100 pixels, its probably a keyboard...
            onKeyboardShow()
        }
    }
}

private fun onKeyboardShow() {
    scrollView.scrollToBottomWithoutFocusChange()
}

fun ScrollView.scrollToBottomWithoutFocusChange() { // Kotlin extension to scrollView
    val lastChild = getChildAt(childCount - 1)
    val bottom = lastChild.bottom + paddingBottom
    val delta = bottom - (scrollY + height)
    smoothScrollBy(0, delta)
}

Exemple de mise en page complète:

<android.support.constraint.ConstraintLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:fitsSystemWindows="true">

    <RelativeLayout
        android:id="@+id/statisticsLayout"
        android:layout_width="match_parent"
        android:layout_height="340dp"
        android:background="@drawable/some"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent">

        <ImageView
            android:id="@+id/logoImageView"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="64dp"
            android:src="@drawable/some"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

    </RelativeLayout>

    <RelativeLayout
        android:id="@+id/authenticationLayout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginEnd="32dp"
        android:layout_marginStart="32dp"
        android:layout_marginTop="20dp"
        android:focusableInTouchMode="true"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@id/statisticsLayout">

        <android.support.design.widget.TextInputLayout
            android:id="@+id/usernameEditTextInputLayout"
            android:layout_width="match_parent"
            android:layout_height="68dp">

            <EditText
                android:id="@+id/usernameEditText"
                android:layout_width="match_parent"
                android:layout_height="wrap_content" />

        </android.support.design.widget.TextInputLayout>

        <android.support.design.widget.TextInputLayout
            android:id="@+id/passwordEditTextInputLayout"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_below="@id/usernameEditTextInputLayout">

            <EditText
                android:id="@+id/passwordEditText"
                android:layout_width="match_parent"
                android:layout_height="wrap_content" />

        </android.support.design.widget.TextInputLayout>

        <Button
            android:id="@+id/loginButton"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@id/passwordEditTextInputLayout"
            android:layout_centerHorizontal="true"
            android:layout_marginBottom="10dp"
            android:layout_marginTop="20dp" />

        <Button
            android:id="@+id/forgotPasswordButton"
            android:layout_width="wrap_content"
            android:layout_height="40dp"
            android:layout_below="@id/loginButton"
            android:layout_centerHorizontal="true" />

    </RelativeLayout>

</android.support.constraint.ConstraintLayout>

Morten Holmgaard
la source
l'utilisation android:fitsSystemWindows="true"est ce qui m'a donné les résultats souhaités que je voulais ... merci
CrandellWS
8

Pour ceux qui utilisent ConstraintLayout , android:windowSoftInputMode="adjustPan|adjustResize"ne fonctionnera pas.

Ce que vous pouvez faire, c'est utiliser un écouteur de clavier logiciel , définir les contraintes des vues de bas en bas des vues supérieures, puis définir un biais vertical pour chaque vue (sous forme de pourcentage de position entre les contraintes) à une ligne de guidage horizontale (également positionnée par pourcentage , mais au parent).

Pour chaque vue, il suffit de changer app:layout_constraintBottom_toBottomOfle @+id/guidelinemoment où le clavier est affiché , par programmation bien sûr.

        <ImageView
        android:id="@+id/loginLogo"
        ...
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.15" />


        <RelativeLayout
        android:id="@+id/loginFields"
        ...
        app:layout_constraintVertical_bias=".15"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/loginLogo">

        <Button
        android:id="@+id/login_btn"
        ...
        app:layout_constraintVertical_bias=".25"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/loginFields"/>

En général, un clavier virtuel ne prend pas plus de 50% de la hauteur de l'écran. Ainsi, vous pouvez définir la ligne directrice à 0,5.

        <android.support.constraint.Guideline
        android:id="@+id/guideline"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        app:layout_constraintGuide_percent="0.5"/>

Maintenant, par programme, lorsque le clavier n'est pas affiché , nous pouvons app:layout_constraintBottom_toBottomOfremettre tout le dos au parent, vice-versa.

            unregistrar = KeyboardVisibilityEvent.registerEventListener(this, isOpen -> {
            loginLayout.startAnimation(AnimationManager.getFade(200));
            if (isOpen) {
                setSoftKeyViewParams(loginLogo, R.id.guideline, ConstraintLayout.LayoutParams.PARENT_ID, -1, "235:64", 0.15f,
                        63, 0, 63, 0);
                setSoftKeyViewParams(loginFields, R.id.guideline, -1, R.id.loginLogo, null, 0.15f,
                        32, 0, 32, 0);
                setSoftKeyViewParams(loginBtn, R.id.guideline, -1, R.id.useFingerPrintIdText, null, 0.5f,
                        32, 0, 32, 0);
            } else {
                setSoftKeyViewParams(loginLogo, ConstraintLayout.LayoutParams.PARENT_ID, ConstraintLayout.LayoutParams.PARENT_ID, -1, "235:64", 0.15f,
                        63, 0, 63, 0);
                setSoftKeyViewParams(loginFields, ConstraintLayout.LayoutParams.PARENT_ID, -1, R.id.loginLogo,null, 0.15f,
                        32, 0, 32, 0);
                setSoftKeyViewParams(loginBtn, ConstraintLayout.LayoutParams.PARENT_ID, -1, R.id.useFingerPrintIdText,null, 0.25f,
                        32, 0, 32, 0);
            }
        });

Appelez cette méthode:

    private void setSoftKeyViewParams(View view, int bottomToBottom, int topToTop, int topToBottom, String ratio, float verticalBias,
                                  int left, int top, int right, int bottom) {
    ConstraintLayout.LayoutParams viewParams = new ConstraintLayout.LayoutParams(view.getLayoutParams().width, view.getLayoutParams().height);
    viewParams.dimensionRatio = ratio;
    viewParams.bottomToBottom = bottomToBottom;
    viewParams.topToTop = topToTop;
    viewParams.topToBottom = topToBottom;
    viewParams.endToEnd = ConstraintLayout.LayoutParams.PARENT_ID;
    viewParams.startToStart = ConstraintLayout.LayoutParams.PARENT_ID;
    viewParams.verticalBias = verticalBias;
    viewParams.setMargins(Dimensions.dpToPx(left), Dimensions.dpToPx(top), Dimensions.dpToPx(right), Dimensions.dpToPx(bottom));
    view.setLayoutParams(viewParams);
}

L'important est d'être sûr de régler la polarisation verticale de manière à ce qu'elle soit correctement mise à l'échelle lorsque le clavier est affiché et non affiché.

6rchid
la source
2
Une méthode plus simple consiste à envelopper le ConstraintLayout dans un ScrollView ou un NestedScrollView. Les calculs finissent par être trop compliqués. Mais votre réponse est excellente si un ScrollView finissait par causer d'autres problèmes
Devenom
5

De nombreuses réponses sont justes. Dans AndroidManifestj'ai écrit:

<activity
    android:name=".SomeActivity"
    android:configChanges="orientation|keyboardHidden|screenSize" // Optional, doesn't affect.
    android:theme="@style/AppTheme.NoActionBar"
    android:windowSoftInputMode="adjustResize" />

Dans mon cas, j'ai ajouté un thème dans styles.xml, mais vous pouvez utiliser le vôtre:

<style name="AppTheme.NoActionBar" parent="AppTheme">
    <!--  Hide ActionBar -->
    <item name="windowNoTitle">true</item>
    <item name="windowActionBar">false</item>
</style>

J'ai remarqué que si j'utilise un thème plein écran, le redimensionnement ne se produit pas:

<style name="AppTheme.FullScreenTheme" parent="AppTheme">
    <!--  Hide ActionBar -->
    <item name="windowNoTitle">true</item>
    <item name="windowActionBar">false</item>
    <!--  Hide StatusBar -->
    <item name="android:windowFullscreen">true</item>
</style>

Aussi dans mon cas adjustResizefonctionne, mais adjustPanne le fait pas.

Pour les mises en page plein écran, consultez une solution de contournement dans Android Comment régler la mise en page en mode plein écran lorsque le clavier logiciel est visible ou dans https://gist.github.com/grennis/2e3cd5f7a9238c59861015ce0a7c5584 .

Aussi https://medium.com/@sandeeptengale/problem-solved-3-android-full-screen-view-translucent-scrollview-adjustresize-keyboard-b0547c7ced32 fonctionne, mais c'est StatusBar est transparent, donc batterie, horloge, Wi- Les icônes Fi sont visibles.

Si vous créez une activité avec Fichier> Nouveau> Activité> Activité plein écran, où dans le code est utilisé:

fullscreen_content.systemUiVisibility =
    View.SYSTEM_UI_FLAG_LOW_PROFILE or
    View.SYSTEM_UI_FLAG_FULLSCREEN or
    View.SYSTEM_UI_FLAG_LAYOUT_STABLE or
    View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY or
    View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION or
    View.SYSTEM_UI_FLAG_HIDE_NAVIGATION

vous n'obtiendrez pas non plus de résultat. Vous pouvez utiliser android:fitsSystemWindows="true"dans un conteneur racine, mais StatusBar apparaît. Utilisez donc des solutions de contournement à partir du premier lien.

CoolMind
la source
@Harshilkakadiya, merci! Notez que si vous souhaitez ensuite revenir en mode normal (non plein écran), cette solution de contournement doit être supprimée. J'ai perdu de nombreuses heures dessus. Dans mon cas ci-dessous la mise en page, j'ai un espace blanc. Bonne chance!
CoolMind
2

Dans mon cas, cela a aidé.

main_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main2"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:orientation="vertical"
    tools:context="com.livewallpaper.profileview.loginact.Main2Activity">

<TextView
    android:layout_weight="1"
    android:layout_width="match_parent"
    android:text="Title"
    android:gravity="center"
    android:layout_height="0dp" />
<LinearLayout
    android:layout_weight="1"
    android:layout_width="match_parent"
    android:layout_height="0dp">
    <EditText
        android:hint="enter here"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
</LinearLayout>
<TextView
    android:layout_weight="1"
    android:text="signup for App"
    android:gravity="bottom|center_horizontal"
    android:layout_width="match_parent"
    android:layout_height="0dp" />
</LinearLayout>

Utilisez ceci dans le manifestfichier

<activity android:name=".MainActivity"
        android:screenOrientation="portrait"
        android:windowSoftInputMode="adjustResize"/>

Maintenant la partie la plus importante! Utilisez un thème comme celui-ci dans la balise Activityou Application.

android:theme="@style/AppTheme"

Et le thème prend comme ça

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
    <item name="windowActionBar">false</item>
    <item name="windowNoTitle">true</item>
    <item name="windowActionModeOverlay">true</item>
</style>

Il me manquait donc le thème. Ce qui m'a frustré toute la journée.

Pradeep Kumar Kushwaha
la source
2

Vous pouvez simplement définir ces options dans le fichier AndroidManifest.xml.

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

L'utilisation de adjustPann'est pas recommandée par Google car l'utilisateur devra peut-être fermer le clavier pour voir tous les champs de saisie.

Plus d'informations: Manifeste d'application Android

vovahost
la source
2

Pour moi, cela a fonctionné avec cette ligne de code:

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

Mettez-le simplement dans la méthode onCreate. Meilleur!

Peter94
la source
1
Bien que cela puisse théoriquement répondre à la question, il serait préférable d'expliquer également pourquoi cela fonctionne.
clinomaniac
2

Ajoutez cette ligne dans le fichier Manifiest:

android:windowSoftInputMode="adjustResize"
Exception de pointeur nul
la source
1

J'utilise ce cadre de classe Extended Et quand j'ai besoin de recalculer la taille de la hauteur onLayout, je remplace onmeasure et soustrait keyboardHeight en utilisant getKeyboardHeight ()

Mon cadre de création qui doit être redimensionné avec le clavier logiciel

SizeNotifierFrameLayout frameLayout = new SizeNotifierFrameLayout(context) {
            private boolean first = true;

            @Override
            protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
                super.onLayout(changed, left, top, right, bottom);

                if (changed) {
                    fixLayoutInternal(first);
                    first = false;
                }
            }

            @Override
            protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
                super.onMeasure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(MeasureSpec.getSize(heightMeasureSpec) - getKeyboardHeight(), MeasureSpec.EXACTLY));
            }

            @Override
            protected boolean drawChild(Canvas canvas, View child, long drawingTime) {
                boolean result = super.drawChild(canvas, child, drawingTime);
                if (child == actionBar) {
                    parentLayout.drawHeaderShadow(canvas, actionBar.getMeasuredHeight());
                }
                return result;
            }


        };

SizeNotifierFrameLayout

public class SizeNotifierFrameLayout extends FrameLayout {

    public interface SizeNotifierFrameLayoutDelegate {
        void onSizeChanged(int keyboardHeight, boolean isWidthGreater);
    }

    private Rect                            rect            = new Rect();
    private Drawable                        backgroundDrawable;
    private int                             keyboardHeight;
    private int                             bottomClip;
    private SizeNotifierFrameLayoutDelegate delegate;
    private boolean                         occupyStatusBar = true;

    public SizeNotifierFrameLayout(Context context) {
        super(context);
        setWillNotDraw(false);
    }

    public Drawable getBackgroundImage() {
        return backgroundDrawable;
    }

    public void setBackgroundImage(Drawable bitmap) {
        backgroundDrawable = bitmap;
        invalidate();
    }

    public int getKeyboardHeight() {
        View rootView = getRootView();
        getWindowVisibleDisplayFrame(rect);
        int usableViewHeight = rootView.getHeight() - (rect.top != 0 ? AndroidUtilities.statusBarHeight : 0) - AndroidUtilities.getViewInset(rootView);
        return usableViewHeight - (rect.bottom - rect.top);
    }

    public void notifyHeightChanged() {
        if (delegate != null) {
            keyboardHeight = getKeyboardHeight();
            final boolean isWidthGreater = AndroidUtilities.displaySize.x > AndroidUtilities.displaySize.y;
            post(new Runnable() {
                @Override
                public void run() {
                    if (delegate != null) {
                        delegate.onSizeChanged(keyboardHeight, isWidthGreater);
                    }
                }
            });
        }
    }

    public void setBottomClip(int value) {
        bottomClip = value;
    }

    public void setDelegate(SizeNotifierFrameLayoutDelegate delegate) {
        this.delegate = delegate;
    }

    public void setOccupyStatusBar(boolean value) {
        occupyStatusBar = value;
    }

    protected boolean isActionBarVisible() {
        return true;
    }

    @Override
    protected void onDraw(Canvas canvas) {
        if (backgroundDrawable != null) {
            if (backgroundDrawable instanceof ColorDrawable) {
                if (bottomClip != 0) {
                    canvas.save();
                    canvas.clipRect(0, 0, getMeasuredWidth(), getMeasuredHeight() - bottomClip);
                }
                backgroundDrawable.setBounds(0, 0, getMeasuredWidth(), getMeasuredHeight());
                backgroundDrawable.draw(canvas);
                if (bottomClip != 0) {
                    canvas.restore();
                }
            } else if (backgroundDrawable instanceof BitmapDrawable) {
                BitmapDrawable bitmapDrawable = (BitmapDrawable) backgroundDrawable;
                if (bitmapDrawable.getTileModeX() == Shader.TileMode.REPEAT) {
                    canvas.save();
                    float scale = 2.0f / AndroidUtilities.density;
                    canvas.scale(scale, scale);
                    backgroundDrawable.setBounds(0, 0, (int) Math.ceil(getMeasuredWidth() / scale), (int) Math.ceil(getMeasuredHeight() / scale));
                    backgroundDrawable.draw(canvas);
                    canvas.restore();
                } else {
                    int actionBarHeight =
                            (isActionBarVisible() ? ActionBar.getCurrentActionBarHeight() : 0) + (Build.VERSION.SDK_INT >= 21 && occupyStatusBar ? AndroidUtilities.statusBarHeight : 0);
                    int   viewHeight = getMeasuredHeight() - actionBarHeight;
                    float scaleX     = (float) getMeasuredWidth() / (float) backgroundDrawable.getIntrinsicWidth();
                    float scaleY     = (float) (viewHeight + keyboardHeight) / (float) backgroundDrawable.getIntrinsicHeight();
                    float scale      = scaleX < scaleY ? scaleY : scaleX;
                    int   width      = (int) Math.ceil(backgroundDrawable.getIntrinsicWidth() * scale);
                    int   height     = (int) Math.ceil(backgroundDrawable.getIntrinsicHeight() * scale);
                    int   x          = (getMeasuredWidth() - width) / 2;
                    int   y          = (viewHeight - height + keyboardHeight) / 2 + actionBarHeight;
                    canvas.save();
                    canvas.clipRect(0, actionBarHeight, width, getMeasuredHeight() - bottomClip);
                    backgroundDrawable.setBounds(x, y, x + width, y + height);
                    backgroundDrawable.draw(canvas);
                    canvas.restore();
                }
            }
        } else {
            super.onDraw(canvas);
        }
    }

    @Override
    protected void onLayout(boolean changed, int l, int t, int r, int b) {
        super.onLayout(changed, l, t, r, b);
        notifyHeightChanged();
    }
}
Arthur Melo
la source
0

Ce code fonctionne pour moi. Lorsque le clavier apparaît, vous pouvez faire défiler l'écran

Dans AndroidManifest.xml

<activity android:name=".signup.screen_2.SignUpNameAndPasswordActivity"
                  android:screenOrientation="portrait"
                  android:windowSoftInputMode="adjustResize">
</activity>

activity_sign_up.xml

<?xml version="1.0" encoding="utf-8"?>
<ScrollView
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fillViewport="true"
        tools:context=".signup.screen_2.SignUpNameAndPasswordActivity">
    <LinearLayout
            android:fitsSystemWindows="true"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical">

        <LinearLayout
                android:layout_marginTop="@dimen/dp_24"
                android:layout_marginStart="@dimen/dp_24"
                android:layout_marginEnd="@dimen/dp_24"
                android:id="@+id/lin_name_password"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="vertical">

            <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_gravity="center_horizontal"
                    android:fontFamily="sans-serif-medium"
                    android:text="@string/name_and_password"
                    android:textColor="@color/colorBlack"
                    android:layout_marginTop="@dimen/dp_5"
                    android:textSize="@dimen/ts_16"/>

            <EditText
                    android:id="@+id/edit_full_name"
                    android:layout_width="match_parent"
                    android:layout_height="@dimen/dp_44"
                    app:layout_constraintTop_toTopOf="parent"
                    android:hint="@string/email_address_hint"
                    android:inputType="textPersonName"
                    android:imeOptions="flagNoFullscreen"
                    android:textSize="@dimen/ts_15"
                    android:background="@drawable/rounded_border_edittext"
                    android:layout_marginTop="@dimen/dp_15"
                    android:paddingStart="@dimen/dp_8"
                    android:paddingEnd="@dimen/dp_8"
                    android:maxLength="100"
                    android:maxLines="1"/>

            <EditText
                    android:id="@+id/edit_password"
                    android:layout_width="match_parent"
                    android:layout_height="@dimen/dp_44"
                    app:layout_constraintTop_toTopOf="parent"
                    android:hint="@string/password"
                    android:inputType="textPassword"
                    android:imeOptions="flagNoFullscreen"
                    android:textSize="@dimen/ts_15"
                    android:background="@drawable/rounded_border_edittext"
                    android:layout_marginTop="@dimen/dp_15"
                    android:paddingStart="@dimen/dp_8"
                    android:paddingEnd="@dimen/dp_8"
                    android:maxLength="100"
                    android:maxLines="1"/>

            <TextView
                    android:id="@+id/btn_continue_and_sync_contacts"
                    android:layout_width="match_parent"
                    android:layout_height="@dimen/dp_44"
                    android:gravity="center"
                    android:clickable="true"
                    android:focusable="true"
                    android:layout_marginTop="@dimen/dp_15"
                    android:background="@drawable/btn_blue_selector"
                    android:enabled="false"
                    android:text="@string/continue_and_sync_contacts"
                    android:textColor="@color/colorWhite"
                    android:textSize="@dimen/ts_15"
                    android:textStyle="bold"/>

            <TextView
                    android:id="@+id/btn_continue_without_syncing_contacts"
                    android:layout_width="match_parent"
                    android:layout_height="@dimen/dp_44"
                    android:gravity="center"
                    android:clickable="true"
                    android:focusable="true"
                    android:layout_marginTop="@dimen/dp_10"
                    android:enabled="false"
                    android:text="@string/continue_without_syncing_contacts"
                    android:textColor="@color/colorBlue"
                    android:textSize="@dimen/ts_15"
                    android:textStyle="bold"/>

        </LinearLayout>
        <!--RelativeLayout is scaled when keyboard appears-->
        <RelativeLayout
                android:layout_marginStart="@dimen/dp_24"
                android:layout_marginEnd="@dimen/dp_24"
                android:layout_marginBottom="@dimen/dp_20"
                android:layout_width="match_parent"
                android:layout_height="match_parent">

            <LinearLayout
                    android:layout_alignParentBottom="true"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:orientation="vertical">
                <TextView
                        android:id="@+id/tv_learn_more_1"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:clickable="true"
                        android:focusable="true"
                        android:layout_gravity="center_horizontal"
                        android:text="@string/learn_more_syncing_contacts"
                        android:textColor="@color/black_alpha_70"
                        android:gravity="center"
                        android:layout_marginBottom="1dp"
                        android:textSize="@dimen/ts_13"/>

                <TextView
                        android:id="@+id/tv_learn_more_2"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:clickable="true"
                        android:focusable="true"
                        android:layout_gravity="center_horizontal"
                        android:text="@string/learn_more"
                        android:fontFamily="sans-serif-medium"
                        android:textColor="@color/black_alpha_70"
                        android:textSize="@dimen/ts_13"/>
            </LinearLayout>
        </RelativeLayout>
    </LinearLayout>
</ScrollView>

round_border_edittext.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_activated="true">
        <shape android:shape="rectangle">
            <solid android:color="#F6F6F6"/>
            <corners android:radius="3dp"/>
            <stroke
                    android:width="1dp"
                    android:color="@color/red"/>
        </shape>
    </item>
    <item android:state_activated="false">
        <shape android:shape="rectangle">
            <solid android:color="#F6F6F6"/>
            <corners android:radius="3dp"/>
            <stroke
                    android:width="1dp"
                    android:color="@color/colorGray"/>
        </shape>
    </item>
</selector>

btn_blue_selector.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_enabled="true" android:state_pressed="true">
        <shape android:shape="rectangle">
            <corners android:radius="3dp"/>
            <solid android:color="@color/colorBlueLight"/>
            <stroke android:width="1dp" android:color="@color/colorBlueLight"/>
        </shape>
    </item>
    <item android:state_enabled="true">
        <shape android:shape="rectangle">
            <corners android:radius="3dp"/>
            <solid android:color="@color/colorBlue"/>
            <stroke android:width="1dp" android:color="@color/colorBlue"/>
        </shape>
    </item>
    <item android:state_enabled="false">
        <shape android:shape="rectangle">
            <corners android:radius="3dp"/>
            <solid android:color="@color/colorBlueAlpha"/>
            <stroke android:width="0dp" android:color="@color/colorBlueAlpha"/>
        </shape>
    </item>
</selector>
Anh Duy
la source
0

Dans Xamarin, inscrivez-vous ci-dessous le code de votre activité

 WindowSoftInputMode = Android.Views.SoftInput.AdjustResize | Android.Views.SoftInput.AdjustPan

J'ai utilisé une disposition relative si vous utilisez une disposition de contrainte, le code ci-dessus fonctionnera avec le code ci-dessous

logeshpalani98
la source
0

Dans Kotlin ou dans ConstraintLayout, il vous suffit d'ajouter:

android:windowSoftInputMode="stateHidden|adjustResize"

OU

android:windowSoftInputMode="stateVisible|adjustResize"

Vous pouvez définir l'état dont vous avez besoin après le lancement de l'activité à partir du manifeste.

dans votre AndroidManifest.xmlcomme ça:

      <activity
        android:name=".ActivityName"
        android:windowSoftInputMode="stateHidden|adjustResize"
        />
Jamil Hasnine Tamim
la source