مكتبه : 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 
      
    مكتبه:android butter knife
مكتبه باتر نايف او بالعربيه سكينه الذبده، هي مكتبه هامه لجميع مطورى اندرويد استوديو. فهى توفر الكثير من الوقت والمجهود. حيث ان اى مشروع تعمل عليه يحتاج الكتير من الاوجيكت او الفيوز (Views) مثل الزراير والصور والتكست والامبوت تكست، وهنا تاتى المشكله لان كل عنصر يحتاج الى عمل تهيئه (initialization) على حدى وعمل متغير له او اوبجكت من الكائن خارج الكلاس. وتعريفه داخل الداله (onCreate) وذلك ياخد وقت وجهد كبير وهنا تاتى اهمية هذه المكتبه
مبرمج هذه المكتبه هو "Jake Wharton"
جاك ورثون البالغ من العمر .. سنه عملاق البرمجه لما له من اسهامات كثيره
- طور مكتبه butterknife عام 2013 ولاقت احسان الكثير من المطورين .. للينك المكتبه على الجيت هاب اضغط github
- وطور مكتبه RxAndroid عام 2015 ... للمزيد من التفاصيل حول المكتبه اضغط هــنــا وللينك المكتبه على الجيت هاب اضغط github
- وطور مكتبه Retrofit عام 2013 ... للمزيد من التفاصيل حول المكتبه اضغط هــنــا وللينك المكتبه على الجيت هاب اضغط github
كيفيه إضافه المكتبه Butter Knife للبروجكت فى الاندرويد استوديو
ملحوظه : الشرح على احدث اصدار من برنامج اندرويد استوديو نسخه 4.0.1 مع العلم ان الفكره فى الاصدار انه يستخدم مكتبه android X وليس android support
قبل اضافه مكتبه باتر نايف نعرف الفرق بين استخدام المكتبه وبدونها
لدينا مشروع بسيط يقوم بعمليه جمع رقمين يحتاج ل 2 EditText لادخال الرقمين و Button لتنفيذ العمليه و 2 TextView واحد لاظهار ناتج عمليه الجمع والثانى لتعريف المستخدم ان العمليه التى يقوم بها التطبيق جمع فقط
حسنا الان نبدء اضافه المكتبه ، نذهب لملف الجرادل ونضيف السطرين التاليين داخل اقواس كلمه اندرويد
        // Butterknife requires Java 8.
          compileOptions {
            sourceCompatibility JavaVersion.VERSION_1_8
            targetCompatibility JavaVersion.VERSION_1_8
          }
      
    ونضيف فى نفس الملف (gradle) داخل اقواس (dependencies) السطرين التاليين
        dependencies {
          implementation 'com.jakewharton:butterknife:10.2.3'
          annotationProcessor 'com.jakewharton:butterknife-compiler:10.2.3'
        }
      
    بعد الضغط على  Sync Now  للمشروع ننتظر حتى الانتهاء ولابد ان يعمل بشكل صحيح بدون مشاكل او اخطاء اثناء الاضافه.
الان نبدء استخدام مكتبه Butter Knife
  بدل من اخد ابجكت من الكلاس نكتب كلمه  @BindView   وبعد ذلك نحدد الكائن الذى نريده بكتابه  بين قوسين 
(R.id.item_name_xml) و نقوم بعمل كاستج لنوع المتغير وليكن من نوع TextView  وبعد ذلك نعطى اسم للمتغيرمثل item_name_java
ملاحظة : item_name_xml اسم الكائن فى ملف ال xml و item_name_java اسم المتغير للكائن الذى سنعطيه له فى كلاس الجافا
 







