مرحباً هبر!
عزيزي القارئ! إذا كنت مهتمًا بتحليل html وتطوير Android ، فهذا المقال مناسب لك. آمل أن تجد الكثير من الأشياء المثيرة للاهتمام والمفيدة فيه. في ذلك أريد أن أشارك تجربتي في هذا المجال.
وصف المشكلة
قليلا عني. أنا طالب في السنة الثالثة من ITA SFU. مثل كل الطلاب ، أحتاج إلى إلقاء نظرة على جدول الحصص كل يوم. ولست بحاجة لمعرفة الجدول الزمني ليس فقط في اليوم التالي ، ولكن أيضًا قبل أسبوع أو أسبوعين مقدمًا.
يبدو ، لماذا لا مجرد حفظ الجدول الزمني واستخدامه؟ لسوء الحظ ، هناك عدد من الأسباب التي تحول دون ذلك ، وهي:
- يمكن أن يكون الجدول لمدة أسبوع مختلفًا تمامًا عن الجدول الزمني لآخر
- الجدول الزمني ليس ثابتًا وقد يتغير
بالطبع ، هناك موقع به جدول زمني ، لكنه ليس ملائمًا جدًا ، لأنه يعرض فقط جدولًا خامًا مع جدول زمني لمدة 20 أسبوعًا. يتعين على الطالب قلب صفحة كبيرة ، والبحث عن جدول لليوم المطلوب. بالإضافة إلى ذلك ، في وضع عدم الاتصال ، يصبح الجدول غير متوفر.
قررت تقديم طلب صغير يمكنه تحليل الموقع وفقًا للجدول الزمني للمعهد الخاص بي ، وسيحصل على المجموعة التالية من الأشياء الجيدة:
- العرض: رقم الأسبوع الحالي والتاريخ ويوم الأسبوع والجدول الزمني لذلك اليوم
- القدرة على التمرير خلال الجدول الزمني مع أزرار "العودة" و "التالي"
- إذا لم يكن هناك إنترنت ، فقم بإظهار أحدث إصدار تم تنزيله من الجدول
الشروع في التنفيذ
لذلك ، نشمر عن سواعدي ، لقد بدأت العمل. تحتاج إلى أن تبدأ صغيرة. وهي ، من تحرير ملف البيان. تجدر الإشارة إلى أن تطبيقنا سيعمل مع الإنترنت ومن المهم للغاية بالنسبة لنا الحصول على الإذن المناسب:
ملف البيانانتقل إلى manifests-> AndroidManifest.xml. إضافة إذن. والنتيجة هي شيء مثل هذا:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.myapplication"> <uses-permission android:name="android.permission.INTERNET" /> ... </manifest>
الآن دعنا ننتقل إلى الواجهة. الآن ، دعنا نركز على الوظائف وليس إساءة استخدام الأدوات. لذلك ، وضعت أربعة عناصر واجهة مستخدم فقط: العنوان ومربع النص والأزرار: ذهابًا وإيابًا.
ترميز النشاط <?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"> <TextView android:id="@+id/WeekNumber" android:layout_width="match_parent" android:layout_height="wrap_content" android:text=" " app:layout_constraintTop_toTopOf="parent" /> <EditText android:id="@+id/timetable" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginBottom="100dp" android:ems="10" android:inputType="textMultiLine" android:text="" app:layout_constraintTop_toBottomOf="@+id/WeekNumber" tools:layout_editor_absoluteX="0dp" /> <Button android:id="@+id/next" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="" app:layout_constraintBottom_toBottomOf="parent" tools:layout_editor_absoluteX="0dp"></Button> <Button android:id="@+id/down" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="" app:layout_constraintBottom_toTopOf="@+id/next" tools:layout_editor_absoluteX="0dp"></Button> </androidx.constraintlayout.widget.ConstraintLayout>
الآن لنبدأ التحليل. هذا هو المكان الذي يساعدنا فيه محلل المصادر المفتوح الرائع Jsoup. لقد رفضت على الفور الخيار باستخدام WebView ، حيث أنني وجدت هذه الطريقة غير مريحة للغاية. بالإضافة إلى ذلك ، لم أكن أريد حقًا استخدام أداة إضافية ، والتي بدونها يمكنك بسهولة القيام بذلك.
اتصال Jsoupأضف التبعية إلى build.gradle:
implementation 'org.jsoup:jsoup:1.11.1'
لا تنس أن العمل مع الويب لنظام Android هو مهمة صعبة. لمنع التطبيق من التعليق ، تحتاج إلى العمل مع الويب الموجود خارج دفق واجهة المستخدم. لذلك ، سوف نستخدم فئة AsyncTask. سنضع الوظائف الأساسية فيه ، ثم نقل البيانات إلى دفق واجهة المستخدم.
بالنسبة لأولئك الذين ليسوا على دراية بـ AsyncTask ، أريد أن أقول إن هذه الفئة يجب أن تكون موجودة داخل فئة نشاطك. الصف نفسه هو مبين أدناه.
رمز النشاط مع فئة AsyncTask package com.example.myapplication; import androidx.appcompat.app.AppCompatActivity; import android.os.AsyncTask; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; import android.widget.Toast; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; public class MainActivity extends AppCompatActivity { public boolean offline; public String request; public String WeekNumber; public int count;
نتيجة لذلك ، نحصل على البيانات في هذا النموذج:
دعنا نحلل الطرق التي استخدمناها:
إنشاء عنصر من نوع المستند
Document document = null;
نحصل على الصفحة
document = Jsoup.connect(url).get();
الآن نحصل على محتويات علامة الجسم
answer = document.body().html();
يمكن لـ Jsoup أيضًا استرداد محتويات العلامات الأساسية الأخرى. على سبيل المثال ، يمكنك الحصول على عنوان الصفحة باستخدام طريقة title () ، إلخ. طريقة Html () إرجاع رمز HTML ، والنص () نص عادي بدون علامات html.
بعد تلقي كود html ، يمكنك تحويله إلى نص عادي ، وإزالة جميع العلامات. يمكن القيام بذلك باستخدام تحليل (htmlcode) .text ():
return Jsoup.parse(answer).text();
أرغب في مشاركة بعض طرق Jsoup الأكثر فائدة والتي لم يتم استخدامها:
Element link = document.select("tag");
الصورة في المفسد أعلاه هي مثال على جدول مدته أسبوع واحد. في الواقع ، سيتم إرجاع 20 أسبوعا من هذا القبيل لنا. مهمتنا الآن هي العثور اليوم في مجموعة البيانات هذه وعرضها.
جلب إلى الذهن
إذن ماذا لدينا؟ لقد تعلمنا كيفية تحويل كود html الخاص بصفحة ما إلى سلسلة يمكن تحليلها بسهولة. يمكن القيام بذلك بسهولة باستخدام أساليب السلسلة .split () و .replace ().
بشكل عام ، ستبدو الخوارزمية هكذا.
أولاً نحصل على التاريخ المطلوب من Android. ثم نقوم بدورتين ، واحدة متداخلة في الأخرى. تستمر الدورة الأولى خلال الأسابيع ، بينما تستمر الدورة الثانية ، التي بداخلها ، خلال أيام الأسبوع. إذا كان تاريخ اليوم يتزامن مع التاريخ الذي تم استلامه من Android ، فسنعرض الجدول الزمني لهذا اليوم في مربع النص. ومع ذلك ، يمكن للجميع كتابة هذه الخوارزمية بطريقتهم الخاصة. أرفقت روايتي لتنفيذه.
رمز النشاط الكامل package com.example.myapplication; import androidx.appcompat.app.AppCompatActivity; import android.os.AsyncTask; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; import android.widget.Toast; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; public class MainActivity extends AppCompatActivity { public boolean offline; public String request; public String WeekNumber; public int count;
إحضار الجدول يحدث في طريقة formating (). من خلال تقديم تاريخ إلى طريقة الإدخال ، سوف نحصل على جدول لذلك اليوم. لذلك يمكننا بسهولة تنفيذ الكود الخاص بأزرار "الخلف" و "التالي"
رمز الزر التالي:
count++; Calendar calendar = Calendar.getInstance(); calendar.add(Calendar.DAY_OF_YEAR,count); Date dayformat = calendar.getTime(); SimpleDateFormat format = new SimpleDateFormat("dd MMMM"); formating(format.format(dayformat));
باستخدام التقويم نحصل على تاريخ اليوم. باستخدام طريقة الإضافة ، نضيف عدد الأيام المسجلة في العد إلى تاريخ اليوم. سيكون رمز الزر الخلفي مشابهًا ، وسيحتاج فقط العد إلى تقليل القيمة.
استنتاج
بالطبع ، يمكنك العمل على التصميم ، ولكن هذا موضوع آخر. أردت فقط مشاركة التقنيات الأساسية. في المفسدين أدناه ، أرفقت لقطات شاشة بتصميم محسن. أضفت أيضًا العديد من الوظائف ، على سبيل المثال: الإعدادات ، القدرة على اختيار مجموعة دراسة ، إلخ. يمكن الاطلاع على التطبيق نفسه في وقت لاحق ، بمجرد أن أحمله إلى الذهن.