مكتبه : Joda-Time (للتاريخ الهجرى)
التاريخ الهجرى له اهميه كبيره لدى المسلين لانه التاريخ المعتمد لديهم وهو بدايه هجره المصطفى صلى الله عليه وسلم.،
اغلب لغات البرمجه لها مكتبات تدعم التاريخ الهجرى لكن منذ فتره ليست بالقريبه لم تكن لغه الجافا تدعم التاريخ الهجرى وكنت تحتاج لبذل مجهود مضاعف لعمل التاريخ الهجرى بالجافا وايضا فى تطبيقات الاندرويد.، لكن بعد هذه المكتبه ستتعامل مع التاريخ الهجرى بكل يسر وسهوله.
من خلال هذه التدويته، سنبدء عمل مشروع بسيط يعرض التاريخ الهجرى والتاريخ الميلادى معا
وستكون واجهه التطبيق النهائيه كما بالشكل التالىملاحظه : الشرح مبسط جدا ولا نعطى اهميه فى الشرح للكود ديزاين (Design Code) ولا كتابه الاسماء فى ملف الاسترنج (Strings.xml)
اولا : سيتم عمل مشروع جديد باسم (Jado_Time_Hgre)
سنستخدم فى هذا المشروع مكتبه ( androidx ) وسنختاج اضافة السطر التالي لكي نستخدم ال (CardView) فى المشروع من خلال الذهاب الى ملف الجرادل ونضيف السطر التالي داخل ال (dependencies)
//card view library
implementation 'androidx.cardview:cardview:1.0.0'
بعد ذلك سنحتاج عمل مجموعه من ( TextView ) لعرض البيانات مثل التاريخ واليوم والشهر الخ، لذلك تم عمل التصميم البسيط التالى. فقط قم بنسخه داخل ملف ال ( activity_main.xml ) الخاص بالاكتفتى الرئيسي. وقم بتحميل الصوره من هذا اللينك ووضعها داخل مجلد ( Drawable )
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<LinearLayout
android:id="@+id/linearLayout"
android:layout_width="match_parent"
android:layout_height="0dp"
android:orientation="horizontal"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<androidx.cardview.widget.CardView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:layout_marginTop="20dp"
android:layout_weight="1">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:orientation="vertical">
<TextView
android:id="@+id/tv_hgry_day_xml"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="30dp"
android:layout_weight="1"
android:gravity="center_horizontal"
android:padding="10dp"
android:text="8"
android:textAlignment="center"
android:textSize="20dp"
android:textStyle="bold" />
<TextView
android:id="@+id/tv_hgry_month_xml"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:gravity="center_horizontal"
android:padding="10dp"
android:text="محرم"
android:textAlignment="center"
android:textSize="20dp"
android:textStyle="bold" />
<TextView
android:id="@+id/tv_hgry_year_xml"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:gravity="center_horizontal"
android:padding="10dp"
android:text="1442"
android:textAlignment="center"
android:textSize="20dp"
android:textStyle="bold" />
</LinearLayout>
</androidx.cardview.widget.CardView>
<androidx.cardview.widget.CardView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:layout_marginTop="20dp"
android:layout_weight="1">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:orientation="vertical">
<TextView
android:id="@+id/tv_ar_name_day_xml"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="30dp"
android:layout_weight="1"
android:gravity="center_horizontal"
android:padding="10dp"
android:text="الخميس"
android:textAlignment="center"
android:textSize="20dp"
android:textStyle="bold" />
<TextView
android:id="@+id/tv_en_name_day_xml"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:gravity="center_horizontal"
android:padding="2dp"
android:text="THURSDAY"
android:textAlignment="center"
android:textSize="14sp"
android:textStyle="bold" />
<TextView
android:id="@+id/tv_en_num_day_xml"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:gravity="center_horizontal"
android:padding="10dp"
android:text="27"
android:textAlignment="center"
android:textSize="20dp"
android:textStyle="bold" />
<TextView
android:id="@+id/tv_all_num_data_xml"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:gravity="center_horizontal"
android:padding="2dp"
android:text="2020/10/08"
android:textAlignment="center"
android:textSize="14sp"
android:textStyle="bold" />
</LinearLayout>
</androidx.cardview.widget.CardView>
<androidx.cardview.widget.CardView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:layout_marginTop="20dp"
android:layout_marginRight="10dp"
android:layout_weight="1">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:orientation="vertical">
<TextView
android:id="@+id/tv_ar_num_day_xml"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="30dp"
android:layout_weight="1"
android:gravity="center_horizontal"
android:padding="10dp"
android:text="27"
android:textAlignment="center"
android:textSize="20dp"
android:textStyle="bold" />
<TextView
android:id="@+id/tv_ar_name_month_xml"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:gravity="center_horizontal"
android:padding="10dp"
android:text="اغسطس"
android:textAlignment="center"
android:textSize="20dp"
android:textStyle="bold" />
<TextView
android:id="@+id/tv_ar_num_year_xml"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:gravity="center_horizontal"
android:padding="10dp"
android:text="2020"
android:textAlignment="center"
android:textSize="20dp"
android:textStyle="bold" />
</LinearLayout>
</androidx.cardview.widget.CardView>
</LinearLayout>
<LinearLayout
android:id="@+id/linearLayout3"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_marginStart="8dp"
android:layout_marginEnd="8dp"
android:orientation="vertical"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/linearLayout">
<androidx.cardview.widget.CardView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="10dp">
<TextView
android:id="@+id/textView11"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:padding="10dp"
android:text="نشر العلم وتعليمة صدقة جارية "
android:textAlignment="center"
android:textSize="18sp"
android:textStyle="bold" />
</androidx.cardview.widget.CardView>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:orientation="vertical"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/linearLayout3">
<androidx.cardview.widget.CardView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="5dp"
android:layout_marginBottom="5dp"
android:layout_weight="1">
<ImageView
android:id="@+id/imageView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:contentDescription="TODO"
android:paddingLeft="5dp"
android:paddingRight="5dp"
app:srcCompat="@drawable/clock" />
</androidx.cardview.widget.CardView>
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
ثانيا : نبدء اضافة مكتبه "joda time" للمشروع
//joda time library
implementation 'joda-time:joda-time:2.10.6'
بعد اضافه المكتبه نضغط على كلمه "Sync Now" فى اعلى يمين الشاشة ونذهب الى كلاس "MainActivity" لاضافه الاكواد البرمجية
ملاحظه : يمكن استخدام مكتبه "Butter Knife" لتقليل الاسطر البرمجيه وتوفير الوقت وذلك افضل ولكن هنا سنتعامل بابسط الاساليب فى هذا المروع حتى لا نعقد الامور ،
نبدء باخذ "object" من العناصر التى نحتاجها وذلك من خلال الكواد التالى
//Start CODE : 1
TextView tv_hgry_day_java ,tv_hgry_month_java ,
tv_hgry_year_java,tv_ar_name_day_java,
tv_en_name_day_java,tv_en_num_day_java,
tv_all_num_data_java,tv_ar_num_day_java,
tv_ar_name_month_java,tv_ar_num_year_java;
//object from Datetime class
DateTime dataTime;
//End CODE : 1
بعد ذلك نقوم بعمل "initialization" للعناصر وذلك من خلال الكود التالى
//Start CODE : 2
tv_hgry_day_java = findViewById(R.id.tv_hgry_day_xml);
tv_hgry_month_java = findViewById(R.id.tv_hgry_month_xml);
tv_hgry_year_java = findViewById(R.id.tv_hgry_year_xml);
tv_ar_name_day_java = findViewById(R.id.tv_ar_name_day_xml);
tv_en_name_day_java = findViewById(R.id.tv_en_name_day_xml);
tv_en_num_day_java = findViewById(R.id.tv_en_num_day_xml);
tv_all_num_data_java = findViewById(R.id.tv_all_num_data_xml);
tv_ar_num_day_java = findViewById(R.id.tv_ar_num_day_xml);
tv_ar_name_month_java = findViewById(R.id.tv_ar_name_month_xml);
tv_ar_num_year_java = findViewById(R.id.tv_ar_num_year_xml);
//initialization object
dataTime = new DateTime();
// convert Gregorian date to hijri
DateTime islamDate = dataTime.withChronology(IslamicChronology.getInstance());
//End CODE : 2
الان بعد ان اخذنا اوبجكت من كلاس ( DataTime ) وتم عمل ( initialization ) لها ناتى لاهم نقطه وهي طباعه التاريخ الميلادى ، لان اساس عمل المكتبه مبنى على التاريخ الميلادى عن طريق تحويله للتاريخ الهجرى.
ناتى الان لتحويل التاريخ الميلادى الى تاريخ هجرى، ويكون ذلك باستدعاء الداله (withChronology) من خلال عمل ابجكت من كلاس (DateTime). لنستدعى الداله ( withChronology ) ونمرر لها بارميتر من نوع ( Chronology ).
فيصح الكود بالشكل التالى
DateTime islamDate = dataTime.withChronology(IslamicChronology.getInstance());
ولطباعه التاريخ الهجرى نستخدم المتغير الذى قما بعمله باسم (islamDate) واستدعاء نفس الدوال السابق استدعائها فى التاريخ الميلادى
islamDate.getDayOfMonth(); لطباعة الشهر
islamDate.toString("YYYY"); لطباعة السنة
فنقول ان لدينا تكست معرف باسم (x) ولطباعه قيمه تكون باستدعاء الداله (setText) ونحول القيمه المدخله ل (String) عن طريق الداله (String.valueOf) ونمرر لها التاريخ كبارميتر ليصبح الكود كما بالشكل التالى
//Start CODE : 3
//Gregorian date
tv_ar_num_day_java.setText(String.valueOf(dataTime.getDayOfMonth()));//day number //TODO translate to arabic
tv_ar_name_month_java.setText(dataTime.toString("MMMM"));//month name //TODO translate to arabic
tv_ar_num_year_java.setText(String.valueOf(dataTime.getYear()));//year number //TODO translate to arabic
tv_ar_name_day_java.setText(dataTime.toString("EE"));//day name //TODO translate to arabic
tv_en_name_day_java.setText(dataTime.toString("EEEE"));//day english name
tv_en_num_day_java.setText(String.valueOf(dataTime.getDayOfMonth()));//day english number
tv_all_num_data_java.setText(dataTime.toString("YYYY/MM/dd"));//all data number
//hijri date
tv_hgry_day_java.setText(String.valueOf(islamDate.getDayOfMonth()));//day hijri
tv_hgry_month_java.setText(String.valueOf(islamDate.getMonthOfYear()));//month hijri //TODO display name Hijri month as a String
tv_hgry_year_java.setText(String.valueOf(islamDate.getYear()));//year hijri
//End CODE : 3
تعليقات
إرسال تعليق