2

アプリケーションのすべてのアクティビティで表示されるタイマーを作成したいと考えています。

以下のアクティビティでタイマーを作成する方法は私のコードです

public class Timer extends Activity implements OnClickListener {
    public TextView mTextField;
    private Button btnstart;

    public String formatTime(long millis) { 
        String output = "00:00"; 
        long seconds = millis / 1000; 
        long minutes = seconds / 60; 

        seconds = seconds % 60; 
        minutes = minutes % 60; 

        String secondsD = String.valueOf(seconds); 
        String minutesD = String.valueOf(minutes); 

        if (seconds < 10) 
            secondsD = "0" + seconds; 
        if (minutes < 10) 
            minutesD = "0" + minutes; 

        output = minutesD + " : " + secondsD; 
        return output; 
    } 
    public CountDownTimer Counter1;

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.main); 

        //Declare Start/Stop button 
        btnstart = (Button)findViewById(R.id.btnThread1); 
        btnstart.setOnClickListener(this);
        //Button btnstop = (Button)findViewById(R.id.button02); 
        //Button btnpass = (Button)findViewById(R.id.button03);

        //Declare Text fields to show time left 
        final TextView mCounter1TextField=(TextView)findViewById(R.id.txtThread1); 
        final TextView mCounter2TextField = (TextView)findViewById(R.id.txtThread2); 
        //final TextView mCounter3TextField=(TextView)findViewById(R.id.textView03); 



        //Counter 1 
        Counter1 = new CountDownTimer(120000 , 1000) { 
            public void onTick(long millisUntilFinished) { 
                mCounter1TextField.setText("Seconds left: " + formatTime(millisUntilFinished)); 
            } 

            public void onFinish() { 
                mCounter1TextField.setText("Finished!"); 
                // Counter1.start();
            } 
        }; 
    }

    @Override
    public void onClick(View v) {
        if(v == btnstart)
        {
            Counter1.start();
        }

    }
}

グローバルにする方法を知りたいですか??

4

5 に答える 5

2

あなたはあなたを保持するシングルトンクラスを持つことができますCountDownTimer

// This is not a real singleton, Google to get a proper Java implementation
public class TimerSingleton {

  // Should not be public, you should of course encapsulate access to that timer.
  // static keyword says that one timer object is shared by all instance of TimerSingleton 
  public static CountDownTimer timer = new CountDownTimer();
}

// Access to the timer from an activity:
TimerSingleton.timer.start();

2 番目のオプションは、タイマーをカスタム Application クラスのメンバーとして使用することです。グローバル変数には Application クラスを使用します。

3 番目のオプション: 開始時にタイマーを開始するローカル サービスを作成します。

オプション 1 と 2 の場合、OS がアプリを強制終了することを決定した場合、タイマーは消えることに注意してください (つまり、アクティビティが再作成されると、CountDownTimer オブジェクトがリセットされます)。

于 2012-10-22T13:02:52.463 に答える
1

1つのアクティビティでタイマーを作成し、他のアクティビティでその保護された関数を呼び出すことで、問題を解決しました。

これは、タイマーを開始するためのstartTimer関数です。

private void startTimer(){ 
    if (mTimer == null) { 
        mTimer = new Timer(); 
    } 
    if (mTimerTask == null) { 
        mTimerTask = new TimerTask() { 
            @Override 
            public void run() { 
                Log.i(TAG, "count: "+String.valueOf(count)); 
                sendMessage(UPDATE_TEXTVIEW); 

                do { 
                    try { 
                        Log.i(TAG, "sleep(1000)..."); 
                        Thread.sleep(1000); 
                    } catch (InterruptedException e) { 
                    }    
                } while (isPause);  
                count ++;   
            } 
        }; 
    } 
    if(mTimer != null && mTimerTask != null ) 
        mTimer.schedule(mTimerTask, delay, period); 
} 

これは、他のアクティビティで使用できるパブリック関数です。

public String valueOfTimer()
{
    return String.valueOf(count);
}

これが私が他の活動の価値を得る方法です:

private void updateTime()
{
    TimerActivity tm  = new TimerActivity();

    String time = tm.valueOfTimer();
    t2.setText(time);
    System.out.println("Time::"+time);
}
于 2012-10-23T08:42:26.773 に答える
1

シングルトンを作ろう!http://en.wikipedia.org/wiki/Singleton_pattern

シングルトンは、ある種のオブジェクトが 1 つしか存在しないことを保証し、他のオブジェクトが簡単にアクセスできるようにします。

于 2012-10-22T13:02:07.717 に答える
1

アプリケーションのすべてのアクティビティを表示したい場合は、Fragmentsを使用することをお勧めします。あなたがする必要があるのは、毎回表示される Timer クラスを持つ Fragment を作成し、表示したい他のコンテンツを持つ別の Fragment を作成し、2 番目の Fragment のみのライフサイクルを操作することだけです。

于 2012-10-22T13:30:08.723 に答える
0

シングルトン クラスを作成し、UI にリスナーを登録します。

 mTimerCustom = CountdownTimer.getInstance();
 mTimerCustom.registerListener(this);
 mTimerCustom.start();

CountDownTimer クラスで

 public static CountdownTimer getInstance()
    {
        return INSTANCE;
    }

 public synchronized void start() {

        Calendar cal=Calendar.getInstance();
        int seconds=cal.get(Calendar.SECOND);
       start=60-seconds;
        //Toast.makeText(mParentActivity,""+seconds,Toast.LENGTH_LONG).show();
        if (D) Log.d(TAG, "start");
        switch (state) {
            case STOPPED:
                count = start;
            case PAUSED:
                timer = new Timer(TAG);
                timer.scheduleAtFixedRate(new TimerTask() {
                    @Override
                    public void run() {
                        if (count > 0) {
                            count--;
                            Log.d(TAG, "Tick: " + count);
                            for (TimerListener listener : listeners) {
                                listener.timerUpdate(count);
                            }
                        }
                        else stop();
                    }
                }, 0, DELAY);
                state = COUNTING;
                if (D) Log.d(TAG, "state: counting");
                break;
            case COUNTING:
                break;
            default:
                throw new IllegalStateException(state.toString());
        }
    }
于 2015-11-09T05:37:02.440 に答える