2015-08-14 4 views
5

Я написал класс таймера. И я хочу переопределить его метод toString. Но когда я вызываю метод toString, он по-прежнему возвращает супер-реализацию. (Полное название класса)Не удалось переопределить метод toString

Вот мой класс таймера:

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

Я могу видеть, что текст Text View является полным именем Timer класса. Я даже попробовал this.toString, но он тоже не работает.

+0

распечатанной значением экрана "Integer.toString (в секундах) .Length". таким образом, «Log.i» («значение», «» + Integer.toString (seconds) .length); ?? –

ответ

13

Вы звоните toString() из своего анонимного внутреннего класса - new Runnable() { ... }. Это означает, что вы вызываете toString()на экземпляр вашего анонимного класса, а не на экземпляр Timer. Я подозреваю, что вы получаете $1 на выходе, показывая, что это анонимный внутренний класс.

Try:

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

... так что вы называете его вмещающего Timer например вместо этого.

Вот короткий, но полный консоли приложение, чтобы продемонстрировать разницу:

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

Выход:

[email protected] 
Test.toString() 
+2

О да! Большое спасибо! Кстати я читаю твою книгу! – Sweeper

Смежные вопросы