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?
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.
Vous pouvez également utiliser ce code dans la méthode onCreate()
:
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
Ajoutez le fichier AndroidManifest.xml pour votre activité:
Android:windowSoftInputMode="adjustPan|adjustResize"
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);
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é.!!!!!!!!!!!!
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
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);
Il y a 3 étapes à suivre pour faire défiler l'écran.
Android: windowSoftInputMode = "ajuster-redimensionner"
getWindow (). setSoftInputMode (WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
<?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.
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>
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.
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>
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);
Dans votre fichier manifeste, ajoutez la ligne ci-dessous. Ça va marcher
<activity name="MainActivity"
Android:windowSoftInputMode="stateVisible|adjustResize">
...
</activity>
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.
Je viens d'ajouter la ligne suivante à la disposition de niveau supérieur et tout a fonctionné:
Android:fitsSystemWindows="true"
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