Déplacer la disposition vers le haut quand le clavier doux est montré?
j'ai quelques éléments dans une RelativeView avec l'attribut align bottom défini, quand le clavier doux monte, les éléments sont cachés par le clavier doux.
je voudrais qu'ils se déplacent vers le haut de sorte que s'il y a assez d'espace d'écran ils sont affichés au-dessus du clavier, ou de faire la section au-dessus du clavier scrollable de sorte que l'utilisateur peut encore voir les éléments.
des idées sur la façon d'aborder cela?
13 réponses
Oui, découvrez cet article sur l'Android site des développeurs qui décrit comment le framework gère le clavier apparaissent.
l'attribut android:windowSoftInputMode
peut être utilisé pour spécifier ce qui se passe par activité: si la mise en page est redimensionnée ou si elle défile, etc.
vous pouvez également utiliser ce code dans onCreate()
méthode:
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
ajouter dans AndroidManifest.xml pour votre activité:
android:windowSoftInputMode="adjustPan|adjustResize"
modifiez l'activité de votre fichier manifeste comme
windowSoftInputMode="adjustResize"
ou
apporter des changements à votre méthode onCreate()
dans la classe d'activité comme
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
question similaire à laquelle je faisais face avec ma mise en page qui consiste scroll view à l'intérieur. Chaque fois que j'essaie de sélectionner le 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 tel il ne redimensionne pas layout
android:windowSoftInputMode="adjustPan"
en le modifiant comme suit:
1) AndroidManifest.xml
android:windowSoftInputMode="stateVisible|adjustResize"
2) style.fichier xml ,en 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 une sortie relative à l'intérieur de ScrollView ,définir:
android:layout_gravity="center" or android:layout_gravity="bottom"
ça va aller
pour L'activité dans sa méthode oncrée, insérer
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
et pour les fragments dans sa méthode oncrée
getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
il y a 3 étapes à suivre pour faire défiler l'écran vers le haut.
- écrivez en fichier manifeste pour votre activité:
android: windowSoftInputMode= "adjustResize"
- ajouter la ligne suivante dans oncreate() méthode de votre activité
getWindow ().setSoftInputMode (WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE / WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
- alors placez toute votre vue dans "Scrollview" dans le 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 layout relatif parent.
j'ai essayé une méthode de Diego Ramírez, ça marche. En 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 assez semblable à la vôtre.
tout d'abord, je n'ai qu'un affichage en ligne avec 2 éléments, une vue D'image et un affichage en ligne qui contient 2 EditText et un bouton, donc j'avais besoin de les garder séparés en plein écran sans clavier, et quand le clavier apparaît, ils devraient regarder de plus près.
donc j'ai ajouté la vue entre eux avec l'attribut de taille dans 0dp et le poids 1, qui me permettent de garder mon points de vue distincts l'un de l'autre. et quand le clavier apparaît, comme ils n'ont pas de hauteur fixe, ils se contentent de redimensionner et de garder l'aspect.
voilà! La mise en page redimensionne et la distance entre mes vues est la même lorsque le clavier est présent ou non.
voici le code de manifeste complet
<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 alors vous devez ajouter le code ci-dessous à votre onCreate sur votre activité il résout question pour moi
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
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, alors le clavier déplacera toutes les mises en page sous ce texte d'édition sans déplacer le ListView
<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.