Pergunta

Eu preciso implementar OnLongClickListener para plataforma BlackBerry.
Pode ser usado para entrada do usuário (implementação do teclado de telefone Ex) ou outra funcionalidade (navegação, controle de reforma, controle de zoom, etc.). Existem requisitos:

  • Controle de destino para ouvir - Buttonfield personalizado
  • Deve ser compiliante de versão com 4.5 e 4.6, então sem touchvents etc.
  • Tempo de clique longo configurável

Você tem algumas sugestões sobre conceito e implementação?
Além disso, quais problemas eu posso obter usando vários ouvintes para o mesmo campo?

Obrigada!

Foi útil?

Solução

Bem, apenas conselhos diretos. Substituir NavigationClick e Navigationunclick - A tempestade mapeará automaticamente as pressões na tela para esses eventos.

Você precisará usar um thread separado ou um cronômetro para realmente cronometrar o clique - não há como fazer isso de outra forma (você obtém um parâmetro de tempo nos dois eventos, mas deseja que o evento seja disparado antes do desconto).

Além disso, você terá que ter cuidado com o que acontece se o usuário disser que desligar e depois clicar novamente dentro do intervalo de um longo intervalo de cliques. Provavelmente você quer iniciar o timer novamente.

Vários ouvintes não devem fornecer nenhuma dificuldade - assumindo que qualquer classe implemente que o ouvinte seja bem -comportado (não faz processamento pesado dentro do método de retorno de chamada). Geralmente, os componentes da UI da BlackBerry podem ter no máximo 1 ouvinte de cada vez (é por isso que há um setChangelistener em vez de AddChangelistener). A menos que haja um motivo convincente para seguir a rota do Android com vários ouvintes, eu ficaria com apenas um - isso facilitará a implementação e é consistente com o paradigma do BB.

Outras dicas

Eu segui os conselhos de Anthony, implementação usando TimerTask e Buttonfield.
Seja carfuncional com o estilo consume_click, de alguma forma Exclui o evento NavigationClick.
Além disso, tenho problemas expirados com simuladores em negrito 9000/8900, o NavigationClick é disparado após a roda do rastreamento não chutado. Mas a amostra funciona bem com a tempestade.

Interface:

public interface LongClickListener {
    public void longClickEvent(Field field, int eventNumber);
}

Controle em si:

public class LongClickButtonField extends ButtonField { 

    boolean mContinuousMode = false;
    Timer mLongClickTimer = null;

    long mLongClickDelay = 1000;
    long mContinuousPeriod = 500;   
    LongClickListener mLongClickListener = null;

    public LongClickButtonField(String label) {
        super(label);
    }

    public LongClickButtonField(String label, boolean continuousMode) {
        this(label);
        mContinuousMode = continuousMode;
    }

    public void setLongClickListener(LongClickListener longClickListener) {
        mLongClickListener = longClickListener;
    }

    protected boolean navigationClick(int status, int time) {
        mLongClickTimer = new Timer();
        final Field eventArg = this;
        if(!mContinuousMode)
        {
        mLongClickTimer.schedule(new TimerTask() {public void run() {
            mLongClickListener.longClickEvent(eventArg, 0);
        }}, mLongClickDelay);
        }
        else
        {
            mLongClickTimer.schedule(new TimerTask(){
                int eventNum= 0;
                public void run() {             
                mLongClickListener.longClickEvent(eventArg, eventNum);
                eventNum++;
            }}, mLongClickDelay, mContinuousPeriod);
        }
        return true;
    }

    protected boolean navigationUnclick(int status, int time) {
        mLongClickTimer.cancel();
        return true;
    }
}

Usar:

public class Scr extends MainScreen implements LongClickListener {
    LabelField mStatusLabel = new LabelField("status") {
        protected void paint(Graphics graphics) {
            graphics.setColor(Color.BLACK);
            super.paint(graphics);
        };
    };

    public Scr() {
        LongClickButtonField button = new LongClickButtonField(
                "click & hold 5 s");
        LongClickButtonField buttonContinuous = new LongClickButtonField(
                "click & hold > 5 s", true);
        button.setLongClickListener(this);
        buttonContinuous.setLongClickListener(this);
        add(mStatusLabel);
        add(button);
        add(buttonContinuous);
    }

    public void longClickEvent(final Field field, final int eventNumber) {
        UiApplication.getUiApplication().invokeLater(new Runnable() {
            public void run() {
                mStatusLabel.setText(  
                        ((ButtonField) field).getLabel()
                        + " event #"  
                        + String.valueOf(eventNumber));
            }
        });

    }
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top