2013-01-18 22 views
9

Tôi có một danh sách xem có số lần xem trong mỗi mục danh sách, khi người dùng nhấp vào hình ảnh đó, nó sẽ bật lên một menu .Cách sử dụng chuyển hướng điều hướng D-pad giữa hàng của listview và số người quyết định (hỗ trợ Google-TV)

Nó hoạt động rất tốt trên thiết bị Android thông thường với màn hình cảm ứng.

Nhưng bây giờ tôi muốn hỗ trợ google-tv, ứng dụng nên được kiểm soát bởi D-pad.

Khi tôi sử dụng D-pad để điều hướng thông qua chế độ xem danh sách, chỉ toàn bộ hàng có thể được lấy nét, tôi không thể lấy được số lần xem trong phần xem danh sách bên trong.

Tôi cố gắng thêm android: focusable = "true" vào imageview, nhưng nó khiến toàn bộ listview không thể nhận sự kiện onItemClick.

Có ai biết cách di chuyển trọng tâm giữa các hàng listview và mục bên trong listview sử dụng d-pad cũng giữ listview và imageview có thể nhấp không?

Cảm ơn rất nhiều!

Trả lời

2

Tôi đã nhận được công việc Listview với D-pad có thể chuyển tiêu điểm bên trong một mục danh sách. Đây là cách tôi giải quyết nó. Trước tiên, hãy để chế độ xem danh sách của bạn là mục có thể đặt tiêu điểm. LƯU Ý: Nếu bạn cố gắng đặt ItemsCanFocus thành false sau này trong mã của bạn, bạn sẽ thấy mục danh sách của bạn không thể lấy tiêu điểm nữa ngay cả khi bạn đặt lại thành true, do đó đừng làm điều đó.

mDpadListView.setItemsCanFocus(true); 

Sau đó, bạn cần trường để theo dõi mục danh sách nào được chọn hiện tại. Ở đây tôi đặt ViewHolder trong thẻ listItem trong Bộ điều hợp.

mDpadListView.setOnItemSelectedListener(new OnItemSelectedListener() { 
    @Override 
    public void onItemSelected(AdapterView<?> parent, View view, 
      int position, long id) { 
     if (view.getTag() != null) { 
      DpadListAdapter.ViewHolder holder = (ViewHolder) view.getTag(); 
      if (holder.shortCut != null && holder.shortCut.isShown()) { 
       currentSelectView = view; 
      } else { 
       currentSelectView = null; 
      } 
     } else { 
      currentSelectView = null; 
     } 
    } 

    @Override 
    public void onNothingSelected(AdapterView<?> parent) { 
    } 
}); 

Thứ ba, ghi đè lênKeyDown() trong Phương thức hoạt động để điều khiển lên, xuống, trái, phải cho phím D-pad.

Khi người dùng nhấn nút phải trên D-pad, tôi cho phép listview là clearFoucs() và để ImageView bên trong lấy tiêu điểm.

Khi người dùng nhấn lên, xuống hoặc xuống, mục ImageView trong danh sách sẽ xóa tiêu điểm và danh sáchXem lấy tiêu điểm một lần nữa.

@Override 
public boolean onKeyDown(int keyCode, KeyEvent event) { 
    switch (keyCode) { 
    case KeyEvent.KEYCODE_DPAD_RIGHT: 
     if (currentSelectView != null) { 
      DpadListAdapter.ViewHolder holder = 
       (ViewHolder)  currentSelectView.getTag(); 
      mDpadListView.clearFocus(); 
      holder.shortCut.setFocusable(true); 
      holder.shortCut.requestFocus(); 
      return true; 
     } 
     break; 
    case KeyEvent.KEYCODE_DPAD_LEFT: 
    case KeyEvent.KEYCODE_DPAD_UP: 
    case KeyEvent.KEYCODE_DPAD_DOWN: 
     if (currentSelectView != null) { 
      DpadListAdapter.ViewHolder holder = 
        (ViewHolder) currentSelectView.getTag(); 
      if (holder.shortCut.hasFocus()) { 
       holder.shortCut.clearFocus(); 
       holder.shortCut.setFocusable(false); 
       mDpadView.requestFocus(); 
       return true; 
      } 
     } 
     break; 
    default: 
     break; 
    } 
    return super.onKeyDown(keyCode, event); 
} 
+0

Xin chào, tôi cần trợ giúp, tôi muốn biết làm thế nào nếu tôi chọn một mục có d-pad, sau đó thay đổi màu nền. – wdyz

+0

bạn cần sử dụng danh sách trạng thái có thể vẽ trên hình nền của mặt hàng của bạn, cung cấp cho android: state_focused = "true" một hình ảnh khác với trạng thái bình thường. ref: http://developer.android.com/guide/topics/resources/drawable-resource.html#StateList – henry74918

+0

Hi, những gì là currentSelectView – Andrain

0

Bạn có thể sử dụng các thuộc tính để truy cập vào D-pad như sau trong file layout của bạn:

 android:nextFocusLeft="@+id/abc" 
     android:nextFocusRight="@+id/xyz" 
     android:nextFocusUp="@+id/pqr" 
     android:nextFocusDown="@+id/mno" 
     android:nextFocusForward="@+id/finish" 

này tất cả các thuộc tính sẽ giúp bạn truy cập vào D-pad trong Google-TV .

+0

nội dung listview và listview không nằm trong cùng một xml, vì vậy tôi không biết cách di chuyển tiêu điểm từ chế độ xem danh sách vào nội dung của danh sách (như lần xem hoặc xem văn bản). – henry74918

6

Bạn phải đặt sau cho ListView của bạn:

listView.setItemsCanFocus(true); 

Với rằng quan điểm thể đặt tiêu điểm bên trong của listitems của bạn sẽ không bị bỏ qua.

+0

không biết làm thế nào tôi đã không nhìn thấy một trong các tài liệu, nhưng nó hoạt động tuyệt vời.điều duy nhất tôi phải làm trong trường hợp của tôi là ghi đè getVerticalFadingEdgeLength, trong khi ngẫu nhiên trở về 42 dường như làm cho nó hoạt động. thủ thuật này xem danh sách để luôn luôn có đủ của hàng tiếp theo xuống/lên có sẵn để tập trung. nếu không, nếu hàng cuối cùng xếp hàng chính xác với đầu/cuối màn hình, tiêu điểm sẽ bị kẹt. – user2399268

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