2013-01-18 2 views
9

각 목록 항목 내에 imageview가있는 listview가 있습니다. 사용자가 해당 imageview를 클릭하면 메뉴가 팝업됩니다 .listview의 행과 그 뒤집기 사이의 D- 패드 탐색 스위치 사용 방법 (Google-TV 지원)

터치 스크린이있는 일반 안드로이드 장치에서 잘 작동합니다.

하지만 지금은 D-pad로 제어해야하는 google-tv를 지원하고 싶습니다.

D 패드를 사용하여 listview를 탐색 할 때 전체 행만 포커스가 될 수 있습니다. listview 내부의 이미지 뷰를 포커스 할 수 없습니다.

android : focusable = "true"를 imageview에 추가하려고 시도하지만 전체 listview가 onItemClick 이벤트를 수신하지 못하게합니다.

d- 패드를 사용하여 listview 행과 항목 사이에서 포커스를 이동하는 방법을 알고있는 사람도 listview 및 imageview를 클릭 할 수있게 유지합니까?

고맙습니다.

답변

2

목록 항목 내부에서 포커스를 전환 할 수있는 D 패드로 Listview 작업을 수행했습니다. 이것은 어떻게 해결할 수 있습니다. 먼저 목록보기에 항목을 집중시킬 수있게하십시오.

참고 : 나중에 코드에서 ItemsCanFocus를 false로 설정하려고하면 다시 true로 설정하더라도 목록 항목에서 포커스를 얻을 수 없습니다.

mDpadListView.setItemsCanFocus(true); 

그러면 현재 선택된 목록 항목을 추적하는 필드가 필요합니다. ViewHolder를 Adapter의 listItem 태그에 넣습니다.

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) { 
    } 
}); 

셋째, D- 패드의 위쪽, 아래쪽, 왼쪽, 오른쪽 키를 제어하기 위해 Activity Method에서 onKeyDown()을 재정의하십시오.

사용자가 D 패드에서 오른쪽 버튼을 누르면 listview를 clearFoucs()로 보내고 포커스를 얻기 위해 ImageView 내부를 보겠습니다.

사용자가 위, 아래 또는 왼쪽을 누르면 목록 항목의 ImageView에서 초점이 지워지고 listView에서 다시 초점을 얻습니다.

@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

안녕하세요, 도움이 필요합니다. D 패드가있는 항목을 선택한 다음 배경색을 변경하는 방법을 알고 싶습니다. – wdyz

+0

항목의 배경 이미지에 상태 목록 드로어 블을 사용해야합니다. android : state_focused = "true"보통 상태와 다른 이미지를 제공하십시오. ref : http://developer.android.com/guide/topics/resources/drawable-resource.html#StateList – henry74918

+0

안녕하세요, currentSelectView는 무엇입니까 – Andrain

0

당신은 당신의 레이아웃 파일에 아래와 같이 D 패드에 액세스하는 속성을 사용할 수 있습니다 :

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

이 모든 속성이 구글 TV의 D 패드에 액세스하는 데 도움이됩니다 .

+0

listview와 listview의 내용이 같은 xml이 아니므로 listview의 내용을 listview의 내용 (예 : imageview 또는 textview)으로 옮기는 방법을 모르겠습니다. – henry74918

6

당신은 당신의 ListView에 대해 다음 설정해야합니다 : 당신의 많은 ListItems 내부에 그 포커스 전망

listView.setItemsCanFocus(true); 

무시할 수없는 것이다.

+0

내가 어떻게 문서에서 그 하나를 보지 못했는지 모르지만 그것은 훌륭하게 작동합니다.내 경우에해야 할 유일한 다른 것은 getVerticalFadingEdgeLength를 오버라이드하는 것이고, 무작위로 42를 반환하는 것은 동작을 얻는 것처럼 보입니다. 이것은리스트 뷰를 속여서 초점을 맞추기 위해 항상 아래로/아래로 다음 행을 가질 수 있습니다. 그렇지 않으면 마지막 행이 화면의 위쪽/아래쪽과 정확히 일치하면 초점이 멈 춥니 다. – user2399268