2012-09-12 66 views
3

我試圖做的是攔截後退按鈕按下從外部類這樣的:從查看或外部類中重寫後退按鈕按下

public class AnswerView extends RelativeLayout { 

    public AnswerView(Context context) { 
     super(context); 
    } 

    @Override 
    public boolean onKeyDown(int keyCode, KeyEvent event) { 
     if(keyCode == KeyEvent.KEYCODE_BACK) { 
      Log.i("AlleAntwoorden", "Back button pressed!"); 
      return true; 
     } 
     return super.onKeyDown(keyCode, event); 
    } 
} 

我加入像這樣從我的主要活動:

RelativeLayout mainLayout = (RelativeLayout) findViewById(R.id.main_layout); 
mainLayout.addView(new AnswerView(this)); 
+0

通過提供可讀的,格式良好的代碼,您可謂一個良好的開端,但您真正的問題是什麼? – Sam

+0

@Sam我試圖攔截用戶在Android設備上按下後退按鈕時的默認行爲,但不是從主Activity中,而是從主Activity中的View中截取。 –

回答

5

爲了讓View接收任何事件,它需要有焦點。我沒有看到任何XML,所以讓我們在運行時添加了幾個特點:

AnswerView layout = new AnswerView(this); 
layout.setFocusableInTouchMode(true); 
layout.requestFocus(); 
mainLayout.addView(layout); 

現在,你的佈局會在你OnKeyListener截獲後退按鈕。但是,如果另一個視圖具有焦點,即使是子視圖,該事件也可能首先被小孩消費。
要理解這一點,添加一個EditText您AnswerView:

layout.addView(new EditText()); 

如果單擊後退按鈕而EditText上具有焦點:第一次單擊關閉軟鍵盤,第二次點擊將完成當前活動像正常。默認情況下,OnKeyListener事件不會通過View層次結構向上傳遞。

+0

謝謝。你的回答可以幫助我很多。 – anticafe

相關問題