2013-07-02 9 views
8

मुझे एक साधारण मिमी चाहिए: एसएस टाइमर मेरी एक्शनबार पर प्रदर्शित होने के लिए, नीचे से गिनने शुरू करने के लिए मिनटों की संख्या चुनने में सक्षम हो और फिर 0 पर एक बार एक विधि को कॉल करें। क्या यह संभव है और कैसे? आपको लगता है कि मेनू में एक Action View के रूप में कार्यवाही बार में एक TextView जोड़ने, तो एक CountDownTimer का उपयोग कर नियमित अंतराल पर यह अपडेट करकेक्या एंड्रॉइड पर एक्शनबार में टाइमर जोड़ना संभव है?

+0

आप अब तक की कोशिश की? – Yup

+0

यहां एक उदाहरण है http://thegeekyland.blogspot.com/2014/07/android-count-down-timer-in-actionbar.html – Arlind

उत्तर

14

मुझे क्या करना प्रबंधित किया है धन्यवाद।
(एंड्रॉइड 3.0 एमुलेटर पर परीक्षण, एक एंड्रॉइड 4.3 एमुलेटर और एंड्रॉइड 4.3 चलाने वाला एक असली डिवाइस)।

यहां मेनू आइटम के लिए एक्सएमएल है। ध्यान दें कि actionViewClass="android.widget.TextVew"
(शोएएसएक्शन और एक्शन व्यू क्लास में एंड्रॉइड नेमस्पेस नहीं है क्योंकि मैं समर्थन एक्शन बार का उपयोग कर रहा हूं)।

<?xml version="1.0" encoding="utf-8"?> 
<menu 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:compatibility="http://schemas.android.com/apk/res-auto" > 

    <item android:id="@+id/break_timer" 
      android:title="@string/break_timer_title" 
      compatibility:showAsAction="always" 
      compatibility:actionViewClass="android.widget.TextView" /> 

</menu> 

onCreateOptionsMenu में, मैं MenuItem खोजने के लिए और getActionView फोन, timerText निजी TextView निर्दिष्ट करने के लिए। मैं यहां कुछ पैडिंग भी लागू करता हूं, ताकि स्क्रीन के किनारे पर यह सही न हो।

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    getMenuInflater().inflate(R.menu.break_timer, menu); 

    MenuItem timerItem = menu.findItem(R.id.break_timer); 
    timerText = (TextView) MenuItemCompat.getActionView(timerItem); 

    timerText.setPadding(10, 0, 10, 0); //Or something like that... 

    startTimer(30000, 1000); //One tick every second for 30 seconds 
    return true; 
} 

मैं एक विधि startTimer कहा जाता है इसकी onTick में एक CountDownTimer शुरू करने और timerText अपडेट करना होगा। मैं onCreateOptionsMenu से startTimer पर कॉल करता हूं ताकि यह सुनिश्चित किया जा सके कि timerText इसे प्रारंभ करने से पहले एक्सेस नहीं किया गया है। (पहले, मैंने startTimer को onCreate से बुलाया, लेकिन NullPointerException मिला)।

private void startTimer(long duration, long interval) { 

    CountDownTimer timer = new CountDownTimer(duration, interval) { 

     @Override 
     public void onFinish() { 
      //TODO Whatever's meant to happen when it finishes 
     } 

     @Override 
     public void onTick(long millisecondsLeft) { 
      int secondsLeft = (int) Math.round((millisecondsLeft/(double) 1000)); 
      timerText.setText(secondsToString(secondsLeft)); 
     } 
    }; 

    timer.start(); 
} 

मुझे यकीन है कि किसी को भी पढ़ने के लिए इस तरह के "00:00:00" के रूप में एक timecode करने के लिए सेकंड के एक पूर्णांक संख्या परिवर्तित करने के लिए एक बेहतर तरीका पता चल जाएगा हूँ, लेकिन सिर्फ मामले में मैं secondsToString साझा करेंगे विधि मैंने ऊपर onTick में उपयोग किया था।

private String secondsToString(int improperSeconds) { 

    //Seconds must be fewer than are in a day 

    Time secConverter = new Time(); 

    secConverter.hour = 0; 
    secConverter.minute = 0; 
    secConverter.second = 0; 

    secConverter.second = improperSeconds; 
    secConverter.normalize(true); 

    String hours = String.valueOf(secConverter.hour); 
    String minutes = String.valueOf(secConverter.minute); 
    String seconds = String.valueOf(secConverter.second); 

    if (seconds.length() < 2) { 
     seconds = "0" + seconds; 
    } 
    if (minutes.length() < 2) { 
     minutes = "0" + minutes; 
    } 
    if (hours.length() < 2) { 
     hours = "0" + hours; 
    } 

    String timeString = hours + ":" + minutes + ":" + seconds; 
    return timeString; 
} 
+0

धन्यवाद मैट! यह पूरी तरह से काम करता है! – madx

+0

timerText.setText() पर NullPointerException; –

2

मेनू एक्सएमएल

<item 
       android:id="@+id/counter" 
       android:title="" 
       android:showAsAction="always"> 
</item> 

** सार्वजनिक बूलियन onCreateOptionsMenu (मेनू मेनू) "

long timer = 10000; 
public Boolean onCreateOptionsMenu(Menu menu) 
{ 
     super.onCreateOptionsMenu(menu); 
     getMenuInflater().inflate(R.menu.menu, menu); 

     final MenuItem counter = menu.findItem(R.id.counter); 
     new CountDownTimer(timer, 1000) { 

      public void onTick(long millisUntilFinished) { 
      long millis = millisUntilFinished; 
      String hms = (TimeUnit.MILLISECONDS.toHours(millis))+":"+(TimeUnit.MILLISECONDS.toMinutes(millis) -TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(millis)))+":"+ (TimeUnit.MILLISECONDS.toSeconds(millis) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millis))); 

      counter.setTitle(hms); 
      timer = millis; 

      } 

     public void onFinish() { 
      counter.setTitle("done!"); 
      } 
     }.start(); 

     return true; 

} 
+0

सही उत्तर ... –

0

हाँ, यह उपयोग जावा में इस कोड को उपकरण पट्टी कार्रवाई में घड़ी जोड़ना संभव नहीं है :

private void startTimer(long duration, long interval) { 

CountDownTimer timer = new CountDownTimer(duration, interval) { 

    @Override 
    public void onFinish() { 
     //TODO Whatever's meant to happen when it finishes 
    } 

    @Override 
    public void onTick(long millisecondsLeft) { 
     int secondsLeft = (int) Math.round((millisecondsLeft/(double) 1000)); 
     timerText.setText(secondsToString(secondsLeft)); 
    } 
}; 

timer.start(); 
} 

और यह भी सिर्फ इस

तरह मेनू फ़ाइल में परिभाषित किया गया टाइमर आईडी का उपयोग करता है, तो अधिक जानने के यात्रा यूट्यूब :)

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