2

在我的圖像中有一個邊欄和ListView,我使用D-PAD訪問每個按鈕。 當側欄搜索按鈕具有焦點並按下右側的D-PAD按鈕時,我想讓焦點轉到ListView的第一項。但是,就我而言,這是第二項。如果向下箭頭有焦點,我按下右鍵它會到第四個列表item.So,我也需要防止這也。如何將焦點移動到第一個?列表視圖使用D-PAD時的焦點

if (Search != null && Search.hasFocus()) { 
      // Search.setNextFocusRightId(R.id.listView); 
//   listView.smoothScrollToPosition(0); 
      listView.setChoiceMode(1); 
      listView.setItemChecked(0, true); 
     } 

enter image description here

+0

您能簡單介紹一下您的實際需求嗎? @Boopathi。什麼是側邊欄?這是一個觀點還是什麼?如果可以,請發佈佈局xml。 – 2014-10-17 10:26:28

+0

@Boopathi在默認情況下始終關注listview的第一項。我認爲你有getView()方法適配器的條件。 – Lokesh 2014-10-18 06:52:38

+0

http://dev.booknow.club/api/category.php?format=json http://dev.booknow.club/api/listing.php?category_id=1&format=json – Boopathi 2014-10-18 08:19:13

回答

1

做一個虛擬視圖沒有背景,並將其放置在相同的佈局爲您的列表視圖。 使其焦點集中並將搜索視圖的nextFocusRight設置爲id/dummy。

<ListView 
    android:id="@+id/listview" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:choiceMode="singleChoice" 
    android:listSelector="@null" 
    android:background="@null" 
    ></ListView> 
<View 
    android:id="@+id/dummy" 
    android:layout_width="1dp" 
    android:layout_height="1dp" 
    android:focusable="true" 
    /> 

你搜索查看:

<YourSearchView 
android:[email protected]+id/dummy/> 

然後在代碼中,設置一個OnFocusChangedListener到虛擬視圖,這將表明的ListView應該獲得焦點。在監聽器裏,要求重點用於ListView和設置選擇爲0如下:

View dummy = rootView.findViewById(R.id.dummy); 
     dummy.setOnFocusChangeListener(new View.OnFocusChangeListener() 
     { 
      @Override public void onFocusChange(View v, boolean hasFocus) 
      { 
       if (hasFocus) 
       { 
        listView.post(new Runnable() { 
         @Override 
         public void run() { 
          listView.requestFocus(); 
          listView.setSelection(0); 
         } 
        }); 
       } 
      } 
     }); 

請確保您使用@ + ID爲nextFocusItemRight代替@id。 希望它有幫助,否則發表評論。

+0

我試過上面的想法,它不起作用。如果搜索按鈕有焦點,我點擊右側的D-Pad按鈕,現在啞視圖和列表視圖都變得焦點了。 – Boopathi 2014-10-09 10:57:10

+0

您是否在xml中製作了虛擬視圖focusable? – vandus 2014-10-09 10:57:58

+0

是的,我做了那一個 – Boopathi 2014-10-09 11:00:22

2

要做的最好的事情是在Activity類中覆蓋dispatchKeyevent,然後在ListView中將焦點/選擇設置到任何你喜歡的地方。

@Override 
public boolean dispatchKeyEvent(KeyEvent event) { 




    boolean handled = super.dispatchKeyEvent(event); 

    if(!handled && event.getAction() == KeyEvent.ACTION_UP) 
    { 
     if(yourParentViewGroup.getFocusedChild() is your SearchView && event.getKeyCode() == KeyEvent.KEYCODE_DPAD_RIGHT) 
     { 

      yourListvIew.setSelction(0); 
      handled = true; 
     } 

    } 

    return handled; 

但要記住返回「真」,如果你要處理的焦點或選擇邏輯否則它會調用Android的focusfinder算法和對焦/選擇將轉移到最近的視圖。

相關問題