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>
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é.
Ou ajoutez cette ligne dans le manifeste. Android:windowSoftInputMode="adjustResize"
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.
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:
Android:fitsSystemWindows="true"
inclus à la mise en page racineAndroid:windowSoftInputMode="adjustResize|stateAlwaysHidden"
inclus à la balise du manifeste d'activité.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.
<include
Android:id="@+id/toolbar_home"
layout="@layout/toolbar_home"
Android:elevation="5dp"
Android:layout_alignParentTop="true"
/>
Utiliser Android:windowSoftInputMode="adjustNothing"
pour l'activité dans le manifeste a fonctionné pour moi.
essaye ça,
Android:windowSoftInputMode="adjustPan"
dans votre manifeste.xml dans la balise d'activité.
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
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.
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
Veuillez vérifier WindowsSoftInputMode dans le manifeste Android Essayer de définir AdjustResize ou AdjsutPan