اذهب إلى المحتوى
  • 0

كيف أضيف Textview يحسب الوقت المتبقي من الوقت المعطى الى الوقت الحالي؟ {يفضل استخدام كوتلن او جافا}

عبدالرحمن العنزي4

السؤال

السلام عليكم ورحمة الله وبركاته, أنا الان أعمل على تطبيق  في Android studio وانتهيت من اغلبة والحمدلله. لكن لدي بعض المشكلات التي أواجهها وان شاء الله سأفعل كل ما أستطيع لحلها. وانا الان أواجه مشكلة لم أستطع حلها واتمنى من  الشخص الخبير ان ينير لي الطريق بفهم مشكلتي.

انا لدي "java class" في تطبيقي  "أضغط هنا لرؤية الكود" يتم فيه حساب الصلوات اليومية من صلاة الفجر الى صلاة العشاء, وهذا الشيء يعمل لدي بشكل جيد ولله الحمد. والان انا اريد ان أضيف text view يقوم بحساب المتبقي لصلاة من الوقت الحالي, كمثال أريد بعد ان تنتهي صلاة العشاء يبدأ بالحساب لصلاة الفجر هكذا " المتبقي لصلاة الفجر 4 ساعات و 30 دقيقة"  ويتم الحساب فيه بشكل تنازلي  وما ان يصل وقت صلاة الفجر يبدأ بحساب الوقت المتبقي لموعد الشروق  ثم لصلاة الظهر وهكذا الى ما لا نهايه.

ما أريده هو 

  • Text view يتم فيه حساب المتبقي من الصلاوات الى الوقت الحالي
  • يتم الحساب بشكل تنازلي كمثال :" المتبقي لصلاة العصر 3 ساعات و20 دقيقة" وبعد كم من الوقت يكون هكذا " المتبقي لصلاة العصر 2 ساعه و 15 دقيقة"
  • للنظر الى كود حساب الصلاوات أرجو ان تضغط هنا

وهذا الكود الذي كتبتة لجلب بيانات الصلاة من الكلاس (يعمل بشكل جيد الا حساب الوقت المتبقي بين الصلاتين)

 val TimeId = TimezoneMapper.latLngToTimezoneString(
                            location.latitude,
                            location.longitude
                        )

                        val gmt = TimeZone.getTimeZone(TimeId).getDisplayName(false, TimeZone.SHORT)

                        val z1 = gmt.substring(4)
                        val z = z1.replace(":", ".")
                        val zo = z.toDouble()
                        val latitude: Double = location.latitude
                        val longitude: Double = location.longitude

                        val locationPref = getSharedPreferences("location", Context.MODE_PRIVATE)
                        val editor = locationPref.edit()
                        //    editor.putFloat("lat", lat1.toFloat())
                        //   editor.putFloat("lng", lng.toFloat())
                        locationPref.edit().putDouble("latt1", latitude).apply()
                        locationPref.edit().putDouble("lngg2", longitude).apply()

                        editor.apply()


                        val timeZoneId = TimeZone.getAvailableIDs()
                        val prayTime = praytime()
                        //prayTime.timeFormat = prayTime.time12 // getTime12 is protected
                        prayTime.timeFormat = prayTime.time12NS
                        prayTime.calcMethod = prayTime.makkah // Makkah
                        prayTime.asrJuristic = prayTime.shafii // Shafii (standard)
                        prayTime.adjustHighLats = prayTime.angleBased
                        // my codes
                        prayTime.timeZone = prayTime.timeZone1
                        prayTime.setFajrAngle(18.5)
                        prayTime.computeMidDay(prayTime.dhuhrMinutes.toDouble())
                        val offsets = intArrayOf(
                            0,
                            0,
                            0,
                            0,
                            0,
                            0,
                            0
                        ) // {Fajr,Sunrise,Dhuhr,Asr,Sunset,Maghrib,Isha}

                        prayTime.tune(offsets)
                        cal = Calendar.getInstance(TimeZone.getTimeZone(timeZoneId.toString()))
                        val now = Date()
                        cal.time = now


                        val times: ArrayList<String> =
                            prayTime.getPrayerTimes(
                                cal, latitude, longitude, zo
                            )
                        findViewById<TextView>(R.id.Fajr).text = times.get(0)
                        findViewById<TextView>(R.id.sabah).text = times.get(1)
                        findViewById<TextView>(R.id.dhuhr).text = times.get(2)
                        findViewById<TextView>(R.id.AzanTime).text = times.get(3)
                        findViewById<TextView>(R.id.maghreb).text = times.get(4)
                        findViewById<TextView>(R.id.Esha).text = times.get(6)
                          
                          // الكود الذي تحت هذه جمله هو محاولة مني لكن للأسف بائت بالفشل
     <---------------------------------------------------------------------------------------------------------------------->  
                        
                            // this is where i coun the time difference
                        val timeFormat = DateTimeFormatter.ofPattern("hh:mm a", Locale.getDefault())
                        val time = LocalTime.now().format(timeFormat)
                        val timeTo12AM = "12:00 AM"
                        if (timeTo12AM <= time && time < times[0]) {

                            val timeFormat1 = DateTimeFormatter.ofPattern("hh:mm a", Locale.ENGLISH)
                            val currentTime = SimpleDateFormat("hh:mm a", Locale.ENGLISH).format(Date())
                            val startTime = currentTime

                            val start = LocalTime.parse(startTime, timeFormat1)
                            val endTime = times[0]
                            val end = LocalTime.parse(endTime, timeFormat1)
                            val diff = Duration.between(start, end)
                            val hours = diff.toHours()
                            val minutes = diff.minusHours(hours).toMinutes()
                            salahName.text = "الفجر"
                            salahTimeLeft.text = "${hours}ساعات " + "${minutes} ودقيقة "
                            if (hours.equals(0)){
                                salahTimeLeft.text =  "${minutes}دقيقة "

                            }
                        } else if (timeTo12AM <= time && time > times[0] && time < times[1]) {
                            val timeFormat1 = DateTimeFormatter.ofPattern("hh:mm a", Locale.ENGLISH)
                            val currentTime = SimpleDateFormat("hh:mm a", Locale.ENGLISH).format(Date())
                            val startTime = currentTime
                            val endTime = times[1]

                            val start = LocalTime.parse(startTime, timeFormat1)
                            val end = LocalTime.parse(endTime, timeFormat)

                            val diff = Duration.between(start, end)
                            val hours = diff.toHours()
                            val minutes = diff.minusHours(hours).toMinutes()

                            salahName.text = "الشروق"
                            salahTimeLeft.text = "${hours}ساعات " + "${minutes} ودقيقة "
                        }else if (timeTo12AM <= time && time >times[0] && time > times[1] && time < times[4] ){
                            val timeFormat1 = DateTimeFormatter.ofPattern("hh:mm a", Locale.ENGLISH)
                            val currentTime = SimpleDateFormat("hh:mm a", Locale.ENGLISH).format(Date())
                            val startTime = currentTime
                            val endTime = times[4]

                            val start = LocalTime.parse(startTime, timeFormat1)
                            val end = LocalTime.parse(endTime, timeFormat)

                            val diff = Duration.between(start, end)
                            val hours = diff.toHours()
                            val minutes = diff.minusHours(hours).toMinutes()

                            salahName.text = "المغرب"
                            salahTimeLeft.text = "${hours}ساعات " + "${minutes} ودقيقة "
                        }

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

Recommended Posts

  • 1

تقوم أولا بتعريف مصفوفة لعناوين المواعيد بنفس الترتيب الذي يرجعه الصف PrayTime ويجب أن يكون تصاعديا (في الشيفرة قد يبدو الترتيب معكوسا بسبب اتجاه اللغة العربية)

String[] salahNames = { "الفجر", "الصبح", "الظهر", "العصر", "المغرب", "العشاء" };

نقوم بالمرور على كافة المواعيد بالترتيب، ونقارن الوقت الحالي بتوقيت كل موعد، عند أول توقيت لا يكون قد مضى نكون حاليا عند الموعد القادم

for (int i = 0; i < salahNames.length; i++) {
  // اسم الموعد الحالي
  String salahName = salahNames[i];
  
  // توقيت الموعد الحالي
  String salahTimeString = times.get(i);
  LocalTime salahTime = LocalTime.parse(salahTimeString, DateTimeFormatter.ofPattern("hh:mm a", Locale.ENGLISH));
  
  // التوقيت الآن
  LocalTime currentTime = LocalTime.now();

  // اذا كان الموعد الحالي هو القادم
  if (salahTime.isAfter(currentTime)) { 

    // نقوم بحساب الوقت المتبقي وننهي الحلقة ...
    break;
  }
}

تقوم بحساب الوقت المتبقي للموعد القادم ابتداءا من الوقت الحالي، وانشاء النص وتحديث الواجهة

if (salahTime.isAfter(currentTime)) {
  // الوقت المتبقي
  Duration diff = Duration.between(salahTime, currentTime);
  
  // الساعات والدقائق
  long hours = diff.toHours();
  long minutes = diff.minusHours(hours).toMinutes();

  // بناء نص الإظهار
  String timeLeftToNextSalah = "";

  if (hours > 0) { // اضافة الساعات فقط اذا كان التوقيت اكثر من ساعة
    timeLeftToNextSalah += hours + " ساعات";
    timeLeftToNextSalah += " و ";
  }
  timeLeftToNextSalah += minutes + " دقيقة";

  // نحدث الواجهة باسم الموعد القادم والوقت المتبقي
  findViewById<TextView>(R.id.NextSalahName).text = salahName;
  findViewById<TextView>(R.id.NextSalahTimeLeft).text = timeLeftToNextSalah;
  
  break;
}

يمكنك إعادة تنفيذ ما سبق والتحديث كل دقيقة عبر استخدام Timer كالتالي

Timer timer = new Timer();

timer.schedule( new TimerTask() {
    public void run() {
       // إعادة الحساب وتحديث الواجهة 
    }
 }, 0, 60*1000); // كل دقيقة

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 1
بتاريخ 6 ساعات قال عبدالرحمن العنزي4:

شكرا لك أخي الكريم.. قمت فهم كلامك وايضا قمت بتحويل اغلب الكود الذي ارسلته الى لغة الكوتلن مع تغيير قليل وأيضا اضافة بعض الدوال والافكار وبحمد الله تم حل مشكلتي ويعود الفضل بعد الله سبحانه وتعالى اليك جزاك الله خيرا .. سؤال اخير ماذا يجب علي ان اكتب في كود الـTimer حتى تتحدث النتيجة كل دقيقة؟

الحل الأمثل، هو وضع الشيفرة التي تقوم بحساب الوقت ضمن الدالة function ومن ثم استدعاء هذه الدالة ضمن run في المؤقت الزمني.

يمكنك تعريف المصفوفة أولا خارج الدالة، ثم تكتب تعريف الدالة، ثم شيفرة المؤقت

String[] salahNames = { "الفجر", "الصبح", "الظهر", "العصر", "المغرب", "العشاء" };

function calculate_logic() {
	// منكطق الشيفرة
}

Timer timer = new Timer();

timer.schedule( new TimerTask() {
    public void run() {
	
	// إعادة الحساب وتحديث الواجهة 

	calculate_logic()

    }
 }, 0, 60*1000); // كل دقيقة

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 1 ساعة قال Wael Aljamal:

حاول توضيح المشكلة، وأرفق صور للنتائج، وماذا يعيد كلاس الجافا ولأي مرحلة وصلت بكتابة شيفرتك لحساب الفروقات..

 

تم ذكر الذي يعيدة يا أخي الكريم .. كلاس الجافا يعيد اوقات من الفجر الى العشاء مثلا يعيد صلاة الفجر كذا :" 4:43 am" و صلاة الظهر :" 12:09 pm".. الخ, فأنا أريد معرفة الوقت المتبقي الاوقات المعطاه من الكلاس كمثال اريدة هكذا :" المتبقي لصلاة الفجر 4 ساعات و 30 دقيقة" وحال وصول الوقت اريدة ان ينتقل الى الصلاة الاخرى

تم التعديل في بواسطة عبدالرحمن العنزي4
رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 7 ساعات قال عبدالرحمن العنزي4:

تم ذكر الذي يعيدة يا أخي الكريم .. كلاس الجافا يعيد اوقات من الفجر الى العشاء مثلا يعيد صلاة الفجر كذا :" 4:43 am" و صلاة الظهر :" 12:09 pm".. الخ, فأنا أريد معرفة الوقت المتبقي الاوقات المعطاه من الكلاس كمثال اريدة هكذا :" المتبقي لصلاة الفجر 4 ساعات و 30 دقيقة" وحال وصول الوقت اريدة ان ينتقل الى الصلاة الاخرى

تريد عرض أقرب صلاة؟

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 3 ساعات قال Wael Aljamal:

تريد عرض أقرب صلاة؟

أنا أستطيع عرض الصلاوات كاملة .. انا اريد فقط ان أعرف كيف احسب الوقت المتبقي من مثلا صلاة الفجر الى موعد الشروق ومن موعد الشروق الى صلاة الظهر.. الخ .. اريد ان اعرف كيف احسب صلاة الفجر "4:43" من الوقت الحالي وعندما ينتهي اريد ان يحسب الوقت المتبقي لموعد الشروق "6:06" وهكذا

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ On 8‏/10‏/2021 at 18:09 قال Hassan Hedr:

تقوم أولا بتعريف مصفوفة لعناوين المواعيد بنفس الترتيب الذي يرجعه الصف PrayTime ويجب أن يكون تصاعديا (في الشيفرة قد يبدو الترتيب معكوسا بسبب اتجاه اللغة العربية)


String[] salahNames = { "الفجر", "الصبح", "الظهر", "العصر", "المغرب", "العشاء" };

نقوم بالمرور على كافة المواعيد بالترتيب، ونقارن الوقت الحالي بتوقيت كل موعد، عند أول توقيت لا يكون قد مضى نكون حاليا عند الموعد القادم


for (int i = 0; i < salahNames.length; i++) {
  // اسم الموعد الحالي
  String salahName = salahNames[i];
  
  // توقيت الموعد الحالي
  String salahTimeString = times.get(i);
  LocalTime salahTime = LocalTime.parse(salahTimeString, DateTimeFormatter.ofPattern("hh:mm a", Locale.ENGLISH));
  
  // التوقيت الآن
  LocalTime currentTime = LocalTime.now();

  // اذا كان الموعد الحالي هو القادم
  if (salahTime.isAfter(currentTime)) { 

    // نقوم بحساب الوقت المتبقي وننهي الحلقة ...
    break;
  }
}

تقوم بحساب الوقت المتبقي للموعد القادم ابتداءا من الوقت الحالي، وانشاء النص وتحديث الواجهة


if (salahTime.isAfter(currentTime)) {
  // الوقت المتبقي
  Duration diff = Duration.between(salahTime, currentTime);
  
  // الساعات والدقائق
  long hours = diff.toHours();
  long minutes = diff.minusHours(hours).toMinutes();

  // بناء نص الإظهار
  String timeLeftToNextSalah = "";

  if (hours > 0) { // اضافة الساعات فقط اذا كان التوقيت اكثر من ساعة
    timeLeftToNextSalah += hours + " ساعات";
    timeLeftToNextSalah += " و ";
  }
  timeLeftToNextSalah += minutes + " دقيقة";

  // نحدث الواجهة باسم الموعد القادم والوقت المتبقي
  findViewById<TextView>(R.id.NextSalahName).text = salahName;
  findViewById<TextView>(R.id.NextSalahTimeLeft).text = timeLeftToNextSalah;
  
  break;
}

يمكنك إعادة تنفيذ ما سبق والتحديث كل دقيقة عبر استخدام Timer كالتالي


Timer timer = new Timer();

timer.schedule( new TimerTask() {
    public void run() {
       // إعادة الحساب وتحديث الواجهة 
    }
 }, 0, 60*1000); // كل دقيقة

 

شكرا لك أخي الكريم.. قمت فهم كلامك وايضا قمت بتحويل اغلب الكود الذي ارسلته الى لغة الكوتلن مع تغيير قليل وأيضا اضافة بعض الدوال والافكار وبحمد الله تم حل مشكلتي ويعود الفضل بعد الله سبحانه وتعالى اليك جزاك الله خيرا .. سؤال اخير ماذا يجب علي ان اكتب في كود الـTimer حتى تتحدث النتيجة كل دقيقة؟

رابط هذا التعليق
شارك على الشبكات الإجتماعية

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...