سؤال

لتطبيق الروبوت بلدي هناك الموقت الذي يقيس كم من الوقت انقضى. من أي وقت مضى 100 مللي ثانية يمكنني تحديث TextView مع بعض النصوص مثل "التقييم: 10 الوقت: 100.10 ثانية". ولكن، أجد TextView بتحديث فقط أول بضع مرات. التطبيق لا يزال استجابة للغاية، ولكن التسمية يتم تحديث. حاولت الاتصال .invalidate ()، لكنه لا يزال لا يعمل. أنا لا أعرف إذا كان هناك بعض طريقة لإصلاح هذا، أو عنصر واجهة أفضل للاستخدام.

وهنا مثال من قانون بلدي:

float seconds;
java.util.Timer gametimer;
void updatecount() { TextView t = (TextView)findViewById(R.id.topscore);
t.setText("Score: 10 - Time: "+seconds+" seconds");
t.postInvalidate();
}
public void onCreate(Bundle sis) {
... Load the UI, etc...
  gametimer.schedule(new TimerTask() { public void run() {
     seconds+=0.1; updatecount();
} }, 100, 100);
}
هل كانت مفيدة؟

المحلول

والحل العام هو استخدام android.os.Handler بدلا من ذلك الذي يعمل في موضوع UI. وهو يفعل سوى رد دفعة واحدة، ولذلك عليك أن تشعلها مرة أخرى في كل مرة يتم استدعاء رد الاتصال الخاصة بك. ولكن من السهل بما فيه الكفاية لاستخدامها. وقد كتب بلوق وظيفة حول هذا الموضوع بضع سنوات مضت:

http://android-developers.blogspot.com/ 2007/11 / غرزة في وtime.html

نصائح أخرى

ما أعتقد يحدث هو أنك تسقط موضوع UI. هناك واحد "بير" موضوع الذي يعالج كافة التحديثات الشاشة. إذا حاولت أن نطلق عليه "إبطال ()" وكنت لا على هذا الموضوع سيحدث شيء.

وحاول استخدام "postInvalidate ()" على وجهة نظركم بدلا من ذلك. انها سوف تتيح لك تحديث طريقة عرض عندما كنت لا في موضوع UI الحالي.

هنا

استخدم رمز أدناه لضبط الوقت على TextView

public class MyCountDownTimer extends CountDownTimer {
        public MyCountDownTimer(long startTime, long interval) {
            super(startTime, interval);
        }

        @Override
        public void onFinish() {

            ExamActivity.this.submitresult();
        }

        @Override
        public void onTick(long millisUntilFinished) {

            long millis = millisUntilFinished;

            int seconds = (int) (millis / 1000) % 60;
            int minutes = (int) ((millis / (1000 * 60)) % 60);
            int hours = (int) ((millis / (1000 * 60`enter code here` * 60)) % 24);

            String ms = String
                    .format("%02d:%02d:%02d", hours, minutes, seconds);
            txtimedisplay.setText(ms);
        }
    }

وهناك أكثر من طريقة لتغيير النص كل ثانية. هذا هو ValueAnimator. وإنني هنا الحل:

  long startTime = System.currentTimeMillis();
  ValueAnimator animator = new ValueAnimator();
            animator.setObjectValues(0, 1000);
            animator.setDuration(1000);
            animator.setRepeatCount(ValueAnimator.INFINITE);
            animator.addListener(new AnimatorListenerAdapter() {

                @Override
                public void onAnimationStart(Animator animation) {
                    long currentTime = System.currentTimeMillis();
                    String text = TimeFormatUtils.formatTime(startTime - currentTime);
                   yourTextView.setText(text);
                }

                @Override
                public void onAnimationRepeat(Animator animation) {
                    long currentTime = System.currentTimeMillis();
                    String text = TimeFormatUtils.formatTime(startTime - currentTime);
                    yourTextView.setText(text);
                }
            });
            animator.start();
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top