web-dev-qa-db-fra.com

La barre d'outils Android se lève lorsque le clavier apparaît

Je crée un écran d'interface utilisateur basé sur le chat dans lequel j'ai une barre d'outils et recyclerview pour les messages de chat et une mise en page de messages.

Chaque fois que edittext obtient le focus, il se déplace vers le haut de la barre d'outils. Au lieu de cela, je voudrais redimensionner le recyclage.

certaines réponses stackoverflow suggèrent de placer un empty scrollview sous la barre d'outils , mais cela n'a pas fonctionné.

        <activity
            Android:name=".PostMessageActivity"
            Android:label="@string/title_activity_post_message"
            Android:windowSoftInputMode="stateVisible|adjustResize"
            >
        </activity>

Je règle la windowSoftInputMode sur stateVisible|adjustPan dans le fichier manifeste. 

<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:tools="http://schemas.Android.com/tools"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
tools:context="com.pasonet.yokibu.PostMessageActivity"
>
<include
    Android:id="@+id/toolbar_home"
    layout="@layout/toolbar_home"
    Android:elevation="5dp"
    />

<ScrollView
    Android:layout_width="match_parent"
    Android:layout_height="match_parent">
</ScrollView>


<LinearLayout
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:layout_below="@+id/toolbar_home"
    Android:orientation="vertical"
    Android:layout_above="@+id/add_post_layout"
    >
    <Android.support.v7.widget.RecyclerView
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
        Android:id="@+id/post_msg_recyclerview"
        >
    </Android.support.v7.widget.RecyclerView>


</LinearLayout>

<LinearLayout
    Android:orientation="horizontal"
    Android:layout_width="fill_parent"
    Android:layout_height="wrap_content"
    Android:layout_alignParentBottom="true"
    Android:layout_centerHorizontal="true"
    Android:padding="5dp"
    Android:id="@+id/add_post_layout"
    Android:background="#ffffff"
    Android:layout_alignParentLeft="true"
    Android:layout_alignParentRight="true"
    Android:elevation="5dp"
    Android:layout_margin="0pt"
   >

    <EditText
        Android:layout_width="0dp"
        Android:layout_height="match_parent"
        Android:id="@+id/messageText"
        Android:layout_gravity="bottom"
        Android:layout_weight="1"
        Android:maxLines="4"
        Android:scrollbars="vertical"
        Android:background="@color/trasnperant"
        Android:hint="Type your message"
        Android:layout_marginBottom="4dp"
        />
    <ImageButton
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:src="@drawable/ic_send_black_36dp"
        Android:id="@+id/sendButton"
        Android:background="@drawable/abc_btn_default_mtrl_shape"
        Android:onClick="addPost"
        />
</LinearLayout>

 enter image description here

27
AlgoCoder

Le problème était que j'utilisais <item name="Android:windowTranslucentStatus">true</item> dans styles.xml

Pour activer adjustResize, ajoutez Android:fitsSystemWindows="true" dans la présentation parent de votre activité.

15
AlgoCoder

Ou ajoutez cette ligne dans le manifeste. Android:windowSoftInputMode="adjustResize"

12
user5311329

Si vous ne voulez pas que votre Toolbar soit poussée, vous ne devriez pas utiliser adjustPan. Utiliser adjustResize sans autre chose (sans ajouter de Views supplémentaire) devrait suffire.

9
Bartek Lipinski

Dans mon cas, mon application par défaut utilisait la mise en page de coordinateur pour l'élément racine. Même ce qui a été décrit ci-dessus n'a pas résolu mon problème. Puis j'ai fait ce qui suit:

  1. Modification de la disposition racine de la disposition coordinatrice à RelativeLayout
  2. Android:fitsSystemWindows="true" inclus à la mise en page racine
  3. Android:windowSoftInputMode="adjustResize|stateAlwaysHidden" inclus à la balise du manifeste d'activité.
5
Lucas Coelho

Vous devez ajouter Android: fitsSystemWindows = "true" dans la présentation racine de votre barre d'outils. Si vous l'ajoutez à la présentation parent de votre activité, une ligne étrange (avec la hauteur de la barre d'état) apparaîtra au-dessus de votre barre d'outils.

4
Tsiogas P.
<include
    Android:id="@+id/toolbar_home"
    layout="@layout/toolbar_home"
    Android:elevation="5dp"
Android:layout_alignParentTop="true"
    />
2
user5311329

Utiliser Android:windowSoftInputMode="adjustNothing" pour l'activité dans le manifeste a fonctionné pour moi.

1
saswanb

essaye ça,

Android:windowSoftInputMode="adjustPan"

dans votre manifeste.xml dans la balise d'activité.

1
Ganpat Kaliya

J'ai essayé de nombreuses façons de garder la barre d'outils fixe, sans redimensionner ni compresser la mise en page sous Android: windowSoftInputMode = "adjustResize", ce n'est pas une solution adéquate.

Cela n’est possible que par la mise en page du coordinateur,

<Android.support.design.widget.CoordinatorLayout 
xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:card_view="http://schemas.Android.com/apk/res-auto"
Android:layout_width="match_parent"
Android:layout_height="match_parent">

<Android.support.design.widget.AppBarLayout
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content">

    <Android.support.design.widget.CollapsingToolbarLayout
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content">

        <Android.support.v7.widget.Toolbar 
           xmlns:Android="http://schemas.Android.com/apk/res/Android"
           xmlns:ripple="http://schemas.Android.com/apk/res-auto"
           Android:id="@+id/tv_toolbar"
           Android:layout_width="match_parent"
           Android:layout_height="50dp"
           Android:background="#fff"
           ripple:contentInsetStart="0dp">
        </Android.support.v7.widget.Toolbar>

    </Android.support.design.widget.CollapsingToolbarLayout>
</Android.support.design.widget.AppBarLayout>

<ScrollView
    Android:id="@+id/coordinate_container"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:marginTop="56dp">
</ScrollView>

Gardez la structure comme

 Coordinator layout
  |-->Toolbar    (Android:id="@+id/toolbar")
  |-->ScrollView (Android:layout_below="@id/toolbar")
   |-->Child
   |-->Child
   |-->Child
0
Anuraag Patil

J'utilise une CoordinatorLayout comme disposition racine pour la barre d'outils. J'ai eu le même problème, mais je l'ai résolu en réglant la barre d'outils sur:

app:layout_scrollFlags="enterAlways" 

au lieu de:

app:layout_scrollFlags="scroll|enterAlways"

et en ajoutant:

Android:windowSoftInputMode="adjustNothing"

dans l'activité dans le manifeste.

0
sebkes

 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

Veuillez vérifier WindowsSoftInputMode dans le manifeste Android Essayer de définir AdjustResize ou AdjsutPan

0
Ashish Agrawal