2011-08-11 19 views
3

我有一個自定義的VerticalFieldManager自定義擴展,可自動滾動顯示數據給用戶。在VFM之上和之下,還有其他用戶可以與之交互的組件。在OS5上,這個功能完美,完全符合我的預期。在OS6上,通過內置的「平滑滾動」功能,當用戶嘗試從VFM上方的字段滾動到下面的字段時,VFM會根據用戶的輸入滾動,然後將焦點轉移到VFM下方的字段。如何覆蓋操作系統中的默認滾動行爲6

是否有任何方法可以覆蓋此行爲並告訴操作系統離開我的VFM?在OS5中,這是一個簡單的做法,使VFM不可調焦。

我已經試過擺動垂直調整和VFM垂直量化沒有運氣。 VFM從未真正獲得焦點,操作系統只是滾動它。我認爲操作系統認爲它有幫助,但事實並非如此! :)

回答

1

我通過重寫navigationMovement功能父管理者,這樣的事情想出了一個解決方案非常頂級,從最底層向下滾動,因爲操作系統再次接管並「幫助」我滾動不可聚焦的VFM。

1

您可能會在父管理器中混淆nextFocus()以跳過中間的VFM。也許也可以覆蓋onFocus()中間,然後轉到下一個。我知道它應該通過將其設置爲不可聚焦的方式來完成此操作,但可能會覆蓋isFocusable()以返回false。

protected boolean navigationMovement(int dx, int dy, int status, int time) { 
    if (getField(getFieldWithFocusIndex()) == tabbar) { 
     Field f = tabbar.getFieldWithFocus(); 
     if (f == lastTabButton) { 
      if (dy > 0) { 
       tabData.setFocus(); 
       return true; 
      } 
     } else if (f == firstTabButton) { 
      if (dy < 0) { 
       return true; 
      } 
     } 
    } else if (getField(getFieldWithFocusIndex()) == tabData) { 
     MyTab tab = (MyTab) tabs.get(tabData); 
     if (tab != null && !tab.willHandleNavigationMovement(dx, dy)) { 
      if (dy != 0) { 
       if (dy < 0) 
        lastTabButton.setFocus(); 
       return true; 
      } 
     } 
    } 

    return super.navigationMovement(dx, dy, status, time); 
} 

你會在上面,我不得不也覆蓋從向上滾動時行爲的代碼見:

+0

謝謝。已經嘗試過這些。 *焦點*從不進入中間的VFM。它一直保持在VFM之上,直到VFM滾動到底部,此時它跳到VFM下方。 –

+1

啊有趣...也許增加一個ScrollChangeListener,如果它開始重置它回到垂直0和改變焦點? – jprofitt

+0

另一個好主意,不幸的是,我確實需要VFM滾動,只是當我以編程方式告訴它時,而不是當用戶嘗試移動光標時。嗯,但也許如果我讓我的滾動邏輯非常複雜,我可以告訴我的滾動和操作系統滾動之間的區別... –