سؤال

أحتاج إلى التنفيذ onlongclicklistener. منصة بلاك بيري.
يمكن استخدامه لإدخال المستخدم (تطبيق لوحة مفاتيح الهاتف السابقين) أو الوظائف الأخرى (التنقل، التحكم في الترجيع، التحكم في التكبير، إلخ). هناك متطلبات:

  • التحكم المستهدف للاستماع -
  • يجب أن يكون الإصدار المجميعي مع 4.5 و 4.6، لذلك لا تشمس إلخ.
  • شكلي طويل النقر الوقت

هل لديك بعض الاقتراحات حول المفهوم والتنفيذ؟
أيضا، ما هي القضايا التي يمكنني الحصول عليها باستخدام مستمعين متعددين لنفس الحقل؟

شكرًا لك!

هل كانت مفيدة؟

المحلول

حسنا، نصيحة واضحة فقط. تجاوز NavigationClick و NavigationUnclick - ستضغط العاصفة تلقائيا على الشاشة على هذه الأحداث.

سيكون عليك استخدام مؤشر ترابط منفصل أو مؤقت في الوقت الحالي النقر - لا توجد طريقة للقيام بذلك بطريقة أخرى (يمكنك الحصول على معلمة زمنية في كلا الأحداث، لكنك تريد إطلاق الحدث قبل Unclick).

كما يجب أن تكون حذرا حول ما يحدث إذا قال المستخدم Unclicks ثم النقرات مرة أخرى في غضون فترة فاصلة انقر لفترة طويلة. ربما تريد أن تبدأ الموقت مرة أخرى.

يجب ألا يقدم المستمعون المتعددون أي صعوبة - على افتراض أن مهما تنفذ المستمع حسن التصرف (لا يقوم بالمعالجة الثقيلة داخل طريقة رد الاتصال). عموما يمكن أن تحتوي مكونات BlackBerry UI على مستمع واحد كحد أقصى في كل مرة (لهذا السبب يوجد Setchangelistener بدلا من Addchangelistener). ما لم يكن هناك سبب مقنع للذهاب إلى الطريق الذي يعمل بنظام Android مع مستمعين متعددين، فأنا ألصق مع واحد فقط - ستجعل التنفيذ أسهل قليلا، وهو يتفق مع نموذج BB.

نصائح أخرى

لقد تابعت نصائح أنتوني، والتنفيذ باستخدام timertask. وكبرفيلد.
كن كارفيا بأسلوب consum_click، بطريقة ما يستبعد حدث navigationClick.
أيضا، لقد انتهت من المشكلات مع محاكاة جريئة 9000/8900، يتم إطلاق NavigationClick بعد TrackWheel غير مكلم. وبعد لكن العينة تعمل بشكل جيد مع العاصفة.

واجهه المستخدم:

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

السيطرة على نفسه:

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

يستخدم:

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

    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top