Domanda

sto scrivendo un app per Blackberry e ho il seguente problema:

Ho implementato un campo personalizzato estendendo la classe Manager. Il campo è molto semplice, si compone di un'etichetta e due caselle di controllo, sì e no. I campi sono disposti in modo che l'etichetta è sulla sinistra e gli usi più spazio può pur lasciando spazio per le caselle di controllo che sono posizionate accanto all'altro a destra e verticalmente centrato rispetto alla etichetta (se si estende più di una riga). Così si presenta così:

Questa è una domanda? O Sì O No

Tutto va bene finora in termini di posa i campi. Ma ora sto cercando di gestire attraversamento messa a fuoco. Prima di tutto il comportamento predefinito quando l'utente scorre verso l'alto o verso il basso è quello di spostarsi tra il sì e senza opzioni. Voglio passare al campo successivo sopra o sotto quando alto o in basso viene premuto, quindi ho fatto questo:

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

E che sembra funzionare.

La prossima cosa che vorrei fare è quello di ricordare quale opzione scorso aveva la messa a fuoco quando il campo non è più attivo, quindi sul raggiungimento di messa a fuoco ancora una volta (indipendentemente da quale direzione l'attenzione viene) impostare questo campo per avere la messa a fuoco. Ho provato l'override onUnfocus e onFocus in modo che io onUnfocus nota quale campo si è concentrata quindi onFocus setFocus a quel campo. Ma ho uno StackOverflowError, credo perché la chiamata a setFocus su un campo entro il manager chiama in realtà onFocus per il gestore di sé ancora una volta ??

Quindi, qualcuno sa come dovrei fare questo? Ho controllato il DateField e ha l'esatto comportamento sto cercando, vale a dire si ricorda se tu fossi l'ultima il giorno, mese o anno campo e imposta questo campo per mettere a fuoco quando il campo si ottiene la messa a fuoco.

È stato utile?

Soluzione

Quando ho bisogno di corretta messa a fuoco all'interno onFocus, sto usando un po 'di bandiera:

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

Aggiorna Per customfield questo potrebbe risolvere chiamare this.onFocus invece di super.onFocus:

CustomField field = (CustomField)getField(fieldIndex);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top