2015-08-14 20 views
5

Bir zamanlayıcı sınıfı yazdım. Ve ben onun toString yöntemini geçersiz kılmak istiyorum. Ama ben toString yöntemini çağırdığımda, yine de süper uygulamayı döndürür.toString yöntemini geçersiz kılma başarısız oldu

import android.os.Handler; 
import android.widget.TextView; 

public class Timer implements Comparable<Timer> { 
    private Handler handler; 
    private boolean paused; 
    private TextView text; 

    private int minutes; 
    private int seconds; 

    private final Runnable timerTask = new Runnable() { 
     @Override 
     public void run() { 
      if (!paused) { 
       seconds++; 
       if (seconds >= 60) { 
        seconds = 0; 
        minutes++; 
       } 

       text.setText (toString()); //Here I call the toString 
       Timer.this.handler.postDelayed (this, 1000); 
      } 
     } 
    }; 

    //Here is the toString method, anything wrong? 
    @Override 
    public String toString() { 
     if (Integer.toString (seconds).length() == 1) { 
      return minutes + ":0" + seconds; 
     } else { 
      return minutes + ":" + seconds; 
     } 
    } 

    public void startTimer() { 
     paused = false; 
     handler.postDelayed (timerTask, 1000); 
    } 

    public void stopTimer() { 
     paused = true; 
    } 

    public void resetTimer() { 
     stopTimer(); 
     minutes = 0; 
     seconds = 0; 
     text.setText (toString()); //Here is another call 
    } 

    public Timer (TextView text) { 
     this.text = text; 
     handler = new Handler(); 
    } 

    @Override 
    public int compareTo(Timer another) { 
     int compareMinutes = ((Integer)minutes).compareTo (another.minutes); 
     if (compareMinutes != 0) { 
      return compareMinutes; 
     } 
     return ((Integer)seconds).compareTo (another.seconds); 
    } 
} 

Metin görünümün metin Timer sınıfın tam adı olduğunu görebilirsiniz: (sınıfın tam nitelikli ad)

İşte benim zamanlayıcı sınıftır. Hatta this.toString'u denedim, ama işe yaramıyor.

+0

ekran değeri tarafından basılan "Integer.toString (saniye) .length":

class Test { public Test() { Runnable r = new Runnable() { @Override public void run() { System.out.println(toString()); // toString on anonymous class System.out.println(Test.this.toString()); // toString on Test } }; r.run(); } public static void main(String[] args) { new Test(); } @Override public String toString() { return "Test.toString()"; } } 

Çıktı:

İşte fark göstermek için kısa ama tam konsol uygulaması var. böylece "Log.i (" value "," "+ Integer.toString (saniye) .length);" ?? –

cevap

13

new Runnable() { ... }, anonim iç sınıfınızdan toString() numaralı telefonu arıyorsunuz. Bu, numaralı telefondan, Timer örneğinde değil, anonim sınıf örneğinizi aradığınız anlamına gelir. Anonim bir iç sınıf olduğunu gösteren, çıktıda $1 aldığınızdan şüpheleniyorum.

Dene:

text.setText(Timer.this.toString()); 

... yerine çevreleyen Timer örneğinde diyoruz ki.

[email protected] 
Test.toString() 
+2

Oh evet! Çok teşekkür ederim! btw kitabını okuyorum! – Sweeper

İlgili konular