Android EditText, clavier souple afficher/masquer de l'événement?
est-il possible d'attraper l'événement que le clavier doux a été montré ou caché pour EditText?
7 réponses
Salut j'avais utilisé la solution suivante:
dans la mesure où ma vue de contenu est une sous-classe de linéarisation (pourrait être n'importe quelle autre vue ou groupe de vue), j'ai outrepassé la méthode de mesure lilke suivante:
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
final int proposedheight = MeasureSpec.getSize(heightMeasureSpec);
final int actualHeight = getHeight();
if (actualHeight > proposedheight){
// Keyboard is shown
} else {
// Keyboard is hidden
}
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
cette solution de contournement m'a aidé à cacher quelques contrôles lorsque le clavier est affiché et à ramener autrement.
J'espère que ce sera utile.
il n'y a pas un tel événement à prendre. L'EMI montre et Cache simplement sa fenêtre; le feedback que vous obtenez de ceci est le gestionnaire de fenêtre provoquant le contenu de votre propre fenêtre à redimensionner si vous l'avez mis en mode redimensionner.
j'ai résolu ce problème en utilisant onGlobalLayoutListener:
final View activityRootView = findViewById(R.id.top_root);
activityRootView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
public void onGlobalLayout() {
int heightDiff = activityRootView.getRootView().getHeight() - activityRootView.getHeight();
if (heightDiff > 100) {
// keyboard is up
} else {
// keyboard is down
}
}
});
ici activityRootView est la vue racine de votre activité.
dans mon cas je voulais cacher une barre du bas quand softkeyboard a été montré. J'ai considéré le mieux de cacher la barre quand la disposition avait moins d'un pour cent de la taille de la disposition normale. Donc j'ai utilisé cette solution qui fonctionne bien considérant que le clavier doux prend habituellement 20% ou plus de la hauteur de l'écran. Il suffit de changer la constante de pourcentage par n'importe quelle valeur que vous pouvez penser est ok. Il a besoin de l'attribut android: windowSoftInputMode= "adjusresize" dans le manifeste et layout doit être la racine pour travail.
S'étendent de n'importe quel layout que vous pouvez vouloir au lieu de RelativeLayout.
public class SoftKeyboardLsnedRelativeLayout extends RelativeLayout {
private boolean isKeyboardShown = false;
private List<SoftKeyboardLsner> lsners=new ArrayList<SoftKeyboardLsner>();
private float layoutMaxH = 0f; // max measured height is considered layout normal size
private static final float DETECT_ON_SIZE_PERCENT = 0.8f;
public SoftKeyboardLsnedRelativeLayout(Context context) {
super(context);
}
public SoftKeyboardLsnedRelativeLayout(Context context, AttributeSet attrs) {
super(context, attrs);
}
@SuppressLint("NewApi")
public SoftKeyboardLsnedRelativeLayout(Context context, AttributeSet attrs,
int defStyle) {
super(context, attrs, defStyle);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
final int newH = MeasureSpec.getSize(heightMeasureSpec);
if (newH > layoutMaxH) {
layoutMaxH = newH;
}
if (layoutMaxH != 0f) {
final float sizePercent = newH / layoutMaxH;
if (!isKeyboardShown && sizePercent <= DETECT_ON_SIZE_PERCENT) {
isKeyboardShown = true;
for (final SoftKeyboardLsner lsner : lsners) {
lsner.onSoftKeyboardShow();
}
} else if (isKeyboardShown && sizePercent > DETECT_ON_SIZE_PERCENT) {
isKeyboardShown = false;
for (final SoftKeyboardLsner lsner : lsners) {
lsner.onSoftKeyboardHide();
}
}
}
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
public void addSoftKeyboardLsner(SoftKeyboardLsner lsner) {
lsners.add(lsner);
}
public void removeSoftKeyboardLsner(SoftKeyboardLsner lsner) {
lsners.remove(lsner);
}
// Callback
public interface SoftKeyboardLsner {
public void onSoftKeyboardShow();
public void onSoftKeyboardHide();
}
}
exemple:
mise en page/my_layout.xml
<?xml version="1.0" encoding="utf-8"?>
<yourclasspackage.SoftKeyboardLsnedRelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/myLayout"
android:layout_width="match_parent"
android:layout_height="match_parent">
...
</yourclasspackage.SoftKeyboardLsnedRelativeLayout>
MyActivity.java
public class MyActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.my_layout);
SoftKeyboardLsnedRelativeLayout layout = (SoftKeyboardLsnedRelativeLayout) findViewById(R.id.myLayout);
layout.addSoftKeyboardLsner(new SoftKeyboardLsner() {
@Override
public void onSoftKeyboardShow() {
Log.d("SoftKeyboard", "Soft keyboard shown");
}
@Override
public void onSoftKeyboardHide() {
Log.d("SoftKeyboard", "Soft keyboard hidden");
}
});
}
}
essayez ces méthodes: showSoftInput(View, int, ResultReceiver)
et hideSoftInputFromWindow(IBinder, int, ResultReceiver)
. Vous pouvez outrepasser la méthode onReceiveResult(int resultCode, Bundle resultData)
de la classe ResultReceiver
pour gérer l'événement show/hide.
beaucoup de développeurs Android aiment modifier la mise en page basée sur le fait que le clavier virtuel est affiché ou non.donc pour la solution vous pouvez voir Android: détecter softkeyboard ouvert .et ça marche pour moi et je pense que c'est aussi très utile.
vous pouvez capturer ceci en écrasant la méthode onConfigurationChanged
de votre activité:
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
if(newConfig.hardKeyboardHidden == Configuration.HARDKEYBOARDHIDDEN_NO) {
((SherlockFragmentActivity)getActivity()).getSupportActionBar().hide();
}
else if(newConfig.hardKeyboardHidden == Configuration.HARDKEYBOARDHIDDEN_YES){
((SherlockFragmentActivity)getActivity()).getSupportActionBar().show();
}
}