2016-08-02 11 views
1

フラグメント上に、次のOnKeyListenerがあります。現在表示されている場合は、そのフラグメントの内部のビューを非表示にします。それが表示されていない場合、私はキーを押すとAndroidは消費しません。ソフトキーボードが隠された後、OnKeyListenerが機能しなくなる

getView().setOnKeyListener(new View.OnKeyListener() { 
     @Override 
     public boolean onKey(View v, int keyCode, KeyEvent event) { 
      if ((keyCode == KeyEvent.KEYCODE_BACK) && (event.getAction() == KeyEvent.ACTION_DOWN)) { 
       if (isSomeViewShowing) { 
        hideSomeView(); 
        return true; 
       } 
       // Back pressed but view is not showing. Not consuming the event. 
       return false; 
      } 
      // Back not pressed. Not consuming the event. 
      return false; 
     } 
    }); 

それは、ビューとビューがない場合、通常のフラグメント/アクティビティbackstackに入るを隠すためにうまく動作しますが、それはユーザーがのEditTextでの入力テキストにソフトキーボードを使用している場合は動作を停止し、その後、皮革キーボード。

私は、ソフトキーボードの場合、OnKeyListenerが機能しないことを知っています。これは私のニーズにとっては問題ありません。入力が終わってキーボードが隠された後にリスナーが作業を続けるだけでいいです。

これを防ぐ方法はありますか?

回避策はlisten for when keyboard is dismissedになり、キーボードが解除されたときに再びOnKeyListenerを追加しますが、これを実装すると単純なタスクに複雑さが増します。

答えて

2

fragmentを使用しているactivityonBackPressed()を無効にして、fragmentにメッセージを送信して、キーバックが押されたことを知ることができます。このような何か:

活動:

/** 
* Triggered when the user press back button 
*/ 
@Override 
public void onBackPressed(){ 

    mYourFragment.onBackPressed(); 

} 

フラグメント:

public void onBackPressed(){ 

    if (isSomeViewShowing) { 
     hideSomeView(); 
    } 

} 
+0

ありがとうございました。私はこれを他のフラグメントでやったことがありますが、アクティビティを変更することなく実装することはできません。とにかく問題を本当に解決する唯一の解決策であると思われるので、私はこれをやります。 – buzoherbert

関連する問題