2017-03-19 9 views
2

私はこの問題を2,3時間苦労しており、キーボードが表示されているかどうかを判断する方法が見つかりません。

私はコンテナのレイアウトの高さを変えることに依存して、この問題について複数の質問と答えを見ました。 Edittextがフォーカスを取得し、結果として完全な高さのレイアウトで変化し、そのビューが避けられない場合、正確にキーボードの開口部を検出することはできません。Androidのソフトキーボードが閉じるのを検出しました

解決策1: 私は(に利用可能なスペースを作るのEditText Sの全てからフォーカスを削除することによってこの問題を解決して、私はEDITTEXTがフォーカスを取得するときに表示さにそれらを必要としないビューの表示を変更しますビューの乱れを防ぐ)ので、私は冗長なビューを削除するのに十分な時間があります。

ただし、キーボードを閉じてビューを表示するように要求されたことを検出することはできません。

2番目の段落で述べた共通の方法を使用してキーボードの終了を検出すると、「解決策1」が失敗します。

私が今抱えている唯一のアイデアは、キーボードのクロージャを担当するキーを監視してキーボードのクローズを検出することです。ボット私はonKeyDownメソッドでそれを検出することはできません。

enter image description here

ので、どのように私は、このキーを監視することができますか?

任意のガイドとアイデアが評価されます。 ありがとうございます。

最終解決:
@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は、レイアウトのルートビューです。

答えて

8

これを行う簡単で信頼できる方法はありません。ただし、レイアウトリスナーを使用して、hereの2つの部分で実現できます。それはハックの少しだが、それは動作します:

mRootView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { 
    @Override 
    public void onGlobalLayout() { 
     Rect measureRect = new Rect(); //you should cache this, onGlobalLayout can get called often 
     mRootView.getWindowVisibleDisplayFrame(measureRect); 
     // measureRect.bottom is the position above soft keypad 
     int keypadHeight = mRootView.getRootView().getHeight() - measureRect.bottom; 

     if (keypadHeight > 0) { 
      // keyboard is opened 
      mIsKeyboardVisible = true; 
      mMyDependentView.setVisibility(View.GONE); 
     } else { 
      //store keyboard state to use in onBackPress if you need to 
      mIsKeyboardVisible = false; 
      mMyDependentView.setVisibility(View.VISIBLE); 
     } 
    } 
}); 
+0

興味深く有望であるように+1を与えるが、それはおそらく、オンスクリーンではない画面で動作するアプリケーションでは機能しないだろう。ちょっとハックだが普遍的ではない – snachmsm

+0

キーボードの状態が隠されていることが分かっているときにスクリーンハイトをキャッシングすることで回避できるかもしれないが、後でスプリットスクリーンに行くと、それは壊れる。 –

0

そのビットの推測、しかし、あなたには、いくつかのOnEditorActionListener操作で上書きonBackPressedを試すことができます。その後、

yourEditText.setOnEditorActionListener(new OnEditorActionListener() { 

    @Override 
    public boolean onEditorAction(TextView v, int actionId, 
      KeyEvent event) { 
     // or other action, which you are using 
     if (actionId == EditorInfo.IME_ACTION_SEARCH) { 
      runSearch(); 
      return true; 
     } 

     return false; 
    } 
}); 

onBackPressed(そしておそらくonKeyDownも) (そう考えて...)

+0

ほとんどの場合"accepting"フィールド(およびキーボードを閉じる)のキーボードにボタンがあります - Searchキー、Enterなど。このキーはtrueを返します(キーボードは終了します)。他のアクションはfalseを返します(この場合、おそらくBackはfalseを返すべきであり、他のすべては真です...)。あなたのコードの中で押されたアクションを "聞く"ことができます。 'onBackPressed'です。あなたの 'Activity'の内部の上記のメソッドが、(バックプレスに関連して)起動しないように、リスナーを設定しないでください。 – snachmsm

+0

別のアイデア:[dispatchKeyEventPreIme(KeyEvent event)]をオーバーライドしようとしましたか(https://developer.android.com/reference/ android/view/View.html#dispatchKeyEventPreIme(android.view.KeyEvent))メソッド? keybaordが開いていることを知っているときは、 'if(event.get.getKeyCode()== KeyEvent.KEYCODE_BACK)'を試して、最後に 'super.dispatchKeyEventPreIme(event);を呼び出すことができます。 [dispatchKeyShortcutEvent](https://developer.android.com/reference/android/view/View.html#dispatchKeyShortcutEvent(android.view.KeyEvent))メソッドも役立ちます – snachmsm

関連する問題