2012-05-06 25 views
7

Ứng dụng của tôi có ListViewEditText nằm bên dưới. Vì một số lý do, khóa TAB không kích hoạt onKeyListener. Tất cả các khóa khác mà tôi đang xử lý (DEL, ENTER, DPAD_UP/DOWN/CENTER) đều được nhận. Tôi đã thêm một điểm ngắt trong dispatchKeyEvent, một lần nữa không may mắn nhận được sự kiện TAB.EditText không nhận được sự kiện chính TAB - cổ phần mềm vk

Ứng dụng của tôi trước đó có số lượng lớn TextView để hiển thị văn bản và trong thời gian này, các sự kiện TAB đã được nhận tiền phạt. ListView hiện đã thay thế TextView.

Tôi hoàn toàn bị hoang mang là tại sao sự kiện TAB không còn được nhận. Đây là trên một cổ phiếu Xoom, chạy ICS 4.0.4 & cổ phiếu N1, với 2.3.6.

Tôi đã so sánh mã hiện tại của mình với phiên bản bằng cách sử dụng TextView và phần lớn mã chỉ để xử lý ListView ở vị trí của TextView. Ngoài các thuộc tính nextFocusLeftnextFocusRight, không có gì khác đã thay đổi cho EditText.

Chỉnh sửa: Tôi vừa thử với Bàn phím đi và Bàn phím của hacker và TAB được nhận tiền phạt. Có vẻ như đây chỉ là một số bàn phím ảo

Trả lời

0

Tôi nghĩ rằng tôi có thể thấy sự cố. Nhìn vào nguồn cho ListView.java, có một cơ chế để tiêu thụ các sự kiện quan trọng thay đổi tiêu điểm trong một mục danh sách. Kiểm tra các chú thích trước phương thức này cũng như khối các chú thích ở giữa phương thức.

/** 
* To avoid horizontal focus searches changing the selected item, we 
* manually focus search within the selected item (as applicable), and 
* prevent focus from jumping to something within another item. 
* @param direction one of {View.FOCUS_LEFT, View.FOCUS_RIGHT} 
* @return Whether this consumes the key event. 
*/ 
private boolean handleHorizontalFocusWithinListItem(int direction) { 
    if (direction != View.FOCUS_LEFT && direction != View.FOCUS_RIGHT) { 
     throw new IllegalArgumentException("direction must be one of" 
       + " {View.FOCUS_LEFT, View.FOCUS_RIGHT}"); 
    } 

    final int numChildren = getChildCount(); 
    if (mItemsCanFocus && numChildren > 0 && mSelectedPosition != INVALID_POSITION) { 
     final View selectedView = getSelectedView(); 
     if (selectedView != null && selectedView.hasFocus() && 
       selectedView instanceof ViewGroup) { 

      final View currentFocus = selectedView.findFocus(); 
      final View nextFocus = FocusFinder.getInstance().findNextFocus(
        (ViewGroup) selectedView, currentFocus, direction); 
      if (nextFocus != null) { 
       // do the math to get interesting rect in next focus' coordinates 
       currentFocus.getFocusedRect(mTempRect); 
       offsetDescendantRectToMyCoords(currentFocus, mTempRect); 
       offsetRectIntoDescendantCoords(nextFocus, mTempRect); 
       if (nextFocus.requestFocus(direction, mTempRect)) { 
        return true; 
       } 
      } 
      // we are blocking the key from being handled (by returning true) 
      // if the global result is going to be some other view within this 
      // list. this is to acheive the overall goal of having 
      // horizontal d-pad navigation remain in the current item. 
      final View globalNextFocus = FocusFinder.getInstance().findNextFocus(
        (ViewGroup) getRootView(), currentFocus, direction); 
      if (globalNextFocus != null) { 
       return isViewAncestorOf(globalNextFocus, this); 
      } 
     } 
    } 
    return false; 
} 

Có nhiều mục có thể đặt tiêu điểm trong một phần tử danh sách không? Nếu vậy, mã này sẽ tiêu thụ khóa tab. Nếu trường hợp đó xảy ra, thì bạn có thể muốn thực hiện một số mục không tập trung hoặc xem xét một tùy chọn thiết kế khác.

+0

Tôi thiết lập dự án thử nghiệm để kiểm tra điều này và rất tiếc là nó không hoạt động. Edittext luôn có tiêu điểm nên nó luôn luôn nhận được keyevent, hoặc ít nhất, nó phải được bắt trong dispatchKeyEvent. Điều này làm việc tốt với bàn phím Hackers nhưng không phải là một trong những cổ phiếu. Tôi đã tải lên dự án thử nghiệm tại đây http://dl.dropbox.com/u/78755665/Test.zip Mọi thứ được đặt thành không tập trung trong listview –

+0

Tôi đã kiểm tra kỹ, nó chắc chắn là tập tin đúng. –

+0

Khi tôi chạy nó trên Samsung Galaxy SII Epic 4G của tôi, bàn phím mềm thậm chí không hiển thị một phím tab. –