J’ai besoin de faire une chose très simple - à savoir si le clavier logiciel s’affiche. Est-ce possible dans Android ?
Réponses
Trop de publicités?NOUVELLE RÉPONSE ajouté 25 Jan 2012
Depuis la rédaction de la réponse ci-dessous, quelqu'un de doué-moi pour l'existence de ViewTreeObserver et les amis, les Api qui rôdent dans le SDK depuis la version 1.
Plutôt que d'exiger une Mise en page personnalisée de type, une solution beaucoup plus simple est de donner à votre activité, en vue de la racine connu ID, dire "@+id/activityRoot', crochet un GlobalLayoutListener dans le ViewTreeObserver, et à partir de là calculer la taille de diff entre votre activité, en vue de la racine et de la taille de la fenêtre:
final View activityRootView = findViewById(R.id.activityRoot);
activityRootView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
int heightDiff = activityRootView.getRootView().getHeight() - activityRootView.getHeight();
if (heightDiff > 100) { // if more than 100 pixels, its probably a keyboard...
... do something here
}
}
});
Facile!
RÉPONSE ORIGINALE À CETTE QUESTION
Oui c'est possible, mais il est beaucoup plus difficile qu'elle ne devrait l'être.
Si j'ai besoin de s'en soucier lorsque le clavier apparaît et disparaît (ce qui est assez souvent) alors ce que je fais est de personnaliser mon top-niveau classe de mise en page dans un qui remplace onMeasure()
. La logique de base est que si la mise en page se trouve de remplissage de manière significative moins que la superficie totale de la fenêtre, puis un clavier souple est sans doute montrer.
import android.app.Activity;
import android.content.Context;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.widget.LinearLayout;
/*
* LinearLayoutThatDetectsSoftKeyboard - a variant of LinearLayout that can detect when
* the soft keyboard is shown and hidden (something Android can't tell you, weirdly).
*/
public class LinearLayoutThatDetectsSoftKeyboard extends LinearLayout {
public LinearLayoutThatDetectsSoftKeyboard(Context context, AttributeSet attrs) {
super(context, attrs);
}
public interface Listener {
public void onSoftKeyboardShown(boolean isShowing);
}
private Listener listener;
public void setListener(Listener listener) {
this.listener = listener;
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int height = MeasureSpec.getSize(heightMeasureSpec);
Activity activity = (Activity)getContext();
Rect rect = new Rect();
activity.getWindow().getDecorView().getWindowVisibleDisplayFrame(rect);
int statusBarHeight = rect.top;
int screenHeight = activity.getWindowManager().getDefaultDisplay().getHeight();
int diff = (screenHeight - statusBarHeight) - height;
if (listener != null) {
listener.onSoftKeyboardShown(diff>128); // assume all soft keyboards are at least 128 pixels high
}
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
}
Ensuite, dans votre classe d'Activité...
public class MyActivity extends Activity implements LinearLayoutThatDetectsSoftKeyboard.Listener {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
...
LinearLayoutThatDetectsSoftKeyboard mainLayout = (LinearLayoutThatDetectsSoftKeyboard)findViewById(R.id.main);
mainLayout.setListener(this);
...
}
@Override
public void onSoftKeyboardShown(boolean isShowing) {
// do whatever you need to do here
}
...
}
Alors j’espère que cela aide quelqu'un.
La réponse de nouveau que Reuben Scratton donnée est grande et vraiment efficace, mais il fonctionne vraiment uniquement si vous définissez votre windowSoftInputMode à adjustResize. Si vous le réglez à adjustPan, il ne parvient pas à détecter si le clavier est visible à l’aide de son extrait de code. Pour contourner ce problème, j’ai fait cette petite modification au code ci-dessus.
J'ai utilisé un peu de temps pour comprendre cela... j'ai couru quelques CastExceptions, mais pensé que vous pouvez remplacer vous LinearLayout dans le layout.xml avec le nom de la classe.
Comme ceci:
<?xml version="1.0" encoding="UTF-8"?>
<LinearLayout android:layout_width="fill_parent" android:layout_height="fill_parent"
xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/llMaster">
<com.ourshoppingnote.RelativeLayoutThatDetectsSoftKeyboard android:background="@drawable/metal_background"
android:layout_width="fill_parent" android:layout_height="fill_parent"
android:id="@+id/rlMaster" >
<LinearLayout android:layout_width="fill_parent"
android:layout_height="1dip" android:background="@drawable/line"></LinearLayout>
....
</com.ourshoppingnote.RelativeLayoutThatDetectsSoftKeyboard>
</LinearLayout>
De cette façon, vous n'avez pas de fonte des questions.
... et si vous ne voulez pas le faire sur chaque page, je vous recommande d'utiliser "MasterPage dans Android". Voir le lien ici: http://jnastase.alner.net/archive/2011/01/08/ldquomaster-pagesrdquo-in-android.aspx