2009-10-20 25 views
6

Tôi đã tạo một trò chơi android đơn giản, dựa trên mẫu Lunar Lander và tôi đang gặp sự cố khi xử lý các sự kiện chính. Khi hoạt động bắt đầu, các phím duy nhất mà onKeyDown hoặc onKeyUp được gọi là các phím lên/xuống/trái/phải dpad. Các phím menu, back hoặc dpad_center đều kích hoạt các phương thứcKey. Tuy nhiên, một khi tôi đã đẩy một trong các nút lên/xuống/trái/phải của dpad, nhấn phím menu, back hoặc dpad_center để kích hoạt các phương thức này. Tôi không nhận được bất kỳ lỗi nào, hoặc bất kỳ dấu hiệu của những gì đang xảy ra.onKeyDown không phải lúc nào cũng được gọi trong ứng dụng Android

Có thể tập trung được đặt sai - hoạt động được bắt đầu từ một nút trên màn hình, vì vậy nó có thể ở chế độ màn hình cảm ứng. Nếu đúng như vậy, không nên chạm vào nút quay lại để tôi vào chế độ lấy nét phù hợp để tôi có thể bắt sự kiện này?

Tôi đang sử dụng trình giả lập từ SDK-1.5r3. Tôi chưa thể thử điều này trên điện thoại thực. Đây là onKeyDown của tôi.

public boolean onKeyDown(int keyCode, KeyEvent msg) 
{ 
    Log.d(TAG, "onKeyDown: " + keyCode); 
    return super.onKeyDown(keyCode, msg); 
} 

Cảm ơn

Matt

Trả lời

24

là onKeyDown này trong một cái nhìn hoặc trong hoạt động này?

Nếu setContentView được gọi là truyền trong một khung nhìn, và khung nhìn đó có setFocusable (true) được gọi trên đó, tất cả các sự kiện quan trọng sẽ bỏ qua hoạt động và đi thẳng vào khung nhìn.

Mặt khác, nếu onKeyDown của bạn ở chế độ xem và bạn chưa gọi setContentView trên Activity và setFocusable (true) trên màn hình, thì Activity của bạn sẽ nhận được các sự kiện chính chứ không phải View.

Hãy tìm những cuộc gọi cụ thể đó nhưng tôi nghĩ bạn đúng về vấn đề trọng tâm.

+6

Trong chế độ xem - nhưng trong khi kiểm tra điều này, tôi nhận ra rằng tôi không bật tính năng setFocusableInTouchMode - thêm điều đó vào sự cố đã khắc phục. –

+0

Ah, tuyệt. Tôi xin lỗi tôi đã bỏ lỡ vấn đề thực sự nhưng tôi rất vui vì tôi có thể giúp đỡ. – haseman

+1

Tôi đã thử điều này trong một đoạn nhưng onKeyDown() của chế độ xem của tôi không bao giờ được gọi ngay cả khi tôi đã đặt tiêu điểm của nó thành true: 'searchView.setFocusable (true); searchView.setFocusableInTouchMode (true); '. Các onKeyDown() của hoạt động không nhận được gọi là mặc dù, nhưng không phải cho phím trở lại không may. – faizal

6

Phương thức onKeyDown/onKeyUp của hoạt động không phải lúc nào cũng được gọi. Không giống như họ dispatchKeyEvent on Activity bắn luôn. Di chuyển logic khóa/khóa bàn phím tại đây. Hoạt động tốt.

@Override 
public boolean dispatchKeyEvent(KeyEvent event) { 
    if (event.getAction() == KeyEvent.ACTION_DOWN) { 
     // keydown logic 
     return true; 
    } 
    return false; 
} 
+1

Cảm ơn bạn đã đăng bài này. rất hữu ích :) –

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