2011-04-08 10 views
29

मैं क्रोनोमीटर को रोकना चाहता हूं और जब मैं बटन क्लिक करता हूं तो मैं क्रोमोनेटर को गिनने के लिए जारी रखना चाहता हूं ... मैं खोजता हूं लेकिन इससे संबंधित कोई फ़ंक्शन नहीं हो सकता .. यह कैसे हो सकता है?Android_Chronometer रोकें

उत्तर

110

आप वाला हैं एक चर कि समय बीत गया है कि जब घड़ी शुरू किया गया था पर ट्रैक रखता है की जरूरत है:

timeWhenStopped = mChronometer.getBase() - SystemClock.elapsedRealtime(); 
mChronometer.stop(); 
:

long timeWhenStopped = 0; 

अद्यतन चर का मान जब आप इस तरह ठीक घड़ी रोक

हम भी यह शुरू करने से पहले ठीक घड़ी समायोजित करने के लिए इस चर का उपयोग करेगा:

mChronometer.setBase(SystemClock.elapsedRealtime() + timeWhenStopped); 
mChronometer.start(); 

और अंत में यदि आपके पास अपने क्रोनोमीटर को रीसेट करने का कोई तरीका है तो आपको समय को रीसेट करने के लिए याद रखना चाहिए। कुछ इस तरह:

mChronometer.setBase(SystemClock.elapsedRealtime()); 
timeWhenStopped = 0; 
+2

अद्भुत उत्तर :) –

+1

अच्छा जवाब ... अच्छे शिलालेख के साथ .. !! इसे उत्तर के रूप में स्वीकार किया जाना चाहिए .. @ और अगर यह काम कर रहा है .. !! –

+0

यह स्वीकार्य उत्तर क्यों नहीं है? मेरे लिए अच्छा काम करता है, धन्यवाद! – jamesc

9

मैंने इसके लिए PauseableChronometer कक्षा बनाई है।

import android.content.Context; 
import android.os.SystemClock; 
import android.util.AttributeSet; 
import android.widget.Chronometer; 

public class PausableChronometer extends Chronometer { 

    private long timeWhenStopped = 0; 

    public PausableChronometer(Context context) { 
     super(context); 
    } 

    public PausableChronometer(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    public PausableChronometer(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
    } 

    @Override 
    public void start() { 
     setBase(SystemClock.elapsedRealtime()+timeWhenStopped); 
     super.start(); 
    } 

    @Override 
    public void stop() { 
     super.stop(); 
     timeWhenStopped = getBase() - SystemClock.elapsedRealtime(); 
    } 

    public void reset() { 
     stop(); 
     setBase(SystemClock.elapsedRealtime()); 
     timeWhenStopped = 0; 
    } 

    public long getCurrentTime() { 
     return timeWhenStopped; 
    } 

    public void setCurrentTime(long time) { 
     timeWhenStopped = time; 
     setBase(SystemClock.elapsedRealtime()+timeWhenStopped); 
    } 
} 
3

दो अन्य उत्तर समान हैं, और घड़ी के प्रदर्शन पर बहुत अच्छी तरह से काम करते हैं, लेकिन वे एक दोष है: timeWhenStopped, साथ ही getCurrentTime() द्वारा दिए गए मान, नकारात्मक है।

public class PausableChronometer extends Chronometer { 

    private long timeWhenStopped = 0; 

    public PausableChronometer(Context context) { 
     super(context); 
    } 

    public PausableChronometer(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    public PausableChronometer(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
    } 

    @Override 
    public void start() { 
     setBase(SystemClock.elapsedRealtime() - timeWhenStopped); 
     super.start(); 
    } 

    @Override 
    public void stop() { 
     super.stop(); 
     timeWhenStopped = SystemClock.elapsedRealtime() - getBase(); 
    } 

    public void reset() { 
     stop(); 
     setBase(SystemClock.elapsedRealtime()); 
     timeWhenStopped = 0; 
    } 

    public long getCurrentTime() { 
     return timeWhenStopped; 
    } 

    public void setCurrentTime(long time) { 
     timeWhenStopped = time; 
     setBase(SystemClock.elapsedRealtime() - timeWhenStopped); 
    } 
} 

आप "अब" के लिए SystemClock.elapsedRealtime() एक संकेतक के रूप में समझने के लिए मिल गया है:

यहाँ मेरी सुझाव, इन दो सवालों के जवाब के आधार पर है। तो जब हम क्रोनोमीटर शुरू करते हैं, तो हम अतीत में N सेकेंड सेट करेंगे, N टाइमर का वर्तमान मान (0 पहली शुरुआत के मामले में) होने के नाते। इसी तरह, क्रोनोमीटर को रोकते समय, क्रोनोमीटर द्वारा प्रदर्शित समय पहले सेट बेस (getBase()) और अब (SystemClock.elapsedRealtime()) के बीच समाप्त हो गया है, इसलिए घटाव।

संबंधित मुद्दे