2011-11-16 53 views
5

Tôi đang cố gắng nắm bắt sự kiện nút quay lại cho Android. Tôi biết có rất nhiều về điều này đã có trên các hình thức, tuy nhiên, mã của tôi không hoạt động như các ví dụ được đưa ra. Dưới đây là đoạn mã của tôi để nắm bắt sự kiện:Không thể bắt sự kiện nút quay lại Android

@Override 
public boolean onKeyDown(int keyCode, KeyEvent event){ 
    if(keyCode == KeyEvent.KEYCODE_BACK){ 
     Log.d(TAG, "back key captured"); 
     return true; 
    } 
    return super.onKeyDown(keyCode, event); 
} 

Tôi cũng đã cố gắng này:

@Override 
public void onBackPressed(){ 
    Log.d(TAG, "in onBackPressed"); 
    finish(); 
} 

Kết quả từ LogCat mà một trong hai sự kiện bị đuổi việc không hiển thị. Bất cứ ai biết một lý do có thể cho điều này?

Cảm ơn.

+1

Bắt đầu bằng cách thêm nhật ký trước khi kiểm tra để đảm bảo bạn thực hiện phương pháp. Nếu không, hãy đảm bảo Chế độ xem của bạn là Chế độ xem hiện đang được tập trung. Nếu không, nó sẽ không nhận được các sự kiện onKey. –

+0

Trong ví dụ đầu tiên, khi nhấn nút quay lại, hành vi mặc định có xảy ra không? –

Trả lời

15

Một phương pháp khác là ghi đè phương pháp public void onBackPressed(). Nó đơn giản hơn và dễ dàng hơn để làm.

+0

hmmm Tôi vừa thử điều đó và nó không hoạt động. Xem chỉnh sửa của tôi. – coder

+3

Thật sao? Đó là khá lạ, bạn đang làm điều này từ một hoạt động bình thường và không có gì là hiển thị ở tất cả? Có lẽ hãy thử làm cho nó hiển thị một bánh mì nướng khi nút quay lại được nhấn chỉ để kiểm tra kỹ xem trình gỡ rối của bạn có gặp sự cố không. – Brian

-1

Dưới đây là cách tôi triển khai xử lý sự kiện nhấn phím quay lại.

/** 
    * onKeyDown method 
    * 
    * Executes code depending on what keyCode is pressed. 
    * 
    * @param int keyCode 
    * @param KeyEvent 
    *   event KeyEvent object 
    * 
    * @return true if the code completes execution, false otherwise 
    * 
    */ 
    @Override 
    public boolean onKeyDown(int keyCode, KeyEvent event) {   
    switch (keyCode) { 
    case KeyEvent.KEYCODE_BACK: 
     Log.d(TAG, "back key captured"); 

     this.onBackPressed(); 

     //You could also use this.moveTaskToBack(true) to return to the Home screen 

     return true; 

    default: 
     return super.onKeyDown(keyCode, event); 
    } 
    }// end onKeyDown 
2

Bàn phím ảo có hiển thị không? Chế độ xem đó sẽ chụp lại chìa khóa trước để loại bỏ nó trước khi mã của riêng bạn có thể xử lý nó.

+0

Tôi thực sự đang cố gắng sử dụng phím quay lại để loại bỏ bàn phím tùy chỉnh của riêng – coder

+1

cách trễ, nhưng đối với bất kỳ ai khác tình cờ gặp phải câu hỏi này, http://stackoverflow.com/questions/3940127/intercept-back-button-from- bàn phím mềm có thể rất hữu ích trong trường hợp phương thức Activity # onBackPressed() chuẩn không hoạt động. – qix

8

Để nhận sự kiện bàn phím, Chế độ xem phải có tiêu điểm. Để buộc sử dụng này:

view.setFocusableInTouchMode(True); 
view.requestFocus(); 
1

này làm việc cho tôi

private long lastBackPressTime = 0; 
    @Override 
public void onBackPressed() { 
    if (this.lastBackPressTime < System.currentTimeMillis() - 4000) { 
     Toast.makeText(this, R.string.backButtonWarning, 4000).show(); 
     this.lastBackPressTime = System.currentTimeMillis(); 
    } else { 
     super.onBackPressed(); 
    } 
} 

Gần đây iv'e được thử nghiệm một số tiền rất lớn của các vấn đề do các plugin ADT, rằng doest tạo te tập tin tài nguyên apropiate (R) . Vì vậy, hãy kiểm tra kỹ xem bạn đã làm sạch dự án của bạn

1

Tình huống của tôi có thể không bình thường, nhưng tôi đã có hành vi tương tự như vậy nên tôi nghĩ tôi sẽ chia sẻ với lớp học! Lý do kết thúc là bên trong sự kiện onResume() của tôi cho Hoạt động, tôi đã bắt đầu một hoạt động khác. Hoạt động đó đã kết thúc trước khi nó hiển thị bất kỳ giao diện người dùng nào, nhưng nó có nghĩa là "onResume" cho hoạt động chính của tôi liên tục được gọi bất cứ khi nào hoạt động phụ hoàn tất và các sự kiện nút quay lại dường như biến mất trong hoạt động phụ.

Các vấn đề liên quan