私はこの問題を2,3時間苦労しており、キーボードが表示されているかどうかを判断する方法が見つかりません。
私はコンテナのレイアウトの高さを変えることに依存して、この問題について複数の質問と答えを見ました。 Edittextがフォーカスを取得し、結果として完全な高さのレイアウトで変化し、そのビューが避けられない場合、正確にキーボードの開口部を検出することはできません。Androidのソフトキーボードが閉じるのを検出しました
解決策1: 私は(に利用可能なスペースを作るのEditText Sの全てからフォーカスを削除することによってこの問題を解決して、私はEDITTEXTがフォーカスを取得するときに表示さにそれらを必要としないビューの表示を変更しますビューの乱れを防ぐ)ので、私は冗長なビューを削除するのに十分な時間があります。
ただし、キーボードを閉じてビューを表示するように要求されたことを検出することはできません。
2番目の段落で述べた共通の方法を使用してキーボードの終了を検出すると、「解決策1」が失敗します。
私が今抱えている唯一のアイデアは、キーボードのクロージャを担当するキーを監視してキーボードのクローズを検出することです。ボット私はonKeyDownメソッドでそれを検出することはできません。
ので、どのように私は、このキーを監視することができますか?
任意のガイドとアイデアが評価されます。 ありがとうございます。
最終解決:
@Nickカルドーゾのおかげで、私の最終的な解決策は、キーボードの開放性と閉鎖ニックのソリューションを検出するためのonTouchListener
を使用しての組み合わせです。
これはEdittextsためonTouchListenerです:
View.OnTouchListener TouchListener = new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN)
{
Container.getViewTreeObserver().removeOnGlobalLayoutListener(gll);
recyclerView.setVisibility(View.GONE);
final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
Container.getViewTreeObserver().addOnGlobalLayoutListener(gll);
}
}, 100);
}
return false;
}
};
ViewTreeObserver.OnGlobalLayoutListener gll = new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
Rect measureRect = new Rect();
Container.getWindowVisibleDisplayFrame(measureRect);
int keypadHeight = Container.getRootView().getHeight() - measureRect.bottom;
if (keypadHeight > 0) {
// keyboard is opened
} else {
recyclerView.setVisibility(View.VISIBLE);
}
}
};
ここContainer
は、レイアウトのルートビューです。
興味深く有望であるように+1を与えるが、それはおそらく、オンスクリーンではない画面で動作するアプリケーションでは機能しないだろう。ちょっとハックだが普遍的ではない – snachmsm
キーボードの状態が隠されていることが分かっているときにスクリーンハイトをキャッシングすることで回避できるかもしれないが、後でスプリットスクリーンに行くと、それは壊れる。 –