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?

44
demandé sur Nirav Dangi 2010-09-25 12:44:43

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.

29
répondu woodshy 2012-08-07 18:24:09

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.

18
répondu hackbod 2010-09-25 17:50:44

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é.

4
répondu Varun Verma 2015-08-11 08:35:44

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");
            }
        });
    }
}
2
répondu Lolme 2014-11-22 23:47:12

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.

1
répondu single-minded 2013-03-11 16:35:23

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.

0
répondu John smith 2017-05-23 12:02:03

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();
   }
}
-6
répondu ePeace 2014-03-25 02:28:59