2010-12-28 11 views
3

私はWindowManagerでカスタムビューを追加しましたが、すべてが正しいです。 ちょうど1つの問題:「BACK」を押したようなキーイベントをどこで捕まえることができません。 私のカスタムビューでは、 'View.dispatchKeyEvent()'メソッドのイベントの一部が捕捉されましたが、 'BACK'や 'HOME'は含まれませんでした。 アドバイスはありますか? ありがとう!WindowManagerでビューを追加したときにkeyeventsを処理する方法は?

私のコードは、ちょうどこのようなものです:あなたのビューで

// get WindowManager 

WindowManager windowManager = (WindowManager) getContext() 
    .getSystemService(Context.WINDOW_SERVICE); 

// set LayoutParams 

WindowManager.LayoutParams wmparams = new WindowManager.LayoutParams(
    WindowManager.LayoutParams.WRAP_CONTENT, 
    WindowManager.LayoutParams.WRAP_CONTENT); 

wmparams.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL; 

wmparams.format = PixelFormat.TRANSLUCENT; 

wmparams.windowAnimations = R.style.fade; 

// add this view to screen 

windowManager.addView(this, wmparams); 

this.setOnKeyListener(new OnKeyListener() { 

@Override 
public boolean onKey(View v, int keyCode, KeyEvent event) { 
    // cannot get 'BACK' pressed event here 
    return false; 
} 
}); 
+0

ソレブド。このViewのdispatchKeyEvent()メソッドでイベントを捕捉するだけです。 – akdd

+0

あなたのコードを表示できますか – Anthone

+1

@Anthone申し訳ありませんが、それは長すぎます、私は今コードを持っていません。しかし、単純です。単にdispatchKeyEvent()メソッドをオーバーライドし、super.dispatchKeyEvent()を呼び出す前にコードを記述してください。 – akdd

答えて

0

は、ウィンドウマネージャに追加、私はそれがうまく

0
FrameLayout view = new FrameLayout(getActivity()) { 
    @Override 
    public boolean dispatchKeyEvent(KeyEvent event) { 
     if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) { 
      // do you code 
      return true; 
     } 
     return super.dispatchKeyEvent(event); 
    } 
}; 
ワーキングサービスでウィンドウマネージャでテストしていたこの

root.setOnKeyListener(this); 
    root.requestFocus(); 
    root.setFocusable(true); 
    root.setFocusableInTouchMode(true); 

を追加してみましょう

フラグを設定しない:

WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE 
関連する問題