Je voudrais changer la disposition en fonction de si le clavier virtuel est visible ou pas. J’ai cherché l’API et différents blogs mais n’arrive pas à trouver quelque chose d’utile.
Est-ce possible ?
Merci !
Je voudrais changer la disposition en fonction de si le clavier virtuel est visible ou pas. J’ai cherché l’API et différents blogs mais n’arrive pas à trouver quelque chose d’utile.
Est-ce possible ?
Merci !
Vous avez à gérer les changements de configuration vous-même.
http://developer.android.com/guide/topics/resources/runtime-changes.html#HandlingTheChange
Exemple:
// from the link above
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
// Checks whether a hardware keyboard is available
if (newConfig.hardKeyboardHidden == Configuration.HARDKEYBOARDHIDDEN_NO) {
Toast.makeText(this, "keyboard visible", Toast.LENGTH_SHORT).show();
} else if (newConfig.hardKeyboardHidden == Configuration.HARDKEYBOARDHIDDEN_YES) {
Toast.makeText(this, "keyboard hidden", Toast.LENGTH_SHORT).show();
}
}
Alors il suffit de changer la visibilité de certains points de vue, mettre à jour un champ, et de modifier votre fichier de mise en page.
Cette solution ne fonctionne pas pour les claviers virtuels et onConfigurationChanged
ne sera pas appelé pour les claviers virtuels.
C’est peut-être pas la solution la plus efficace. Mais cela a fonctionné pour moi à chaque fois... J’appelle cette fonction où que j’ai besoin d’écouter le softKeyboard.
Remarque : Si il y a une question que quelqu'un là-bas a été confrontée, laissez-moi savoir. Parce que j’utilise cela en production.
Si vous souhaitez gérer afficher/masquer de l'IMM (virtuel) du clavier de la fenêtre de votre Activité, vous aurez besoin d'une classe de votre mise en page et remplacer onMesure méthode(de sorte que vous pouvez déterminer la largeur et la hauteur mesurée de votre mise en page). Après cet ensemble de sous-classé disposition comme écran principal de votre Activité par setContentView(). Maintenant, vous serez capable de gérer IMM afficher/masquer la fenêtre événements. Si cela vous semble compliqué, il n'en est pas vraiment. Voici le code:
main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="horizontal" >
<EditText
android:id="@+id/SearchText"
android:text=""
android:inputType="text"
android:layout_width="fill_parent"
android:layout_height="34dip"
android:singleLine="True"
/>
<Button
android:id="@+id/Search"
android:layout_width="60dip"
android:layout_height="34dip"
android:gravity = "center"
/>
</LinearLayout>
Maintenant à l'intérieur de votre Activité de déclarer la sous-classe pour votre mise en page (main.xml)
public class MainSearchLayout extends LinearLayout {
public MainSearchLayout(Context context, AttributeSet attributeSet) {
super(context, attributeSet);
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
inflater.inflate(R.layout.main, this);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
Log.d("Search Layout", "Handling Keyboard Window shown");
final int proposedheight = MeasureSpec.getSize(heightMeasureSpec);
final int actualHeight = getHeight();
if (actualHeight > proposedheight){
// Keyboard is shown
} else {
// Keyboard is hidden
}
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
}
Vous pouvez le voir dans le code que nous gonfler mise en page pour notre Activité de constructeur de sous-classe
inflater.inflate(R.layout.main, this);
Et maintenant définir l'affichage du contenu de la sous-classé à la disposition de notre Activité.
public class MainActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
MainSearchLayout searchLayout = new MainSearchLayout(this, null);
setContentView(searchLayout);
}
// rest of the Activity code and subclassed layout...
}
Solution de Nebojsa presque a fonctionné pour moi. Quand j’ai cliqué à l’intérieur d’un EditText multiligne il savait le clavier a été affiché, mais quand j’ai commencé à taper à l’intérieur de l’EditText, l’actualHeight et proposedHeight étaient toujours le même, donc il ne savais pas qu’ils le clavier était toujours affiché. J’ai fait une légère modification pour stocker la hauteur maximum et il fonctionne très bien. Voici la sous-classe révisée :
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.