24 MARCH 2017

Persian calendar view for android - افزونه تقویم فارسی اندروید

Flexible solar calendar for your android projects.

In our current project we needed a solar/persian calendar for the app. so i've searched a lot for it in existing libraries and all i've found was Ebrahim Byagowi's open-source persian calendar.

there were also some hijri calendars but i didn't want them. so i decided to create my own calendar view plugin library and publish it. for achieving it, i read the source of byagowi's project and found out that its easily convertable to a seperate library. so i detached the calendar part from the application and did some changes and customizations to it and its now ready for use in your android projects. you can get it from my github repo : https://github.com/mirrajabi/persian-calendar-view.



Latest comments
Mohammad Mirrajabi

سلام
به سوال شما در SO پاسخ داده شد.

18 AUGUST 2017
DRGNme

Salam, man too estefade az lib'etoon b bug khordam, inja matrah kardam, mamnoon misham check konid : https://stackoverflow.com/questions/45742753/crash-on-rotation-with-this-error-fragment-has-not-been-attached-yet

17 AUGUST 2017
Nazanin Syd

merC aWwwwli bood :))

15 AUGUST 2017
Mohammad Mirrajabi

سلام.
سوالاتی که پرسیدید مربوط به بخشهایی که من در اونها دخیل بودم نیست و برای پیدا کردن جوابشون لازمه اونها رو در این ریپو مطرح کنید. https://github.com/ebraminio/DroidPersianCalendar/issues

24 JUNE 2017
علی

در مورد این کد هم کمی توضیح بدید ممنون میشم چون نیاز مبرمی طریقه محاسبات تبدیل تقویم ها دارم.

 public static CivilDate persianToCivil(PersianDate persian) { 
return jdnToCivil(persianToJdn(persian));
}
public static IslamicDate persianToIslamic(PersianDate persian) {
return jdnToIslamic(persianToJdn(persian));
}
public static long persianToJdn(int year, int month, int day) {
final long PERSIAN_EPOCH = 1948321; // The JDN of 1 Farvardin 1
long epbase;
if (year >= 0)
epbase = year - 474;
else
epbase = year - 473;
long epyear = 474 + (epbase % 2820);
long mdays;
if (month <= 7)
mdays = (month - 1) * 31;
else
mdays = (month - 1) * 30 + 6;
return day + mdays + ((epyear * 682) - 110) / 2816 + (epyear - 1) * 365 + epbase / 2820 * 1029983 + (PERSIAN_EPOCH - 1);
}

ممنونم ازتون

24 JUNE 2017
علی

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

 public boolean isLeapYear() {
int y;
if (mYear > 0)
y = mYear - 474;
else y = 473;
return (((((y % 2820) + 474) + 38) * 682) % 2816) < 682;
}

24 JUNE 2017
Mohammad Mirrajabi

متاسفانه اطلاعی ندارم.

19 JUNE 2017
علی

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

16 JUNE 2017
Mohammad Mirrajabi

نه، روش خاصی وجود نداره. همین روشی که استفاده میکنی درسته.
روی Calendar باید از متد addLocalEvent استفاده کرد برای اضافه کردن رویداد دلخواه.
رویداد های قمری هر سال باید تغییر کنه ظاهرا با توجه به کتابخونه پایه که این رو باید خودتون حل کنید یا از همین لینک کمک بگیرید.

16 JUNE 2017
علی

ببخشید فراموش کردم اینو بپرسم امسال ماه رمضان 30 روزه هستش ولی توی تقویم کتابخانه 29 روزه نمایش میده بایدچطور اصلاحش کنم

16 JUNE 2017
علی

سلام ممنون از پاسخگویتون واقعا نمیدونم چطور بابت کمکهای که میکنید تشکر کنم. سوال دوم اینه مثالا الان توی ماه خرداد هستیم و ماه رو به صورت نام درج میکنم همین کار را با ماه میلادی وماه قمری میخوام نمایش بدم. من از دستور شرطی استفاده کردم بدین صورت که عدد ماه میلادی رو بگیر و اگر مثلا ماه 6 بود در تکست ویو ماه جولای رو نمایش بده. اگه دستور خاصی هست که بهتر بشه نام ماه رو بدست اورد ممنون میشم بگید. ضمنا یه سوال دیگه ام برام پیش اومده اینه چزور میتونم رخدادهای میلادی رو به پروژه وارد کنم

16 JUNE 2017
Mohammad Mirrajabi

جواب سوال اول یه چیزی تو این مایه هاست.

 String events = "";
for(CalendarEvent e : calendar.getAllEventsForDay(new PersianDate(1396,3,26)))
events += e.getTitle() + "\n";
textView.setText(events);

سوال دوم رو درست متوجه نشدم

16 JUNE 2017
علی

سلام. ببخشید که زیاد سوال می پرسم. ممنون میشم کمکم کنید. میخوام اسم ماه ها به میلادی و قمری رو وقتی مانند نام شمسی در تقویم نمایش بدم. ممنون میشم طریقه درست رو بهم بگید

16 JUNE 2017
علی

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

15 JUNE 2017
Mohammad Mirrajabi

سلام.
روش درست استفاده از کلاس DateConverter هست.
مثالی از تبدیل شمسی به میلادی رو تو این لینک میتونی ببینیhttps://github.com/Roojin/persian-calendar-view/issues/1

15 JUNE 2017
علی

سلام. ممنون از این کتابخانه عالیتون. ببخشید من مبتدی هستم میخواستم بدونم برای تبدیل شمسی به قمری و به میلادی باید از چه دستوراتی استفاده کنم

15 JUNE 2017
Mohammad Mirrajabi

ظاهرا که استاندارد نیست چون تکرار setAdapter روش منطقی ای نیست و اگه توی یک آداپتر قراره یک یا چند آیتم تغییری کنند مجددا همون خانواده متدهای notifyItemChanged رو توصیه میکنم.به سوالاتی که مرتبط با این کتابخونه باشه حتما پاسخ داده میشه.

15 MAY 2017
zaniyar

سلام :)وقت بخیرنمیدونم چطور ازتون تشکر کنم بابت این توجهی به پیامها دارین.موفقیت روزافزون براتون آرزومیکنم.والا اون مرحله بله.البته هنوز نمیدونم کارم استاندارده یا نه. چون متد با این سواد کمم فقط تونستم این راه رو پیدا کنم:متد زیر رو داخل CalendarFragment اضافه کردم و داخل اکتیویتی بابت هر بار کلیک روی هر روز این متد رو صدا زدم

 int vv=mMonthViewPager.getCurrentItem();
mPersianCalendarHandler = PersianCalendarHandler.getInstance(getContext());
mMonthViewPager.setAdapter(new CalendarAdapter(getChildFragmentManager()));
mMonthViewPager.setCurrentItem(vv);

و از notifyItemRangeChanged استفاده نکردم.دیر جواب دادم به این خاطر که مشغولش بودم.که باز سوال نپرسم :Dبا عرض پوزش ازتون اجازه میخوام که برای راهنمایی های احتمالی بعدی،بازهم مزاحمتون بشممجددا ازتون تشکر میکنم

15 MAY 2017
Mohammad Mirrajabi

سلام :)
الان ینی کاملا حل شد اون مشکل یا بخشیش مونده هنوز؟

13 MAY 2017
zaniyar

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

13 MAY 2017
zaniyar

سلام خیلی خیلی ممنون از اینکه زود پاسخ دادین واقعا ممنون با کمال میل ستاره میدم و خوشحال خواهم شد.من تازه کار هستم و زیاد آشنا نیستم والا حتما این کارهارو انجام میدادم. :)ببینید یه سری تغییراتی میخوام اعمال کنم مثلا اضافه کردن یاداشت برای روزها و...حالا من یه دیتابیس تعریف کردم که این اطلاعات مربوط به روزها رو نگه داره.از طرفی با کلیک روی روزها که میشه تیک زد و تیک برداشت،یه سری کارهای مربوط به دیتابیس باید انجام بشه(در ازای هر کلیک که اینکار رو با استفاده از متدهایی که توی هندلر (PersianCalendarHandler) تعریف کردم و صدا زدنشون توی اکتیویتی انجام دادم)مثلا بره 10 روز بعد از بزرگترین روز رو انتخاب کنه و ثبت کنه و علامت بزنه.تا الان تونستم این کارارو انجام بدم اما چون محاسبه ی این 10 روز بعد رو توی هندلر انجام میدم،از طرفی چون این 10 روز بعد توی ماه بعد ممکنه بیفته نمیدونم کجای کارم اشتباهه که باید یه دور اکتیویتی بسته بشه بعد اعمال میشه تغییرات.توی monthadapterفقط متد سازنده اش اول میام وضعیت همه ی روزهای تیک خورده رو میگیرم و بعد توی یه ArrayList (بولین) میریزم. بعد توی onclick میام دستی میگم آرای لیست مربوط به 10 روز بعد رو صفر کن و محاسبات رو انجام بده و...ادامه ی کارها .نمیدونم چطور میتونم داخل این onclick ،با دیتابیس یا هندلر ارتباط برقرار کنم.خیلی خیلی خیلیییییییی عذر میخوام بابت طولانی شدن پیامبی نهایت قدردان خواهم شد اگر بازهم راهنماییم کنین(البته اگر توضیحاتم مشخص بوده باشه)یه دنیا تشکر

13 MAY 2017
Mohammad Mirrajabi

سلام.
اگه اشتباه نکنم این مشکل با استفاده از متدهای مشابه notifyItemRangeChanged توی MonthAdapter حل میشه اگه مکانیزمی واسه تغییر آیتمای روز در نظر گرفته باشی.
مثلا تو همین MonthAdapter توی خط 46 کلیک روی هر روز هَندل شده.
البته اینی که گفتم CalendarFragment رو تغییری نمیده ولی حس میکنم به چیزی که گفتی نزدیکتره.
اگه در اشتباهم بگو که اصلاح کنم(احتمالا در اشتباهم)
در ضمن خیلی خوشحال میشم اگه نظرات اصلاحی یا پیشنهاداتی که باعث بهبود این پروژه میشه رو تو گیتهاب issue بزنید یا اینکه تغییراتتونو در قالب PullRequest ثبت کنید تا به پروژه اعمال کنم(در صورت منطقی بودن البته)
یه استارم اگه خواستین بدین کسی ناراحت نمیشه =))))))

11 MAY 2017
zaniyar

سلام وخیلی خیلی ممنون بابت این کتابخونه ی عالی.من میخوام بتونم با کلیک روی هر روزی کل فرگمنت تقویم آپدیت بشه.میشه راهنماییم کنید چطوری از داخل متد onclick مربوط به monthadapter فرگمنت calendar رو رفرش کنم؟(درواقع قابلیت تیک زدن یا برداشتن تیک رو روی هر روز ایجاد کردم .اما حالا میخوام با کلیک روی روزها بره و مثلا 10 روز بعد از بزرگترین روز رو علامت بزنه و به این نتیجه رسیدم که بهتره در ازای هرکلیک بیام و کلا فرگمنت calendar رو رفرش کنم.)بی نهایت متشکر میشم اگر یه راهنمایی جزیی کنید.

11 MAY 2017
Mohammad Mirrajabi

سلام و ممنون بابت نظرات

اگه تو کامپایل پروژه این مشکل رو دارید احتمالا بخاطر به روز نبودن اس دی کی هست. برای برطرف شدن این مشکل روش درست، آپدیت کردن اونه و البته روش دیگه تغییر نسخه به همون آخرین نسخه ای که خودتون دارین هست.
با توجه به اینکه درست متوجه اینکه مشکلتون در کدوم بخشه نشدم نمیتونم دقیق بگم
ولی احتمالا مشکل میتونه با تغییر نسخه ی کتابخانه های support حل بشه. مثلا در خط زیر

compile 'com.android.support:appcompat-v7:25.1.1'


میتونین 25.1.1 رو به آخرین نسخه ای که خودتون دارین تغییر بدین و اگه به ورژن زیر 25 تغییر دادین باید دقت کنید که مقدار های زیر رو هم به همون نسخه تغییر بدین.

targetSdkVersion , compileSdkVersion


توجه داشته باشین که در کتابخانه دو ماژول وجود داره که لازمه در هر دو این تغییرات رو اعمال کنید
اس دی کی هست Extras بهترین روش همون به روز کردن بخش
اگه مشکل باز هم مشکلی وجود داشت پاسخگو هستم.

22 APRIL 2017
Abdullah Monfared

سلام، ممنون بابت کتابخونه ها ولی موقع کامپایل ارور از کتابخونه های ساپورت میگیره و میگه باید ورژن 25.1.1 باشه ولی اندروید استودیوی من آخرین ورژن رو ۲۴ نشون میده .api 25 رو هم دارم

21 APRIL 2017
alireza

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

11 APRIL 2017