2010-04-20 74 views
1

我正在寫一個黑莓應用程序,我有以下問題:黑莓手機:如何正確處理自定義字段中的焦點遍歷?

我已經通過擴展Manager類實現了一個自定義字段。該領域非常簡單,它由一個標籤和兩個複選框組成,是和否。這些字段的佈局使得標籤位於左側並儘可能多地佔用空間,同時仍然爲複選框留出空間,這些複選框在右側彼此相鄰並且與標籤相比垂直居中(如果它跨越多於一行)。所以它看起來像這樣:

這是一個問題? O是O沒有

就佈局領域而言,一切都很好。但是現在我正在嘗試處理焦點遍歷。首先,用戶向上或向下滾動時的默認行爲是在yes和no選項之間移動。我想按下向上或向下時,上方或下方移動到下一個領域,所以我這樣做:

protected int moveFocus(int amount, int status, int time) { 
    if (status == 537001984 || status == -1610481664) { // Up or down was pressed 
     // Don't move focus between yes and no when up or down is pressed. 
     return amount; 
    } 
    return super.moveFocus(amount, status, time); 
} 

這似乎工作。

我想要做的下一件事是記住哪個選項最後有焦點,當領域失去焦點,然後再次獲得焦點(無論焦點來自哪個方向)設置此字段有焦點。我試圖覆蓋Unfocus和onFocus,以便在Unfocus上注意哪個字段已被聚焦,然後將焦點setFocus指向該字段。但我得到了一個StackOverflowError,我猜是因爲在管理器中的字段上調用setFocus實際上再次調用onFocus爲管理器本身?

那麼有誰知道我應該怎麼做?我檢查了DateField並且它具有我正在尋找的確切行爲,即它記住您是在日期,月份還是年份字段中的最後一個字段,並在字段本身獲得焦點時將此字段設置爲焦點。

回答

2

當我需要糾正內部聚焦狀態的焦點,我使用的一些標誌:

boolean isCustomFocusSet = false; 

protected void onFocus(int direction) { 
    if (!isCustomFocusSet) {    
     isCustomFocusSet = true; 
     int fieldIndex = getLastFocusedCBIndex(); 
     CustomField field = (CustomField)getField(fieldIndex); 
     field.setFocus(); 
    } else { 
     isCustomFocusSet = false; 
     super.onFocus(direction);   
    } 
} 

UPDATE 對於此的CustomField可以解決調用,而不是super.onFocus this.onFocus:

CustomField field = (CustomField)getField(fieldIndex); 
+0

感謝您的回覆。我試了一下,它排序StackOverflow錯誤的問題,但我發現調用field.setFocus()實際上只會導致onFocus有時被調用(可能是該領域第一次獲得焦點)。所以第一次我的CustomField獲得的焦點如預期的那樣工作,但在此之後,onFocus在調用field.setFocus和super.onFocus之間交替。任何想法爲什麼field.setFocus只會導致onFocus在某些情況下而不是所有時間再次被調用? – DaveJohnston 2010-04-21 08:45:43

+0

也許是因爲使用抽象Field類?請參閱更新 – 2010-04-21 10:11:18

+0

否,因爲在我的情況下,我直接訪問字段而不是使用getField(fieldIndex),即根據我的標誌確定最後一次聚焦的字段,我調用yesField.setFocus或noField.setFocus,它們都是標準RadioButtonFields。 當我參考上面的CustomField時,我正在談論容器(管理員類)。 – DaveJohnston 2010-04-21 11:09:20