رفتن به مطلب
انجمن اندروید ایران | آموزش برنامه نویسی اندروید و موبایل
  • android.png.1fab383bc8500cd93127cebc65b1dcab.png

شمارش گر معکوس CountDownTimer


پست های پیشنهاد شده

سلام دوستان .من یک پروژه دارم قراره از طریق ساعت گوشی زمان رو در نظر بگیره و تا روز تولدم تا سال آینده بطور makoos  بشماره و بگه تا روز تولد من چند روز و چندساعت و دقیقه و ثانیه مونده:مثلا تاریخ و ساعت امروز رو بطور اتوماتیک در نظر بگیره و بگه تا روز 13 برج 3 سال 94 (94/3/12) چقدر مونده!!!   کسی می تونه تو نوشتن کدش کمکم کنه؟

[align=center] فرمتش به این صورت باشه  120 روز  6666:666:66

[/align]

لینک ارسال
به اشتراک گذاری در سایت های دیگر

برای اینکار بدین صورت عمل کنید

یک کلاس بصورت زیر ایجاد کنید:

[shcode=java]

public class CountdownChronometer extends Chronometer {

private static final String TAG = "CountdownChronometer";

private static final String FAST_FORMAT_DHHMMSS = "%1$02d:%2$02d:%3$02d:%4$02d";

private static final String FAST_FORMAT_HMMSS = "%1$02d:%2$02d:%3$02d";

private static final String FAST_FORMAT_MMSS = "%1$02d:%2$02d";

private static final char TIME_PADDING = '0';

private static final char TIME_SEPARATOR = ':';

private long mBase;

private boolean mVisible;

private boolean mStarted;

private boolean mRunning;

private boolean mLogged;

private String mFormat;

private Formatter mFormatter;

private Locale mFormatterLocale;

private Object[] mFormatterArgs = new Object[1];

private StringBuilder mFormatBuilder;

private OnChronometerTickListener mOnChronometerTickListener;

private OnChronometerTickListener mOnCountdownCompleteListener;

private StringBuilder mRecycle = new StringBuilder(8);

private String mChronoFormat;

private static final int TICK_WHAT = 3;

public CountdownChronometer(Context context) {

this(context, null, 0, 0);

}

public CountdownChronometer(Context context, long base) {

this(context, null, 0, base);

}

public CountdownChronometer(Context context, AttributeSet attrs) {

this(context, attrs, 0, 0);

}

public CountdownChronometer(Context context, AttributeSet attrs,

int defStyle, long base) {

super(context, attrs, defStyle);

init(base);

}

private void init(long base) {

mBase = base;

updateText(System.currentTimeMillis());

}

@Override

public void setBase(long base) {

mBase = base;

dispatchChronometerTick();

updateText(System.currentTimeMillis());

}

@Override

public long getBase() {

return mBase;

}

@Override

public void setFormat(String format) {

mFormat = format;

if (format != null && mFormatBuilder == null) {

mFormatBuilder = new StringBuilder(format.length() * 2);

}

}

@Override

public String getFormat() {

return mFormat;

}

public void setCustomChronoFormat(String chronoFormat) {

this.mChronoFormat = chronoFormat;

}

public String getCustomChronoFormat() {

return mChronoFormat;

}

@Override

public void setOnChronometerTickListener(OnChronometerTickListener listener) {

mOnChronometerTickListener = listener;

}

@Override

public OnChronometerTickListener getOnChronometerTickListener() {

return mOnChronometerTickListener;

}

public void setOnCompleteListener(OnChronometerTickListener listener) {

mOnCountdownCompleteListener = listener;

}

public OnChronometerTickListener getOnCompleteListener() {

return mOnCountdownCompleteListener;

}

@Override

public void start() {

mStarted = true;

updateRunning();

}

@Override

public void stop() {

mStarted = false;

updateRunning();

}

public void setStarted(boolean started) {

mStarted = started;

updateRunning();

}

@Override

protected void onDetachedFromWindow() {

super.onDetachedFromWindow();

mVisible = false;

updateRunning();

}

@Override

protected void onWindowVisibilityChanged(int visibility) {

super.onWindowVisibilityChanged(visibility);

mVisible = visibility == VISIBLE;

updateRunning();

}

private synchronized boolean updateText(long now) {

long seconds = mBase - now;

seconds /= 1000;

boolean stillRunning = true;

if (seconds <= 0) {

stillRunning = false;

seconds = 0;

}

String text = formatRemainingTime(mRecycle, seconds);

if (mFormat != null) {

Locale loc = Locale.getDefault();

if (mFormatter == null || !loc.equals(mFormatterLocale)) {

mFormatterLocale = loc;

mFormatter = new Formatter(mFormatBuilder, loc);

}

mFormatBuilder.setLength(0);

mFormatterArgs[0] = text;

try {

mFormatter.format(mFormat, mFormatterArgs);

text = mFormatBuilder.toString();

} catch (IllegalFormatException ex) {

if (!mLogged) {

Log.w(TAG, "Illegal format string: " + mFormat);

mLogged = true;

}

}

}

setText(text);

return stillRunning;

}

private void updateRunning() {

boolean running = mVisible && mStarted;

if (running != mRunning) {

if (running) {

if (updateText(System.currentTimeMillis())) {

dispatchChronometerTick();

mHandler.sendMessageDelayed(

Message.obtain(mHandler, TICK_WHAT), 1000);

} else {

running = false;

mHandler.removeMessages(TICK_WHAT);

}

} else {

mHandler.removeMessages(TICK_WHAT);

}

mRunning = running;

}

}

private Handler mHandler = new Handler() {

public void handleMessage(Message m) {

if (mRunning) {

if (updateText(System.currentTimeMillis())) {

dispatchChronometerTick();

sendMessageDelayed(Message.obtain(this, TICK_WHAT), 1000);

} else {

dispatchCountdownCompleteEvent();

stop();

}

}

}

};

void dispatchChronometerTick() {

if (mOnChronometerTickListener != null) {

mOnChronometerTickListener.onChronometerTick(this);

}

}

void dispatchCountdownCompleteEvent() {

if (mOnCountdownCompleteListener != null) {

mOnCountdownCompleteListener.onChronometerTick(this);

}

}

private String formatRemainingTime(StringBuilder recycle,

long elapsedSeconds) {

long days = 0;

long hours = 0;

long minutes = 0;

long seconds = 0;

if (elapsedSeconds >= 86400) {

days = elapsedSeconds / 86400;

elapsedSeconds -= days * 86400;

}

if (elapsedSeconds >= 3600) {

hours = elapsedSeconds / 3600;

elapsedSeconds -= hours * 3600;

}

if (elapsedSeconds >= 60) {

minutes = elapsedSeconds / 60;

elapsedSeconds -= minutes * 60;

}

seconds = elapsedSeconds;

if (mChronoFormat != null) {

return formatRemainingTime(recycle, mChronoFormat, days, hours,

minutes, seconds);

} else if (days > 0) {

return formatRemainingTime(recycle, FAST_FORMAT_DHHMMSS, days,

hours, minutes, seconds);

} else if (hours > 0) {

return formatRemainingTime(recycle, FAST_FORMAT_HMMSS, hours,

minutes, seconds);

} else {

return formatRemainingTime(recycle, FAST_FORMAT_MMSS, minutes,

seconds);

}

}

private static String formatRemainingTime(StringBuilder recycle,

String format, long days, long hours, long minutes, long seconds) {

if (FAST_FORMAT_DHHMMSS.equals(format)) {

StringBuilder sb = recycle;

if (sb == null) {

sb = new StringBuilder(8);

} else {

sb.setLength(0);

}

sb.append(days);

sb.append(TIME_SEPARATOR);

if (hours < 10) {

sb.append(TIME_PADDING);

} else {

sb.append(toDigitChar(hours / 10));

}

sb.append(toDigitChar(hours % 10));

sb.append(TIME_SEPARATOR);

if (minutes < 10) {

sb.append(TIME_PADDING);

} else {

sb.append(toDigitChar(minutes / 10));

}

sb.append(toDigitChar(minutes % 10));

sb.append(TIME_SEPARATOR);

if (seconds < 10) {

sb.append(TIME_PADDING);

} else {

sb.append(toDigitChar(seconds / 10));

}

sb.append(toDigitChar(seconds % 10));

return sb.toString();

} else {

return String.format(format, days, hours, minutes, seconds);

}

}

private static String formatRemainingTime(StringBuilder recycle,

String format, long hours, long minutes, long seconds) {

if (FAST_FORMAT_HMMSS.equals(format)) {

StringBuilder sb = recycle;

if (sb == null) {

sb = new StringBuilder(8);

} else {

sb.setLength(0);

}

sb.append(hours);

sb.append(TIME_SEPARATOR);

if (minutes < 10) {

sb.append(TIME_PADDING);

} else {

sb.append(toDigitChar(minutes / 10));

}

sb.append(toDigitChar(minutes % 10));

sb.append(TIME_SEPARATOR);

if (seconds < 10) {

sb.append(TIME_PADDING);

} else {

sb.append(toDigitChar(seconds / 10));

}

sb.append(toDigitChar(seconds % 10));

return sb.toString();

} else {

return String.format(format, hours, minutes, seconds);

}

}

private static String formatRemainingTime(StringBuilder recycle,

String format, long minutes, long seconds) {

if (FAST_FORMAT_MMSS.equals(format)) {

StringBuilder sb = recycle;

if (sb == null) {

sb = new StringBuilder(8);

} else {

sb.setLength(0);

}

if (minutes < 10) {

sb.append(TIME_PADDING);

} else {

sb.append(toDigitChar(minutes / 10));

}

sb.append(toDigitChar(minutes % 10));

sb.append(TIME_SEPARATOR);

if (seconds < 10) {

sb.append(TIME_PADDING);

} else {

sb.append(toDigitChar(seconds / 10));

}

sb.append(toDigitChar(seconds % 10));

return sb.toString();

} else {

return String.format(format, minutes, seconds);

}

}

private static char toDigitChar(long digit) {

return (char) (digit + '0');

}

}

[/shcode]

سپس در Layout :

[shcode=xml]

  

                android:id="@+id/chronometer"

                android:layout_width="wrap_content"

                android:layout_height="wrap_content"

                android:layout_centerHorizontal="true"

                android:textSize="16sp" />

[/shcode]

فراخوانی:

[shcode=java]

CountdownChronometer countdowner = (CountdownChronometer)findViewById(R.id.chronometer);

countdowner.setBase(((System.currentTimeMillis()-Long.parseLong(time))/1000)%60);

        countdowner.start();

[/shcode]

لینک ارسال
به اشتراک گذاری در سایت های دیگر

Import های مورد نیاز نمونه کد بالا:

[shcode=java]

import java.util.Formatter;

import java.util.IllegalFormatException;

import java.util.Locale;

import android.content.Context;

import android.os.Handler;

import android.os.Message;

import android.os.SystemClock;

import android.util.AttributeSet;

import android.util.Log;

import android.widget.Chronometer;

[/shcode]

لینک ارسال
به اشتراک گذاری در سایت های دیگر

سلام ممنون خطاهام رفع شد ولی در کل برنامه رو اجرا نمی کنه خطا میده

Import های مورد نیاز نمونه کد بالا:

[shcode=java]

import java.util.Formatter;

import java.util.IllegalFormatException;

import java.util.Locale;

import android.content.Context;

import android.os.Handler;

import android.os.Message;

import android.os.SystemClock;

import android.util.AttributeSet;

import android.util.Log;

import android.widget.Chronometer;

[/shcode]

لینک ارسال
به اشتراک گذاری در سایت های دیگر

لطفا کدی که در Layout تعریف کردید رو بزارید؟

[shcode=xml]

 

                android:id="@+id/chronometer"

                android:layout_width="wrap_content"

                android:layout_height="wrap_content"

                android:layout_centerHorizontal="true"

                android:textSize="16sp" />

[/shcode]

لینک ارسال
به اشتراک گذاری در سایت های دیگر

سلام آقا ی مهندس دقیقا همینجوری که گفتید نوشتم بجا yourpackagename نام پکیج خودمو گذاشتم بازم صفحمو اجرا نمی کنه خطای عدم اجرا میده

لطفا کدی که در Layout تعریف کردید رو بزارید؟

[shcode=xml]

 

                android:id="@+id/chronometer"

                android:layout_width="wrap_content"

                android:layout_height="wrap_content"

                android:layout_centerHorizontal="true"

                android:textSize="16sp" />

[/shcode]

لینک ارسال
به اشتراک گذاری در سایت های دیگر
آپلود کردم

http://p30droid.com/Uploader/do.php?id=522]

http://p30droid.com/Uploader/do.php?id=522

لطفا پروژه خود را قرار دهید تا بررسی کنیم

آپلود سنتر انجمن

http://p30droid.com/Uploader/

لینک ارسال
به اشتراک گذاری در سایت های دیگر

بدین صورت تایم خود را به TimeStamp تبدیل کنید

[shcode=java]Timestamp timestamp = Timestamp.valueOf("2007-09-23 10:10:10.0");[/shcode]

لینک ارسال
به اشتراک گذاری در سایت های دیگر
ببخشید این خط رو من تو صفحه main activitiy  بزارم !!!اگر با اون برنامه من جواب گرفتید میشه همونو واسم پیوست کنید؟ !!! ممنون میشم

بدین صورت تایم خود را به TimeStamp تبدیل کنید

[shcode=java]Timestamp timestamp = Timestamp.valueOf("2007-09-23 10:10:10.0");[/shcode]

لینک ارسال
به اشتراک گذاری در سایت های دیگر

بله باید این timestamp را به کنترل شمارنده ست کنید تا عمل کنید.شما اگر فقط تایم دارید میتوانید تایم را به تبدیل کنید و از تاریخ صرف نظر کنید.

لینک ارسال
به اشتراک گذاری در سایت های دیگر
جواب نمیده بهم!!! :(   نه دیگه من هم تعداد روزو ساعت و دقیقه و ثانیه باقیمانده رو می خوام

بله باید این timestamp را به کنترل شمارنده ست کنید تا عمل کنید.شما اگر فقط تایم دارید میتوانید تایم را به تبدیل کنید و از تاریخ صرف نظر کنید.

لینک ارسال
به اشتراک گذاری در سایت های دیگر
اقا ي مهندس من هر جور تونستم نوشتم ولي فكر كنم دارم شتبا مي نويسم كه بهم خطا ميده به هيچ راهي قابل حل شدن نيست اگر وقتشو داريد ممنون ميشم كمكم كنيد.....

بله باید این timestamp را به کنترل شمارنده ست کنید تا عمل کنید.شما اگر فقط تایم دارید میتوانید تایم را به تبدیل کنید و از تاریخ صرف نظر کنید.

لینک ارسال
به اشتراک گذاری در سایت های دیگر

به گفتگو بپیوندید

هم اکنون می توانید مطلب خود را ارسال نمایید و بعداً ثبت نام کنید. اگر حساب کاربری دارید، برای ارسال با حساب کاربری خود اکنون وارد شوید .

مهمان
ارسال پاسخ به این موضوع...

×   شما در حال چسباندن محتوایی با قالب بندی هستید.   حذف قالب بندی

  تنها استفاده از 75 اموجی مجاز می باشد.

×   لینک شما به صورت اتوماتیک جای گذاری شد.   نمایش به صورت لینک

×   محتوای قبلی شما بازگردانی شد.   پاک کردن محتوای ویرایشگر

×   شما مستقیما نمی توانید تصویر خود را قرار دهید. یا آن را اینجا بارگذاری کنید یا از یک URL قرار دهید.

×
×
  • اضافه کردن...