Pregunta

OnLongClickListener para la plataforma BlackBerry.
Puede ser utilizado para la entrada del usuario (aplicación ex teclado del teléfono) u otra funcionalidad (navegación, rebobinado de control, control de zoom, etc.). Hay requisitos:

  • control de destino para escuchar - a medida ButtonField
  • debe ser versión compiliant con 4,5 y 4,6, por lo que no hay touchEvents etc.
  • configurable desde hace mucho tiempo clic

¿Tiene algunas sugerencias sobre el concepto y la implementación?
Además, ¿qué problemas puedo conseguir en el uso de múltiples oyentes para un mismo campo?

Gracias!

¿Fue útil?

Solución

Bueno, sólo consejos sencillos. NavigationClick anular y navigationUnclick - la tormenta va a asignar automáticamente prensas en la pantalla para estos eventos.

Vas a tener que usar un hilo separado o un temporizador para realmente tiempo el clic - no hay manera de hacer que de otra manera (lo hace llegar un parámetro de tiempo en ambos eventos, pero desea que el evento al fuego antes de la unclick) .

También tendrá que tener cuidado con lo que ocurre si el usuario dice unclicks y vuelve a hacer clic en el lapso de un intervalo de tiempo clic. Probablemente desea iniciar de nuevo el temporizador.

múltiples oyentes no deben proporcionar ninguna dificultad - el supuesto de que cualquiera que sea la clase implementa el oyente se comporta bien (no hacer el proceso pesado dentro del método de devolución de llamada). En general, los componentes de interfaz de usuario de BlackBerry pueden tener un máximo de 1 oyente a la vez (por eso hay una setChangeListener en lugar de addChangeListener). A menos que haya una razón de peso para ir a la ruta androide con múltiples oyentes, me quedo con sólo uno -. Que va a hacer un poco más fácil aplicación, y es consistente con el paradigma BB

Otros consejos

He seguido los consejos de Anthony, la implementación usando TimerTask y ButtonField.
Sé carfull con estilo CONSUME_CLICK, de alguna manera excluye evento navigationClick .
Además, he experiensia problemas con Negrita 9000/8900 simuladores, navigationClick se dispara después de rueda de desplazamiento es unclicked . Sin embargo, la muestra funciona bien con la tormenta.

Interfaz:

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

Control en sí:

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

Uso:

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 bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top