كيفية برمجة تطبيق الاندرويد لمدونات Blogger



سوف نتعلم اليوم كيفية برمجة تطبيق الاندرويد لمدونات الـ Blogger وهي المدونات الرسمية من جوجل, بالتالي لديها قوة ارشفة كبيرة لتظهر في محرك البحث جوجل .. وننصحك اذا لم تقم سابقاً بإنشاء مدونة, تجربة العمل عليها بالبداية .. لسهولة التعامل معها. لإنشاء مدونة بلوجر اضغط هنا

لمشاهدة مثال على نموذج درس اليوم, قم بتحميل تطبيق ” الشامل في تعلم اللغة التركية ” وتصفح قسم مواضيع إضافية, فهي مواضيع يتم جلبها من مدونة بلوجر.

نتيجة تطبيقك ومتابعتك لدروس تعلم برمجة تطبيق اندرويد لمدونتك البلوجر :




في البداية سوف نقوم بإنشاء مشروع جديد على برنامج الاندرويد ستوديو, وإذا لم يكن لديك برنامج الاندرويد ستديو لبرمجة التطبيقات, تستطيع تحميله من هنا نقوم بفتح برنامج الاندرويد ستديو والضغط على إنشاء مشروع جديد اضغط على مشروع فارغ Empty Activity ومن ثم الضغط على زر التالي Next نقوم بكتابة اسم المشروع, معرف المشروع, مسار حفظ المشروع, لغة المشروع على الجافا, واختيار اقل اصدار يعمل عليه هذا المشروع ومن ثم الضغط على زر Finish

ننتظر دقائق .. بعد ان يظهر مشروعنا بهذا الشكل .. اصبحنا جاهزين للبدأ بتطبيق مدونة البلوجر

شرح آلية التطبيق الذي سوف نبرمجه معاً :

جلب محتوى الخلاصات RSS من رابط موقعك أو مدونتك على شكل كود xml ومن خلال التاجات داخله يتم قراءة المعلومات منه وحفظها في مصفوفة مؤقتة فقط المعلومات التي نحن نريدها من خلال الاشارة لها بالتاجات الخاصة بها.
مثال شاهد هذا ملف الخلاصات : هذا السكرين شوت من الرابط الذي استخدامناه في هذا الشرح, وهو لمدونة تعلم اللغة التركية ~ في الصورة يظهر تدوينتين .. فقط سوف ناخذ المعلومات التي نحتاجها وهي عنوان التدوينة, وتاريخ نشرها , ورابط الوصول إليها لنقوم بفتحها داخل التطبيق بواسطة WebView
وبناءاً على ملف الخلاصات لديك تقوم بجلب المعلومات التي تحتاجها وتخزينها في التطبيق لاستخدامها كيف ما تريد

هذه المصفوفة المؤقتة كل عنصر فيها هو عبارة عن مقال او تدوينة, ثم نقوم بتخزينها في HashMap بشكل منظم كل تاج وله قيمته, لنستدعي هذه القيم بداخل تطبيقنا عن طريق التاجات ( الأوسمة ).

عند وقت الاستدعاء يتم فرز هذا الـ HashMap بشكل تدريجي بداخل Arraylist ليقوم بعرضها لنا بداخل القائمة التي تعرض للمستخدم بواسطة الـ Adapter كما الوضع الطبيعي في الدروس السابقة التي اخذناها عن عنصر الـ list في الاندرويد.

وبالتأكيد كل هذه العملية السابقة لا تأخذ منه بضع ثواني, حسب حجم وكمية المحتوى + سرعة الاتصال بالانترنت. اذا كانت الخلاصات لديك تعرض صور للمقالات, فهذا أمر رائع تستطيع استدعائها مع الاوسمة ليبدوا تطبيقك أكثر جمالاً وجاذبية



# التطبيق , عبارة عن واجهتين :
الاولى : القائمة التي تحتوي على المواضيع او المقالات او التدوينات.
الثانية : صفحة الويب التي تفتح لنا داخل التطبيق هذا الموضوع او المقال او التدوينة.

# رابط الخلاصات الذي لديك لمدونتك او موقعك , ولنفترض ان رابط الخلاصات RSS لدينا هو :

http://www.turkish-language.com/feeds/posts/default

استبدل الجزئية http://www.turkish-language.com/ برابط موقعك إذا كان بلوجر.

# لنقم الآن بإعطاء التطبيق صلاحية الوصول إلى الانترنت, نضع الكود التالي :
<uses-permission android:name="android.permission.INTERNET" />



في ملف AndroidManifest.xml أعلى وسم الـ application

# لنقم الآن بتفعيل معالجة طلبات HTTP بداخل تطبيقنا لأننا بحاجة للاستعلامات هذه لجلب المحتوى الذي نبحث عنه, نضع الكود التالي :
<uses-library android:name="org.apache.http.legacy" android:required="false" />



في ملف AndroidManifest.xml بداخل وسم الـ application

وكذلك الكود التالي :
useLibrary 'org.apache.http.legacy'



بداخل ملف build.gradle Module بداخل وسم android











نذهب الآن الى الواجهة الرئيسية للتطبيق والتي هي ملف activity_main.xml الذي تجده في المسار التالي :
app\src\main\res\layout

ملاحظة : المجلد layout هو المجلد الذي يتم وضع فيه واجهات التطبيق التي تظهر للمستخدم على صيغة ملفات من نوع xml

ونحذف جميع ما بداخله, ونقوم بجعل العنصر الرئيسي فيه من نوع LinearLayout ونقوم بإضافة داخله عنصر القائمة إي نوع ListView ليصبح الكود كالتالي :

الآن لنقوم بإنشاء ملف xml جديد لنقوم بداخله تنسيق وشكل كل عنصر بالقائمة, اي ان هذا التنسيق سوف يتكرر على عدد العناصر الموجودة لديك, نذهب لمجلد الـ Layout ونضغط عليه بالزر الأيمن ونختار ملف جديد new ثم نختار Layout Resource File, ونضع اسم الملف list_row

هذا الملف سوف نضع فيه 3 عناصر من نوع نص TextView حسب عدد العناصر لديك التي تريد استيرادها من موقعك او مدونتك.
النص الأول : رابط التدوينة أو المقالة .. وسوف نجعله عنصر مخفي غير ظاهر للمستخدم.
النص الثاني : اسم التدوينة او المقالة والذي سوف يظهر للمستخدم.
النص الثالث : سوف نستخدمه لعرض تاريخ نشر هذه المقالة.
وعلى نفس النمط .. تستطيع اضافة الصور او النصوص إلخ حسب موقعك.

توضيح للنص الأول : رابط التدوينة او المقالة, سوف نقوم بإنشاء متصفح داخل تطبيقك لتصفح هذه المقالة من خلال الوصول للرابط او العنوان الخاص بها وفتحها داخل التطبيق, وجعلناه عنصر مخفي تستطيع اظهاره للمستخدم ولكن لسنا بحاجة لذلك ما دام بعد الضغط على العنصر سوف يتم فتح هذا الرابط.
وقمتنا بتخزينه بهذه الطريقة بداخل الxml لسهولة الوصول إليه عند جلبه مع المعلومات الاخرى من موقعك.

نقوم بتجهيز ملف list_row.xml كما الكود التالي :

والآن لنقوم بإضافة ملف واجهة اضافي لعرض وفتح التدوينة بداخل التطبيق, ومن ثم ننتهي من قسم تنسيق الواجهات وننتقل إلى قسم البرمجة بلغة الجافا لبرمجة العلاقات داخل التطبيق واخراج النتيجة التي نحن جميعاً بنتظارها ..

نقوم بإضافة ملف جديد في مجلد Layout ونضع اسمه webpage وفقط نضيف بداخله عنصر واحد مستعرض ويب من نوع WebView, كما الكود التالي :

اهم نقطة إن معرفات العناصر تكون كما ذكرنا لاننا سوف نستخدمها للوصول اليها برمجياً والتحكم بها. وما اقصده من معرفات العناصر هي الـ id الخاص بكل عنصر android:id

ونتيجة ما قمنا بعمله اليوم هي :

هكذا نكون انتهينا من جانب تنسيق واجهات التطبيق, 




والآن لنبدأ ببرمجة كلاسات الجافا 

لدينا حالياً فقط الاكتفتي ( الكلاس ) للواجهة الرئيسية + وسوف نقوم بإنشاء اخر لفتح المقال داخل التطبيق.
كذلك نحن بحاجة لـ 2 عدد من الكلاسات الاضافية المطلوبة للمشروع, الاول يحتوي على الدوال المطلوب للبحث عن لفتح الاوسمة المطلوبة وجلب القيم التي نحتاجها من رابط خلاصات موقعك, والآخر كلاس ربط بين القيم في موقعك وتطبيقك.

لنقم الآن بإنشاء كلاس ربط داتا لنخزن فيه جميع المتغيرات القادمة من موقعك, واستخدامها في إي مكان آخر في التطبيق.  إنشاء كلاس جديد

ولنقم بتسمية هذا الكلاس : Item

نقوم بتعريف متغيرات جديدة بداخل هذا الكلاس وهي المتغيرات المطلوبة جلبها من موقعك, التي هي في مثالنا :
اسم المقال, رابط المقال, تاريخ النشر. نقوم بتعرفيها كلها من نوع سترنج نص.

اسفل منها نضع المؤشر ونضغط على Alt + Insert ونختار Constructor سوف تظهر لنا نافذة صغيرة نختار منها جميع المتغيرات التي اضفناها ونضغط ok

ليتم ادراج لنا دالة البناء التي لا يتم استدعاء هذا الكلاس إلا بشروطها .. وهي اعطائنا هذه المتغيرات لربطها مع المتغيرات الموجودة بالكلاس نفسه.

اسفل الدالة نكرر العملية نضغط على Alt + Insert ونختار منها Getter وكذلك نختار جميع المتغيرات, ليتم استدعاء الدوال التي من خلالها يمكننا استخدام هذه المتغيرات في كامل التطبيق بعد استدعاء هذا الكلاس.

ليصبح الكلاس كما الكود التالي :
 package com.andrody.bloggerproject;

 public class Item {

 String title;
 String link;
 String date;

 public Item(String title, String link, String date) {
 this.title = title;
 this.link = link;
 this.date = date;
 }

 public String getTitle() {
 return title;
 }

 public String getLink() {
 return link;
 }

 public String getDate() {
 return date;
 }
 }



يتغير هذا الكود من اسماء وعدد متغيرات حسب المطلوب جلبه من موقعك.

تستطيع بداخل الدوال ارجاع قيم اضافية كمثال كلمة ” تاريخ النشر ” مع التاريخ date

والآن نتجه لإنشاء كلاس آخر بإسم : Parser

هذا الكلاس يحتوي على الدوال التي سوف تستخدم رابط خلاصات موقعك واستخراج المطلوب منه, لذلك قم بنسخه كما هو ولصقه في مشروعك بداخل الكلاس Parser مع بعض التغيرات حسب اسماء التاج او الاوسمة التي بداخل رابط خلاصات موقعك, وسوف اضع سطور تعليقات بداخله لتتعرف على آلية عمله.
package com.andrody.bloggerproject;

 import java.io.IOException;
 import java.io.StringReader;
 import java.io.UnsupportedEncodingException;
 import java.util.ArrayList;
 import java.util.List;

 import javax.xml.parsers.DocumentBuilder;
 import javax.xml.parsers.DocumentBuilderFactory;
 import javax.xml.parsers.ParserConfigurationException;

 import org.apache.http.HttpEntity;
 import org.apache.http.HttpResponse;
 import org.apache.http.client.ClientProtocolException;
 import org.apache.http.client.methods.HttpGet;
 import org.apache.http.impl.client.DefaultHttpClient;
 import org.apache.http.util.EntityUtils;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 import org.w3c.dom.Node;
 import org.w3c.dom.NodeList;
 import org.xml.sax.InputSource;
 import org.xml.sax.SAXException;

 import android.util.Log;

 public class Parser {

 //الدالة التي سوف يتم ارسال رابط الموقع إليها
 public List<Item> getRSSFeedItems(String rss_url){
 List<Item> itemsList = new ArrayList<Item>();
 String rss_feed_xml;

 // استدعي الدالة التي تستخرج لنا اكواد xml من رابط موقعك
 rss_feed_xml = this.getXmlFromUrl(rss_url);

 // اذا نجح باستخراج اكواد الـ xml
 if(rss_feed_xml != null){
 try{
 Document doc = this.getDomElement(rss_feed_xml);
 NodeList nodeList = doc.getElementsByTagName("channel"); // توصلت الـ nodeList للتاج الذي اسمه channel
 Element e = (Element) nodeList.item(0);

 NodeList items = e.getElementsByTagName("item"); // توصلنا الان الى مصفوفة وهو جميع اوسمة item

 // حلقة تفحص لنا كل item إي كل مقال لنأخذ منها ما نريد
 for(int i = 0; i < items.getLength(); i++){
 Element e1 = (Element) items.item(i);

 // هذه التاجات التي اخذناها الموجودة في خلاصات موقعنا البلوجر
 String title = this.getValue(e1, "title");
 String link = this.getValue(e1, "link");
 String date = this.getValue(e1, "pubDate");
 // قمنا بعملية الربط بينها وبين الكلاس Item
 Item item = new Item(title, link, date);

 // بعد الربط خزنا نسخ الitem بداخل قائمة List
 itemsList.add(item);
 }
 }catch(Exception e){
 e.printStackTrace();
 }
 }

 // ارجع لنا القائمة التي خزنت بداخلها المقال مع معلوماته اسم وعنوان وتاريخ
 return itemsList;
 }

 /* الدوال الاخرى في الاسفل هي دوال مساعدة استخدمناها في الدالة الرئيسية التي في الاعلى .. ولسنا بحاجة للتعديل على هذه الدوال المساعدة*/

 public String getXmlFromUrl(String url) {
 String xml = null;

 try {
 // request method is GET
 DefaultHttpClient httpClient = new DefaultHttpClient();
 HttpGet httpGet = new HttpGet(url);

 HttpResponse httpResponse = httpClient.execute(httpGet);
 HttpEntity httpEntity = httpResponse.getEntity();
 xml = EntityUtils.toString(httpEntity);

 } catch (UnsupportedEncodingException e) {
 e.printStackTrace();
 } catch (ClientProtocolException e) {
 e.printStackTrace();
 } catch (IOException e) {
 e.printStackTrace();
 }
 // return XML
 return xml;
 }

 public Document getDomElement(String xml) {
 Document doc = null;
 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
 try {

 DocumentBuilder db = dbf.newDocumentBuilder();

 InputSource is = new InputSource();
 is.setCharacterStream(new StringReader(xml));
 doc = (Document) db.parse(is);

 } catch (ParserConfigurationException e) {
 Log.e("Error: ", e.getMessage());
 return null;
 } catch (SAXException e) {
 Log.e("Error: ", e.getMessage());
 return null;
 } catch (IOException e) {
 Log.e("Error: ", e.getMessage());
 return null;
 }

 return doc;
 }

 public final String getElementValue(Node elem) {
 Node child;
 if (elem != null) {
 if (elem.hasChildNodes()) {
 for (child = elem.getFirstChild(); child != null; child = child
 .getNextSibling()) {
 if (child.getNodeType() == Node.TEXT_NODE || ( child.getNodeType() == Node.CDATA_SECTION_NODE)) {
 return child.getNodeValue();
 }
 }
 }
 }
 return "";
 }

 public String getValue(Element item, String str) {
 NodeList n = item.getElementsByTagName(str);
 return this.getElementValue(n.item(0));
 }
 }



والآن لنقوم بإنشاء الاكتفتي الخاصة بعرض صفحات الويب WebView في تطبيقنا.

كما تعلمنا سابقاً نقوم بإنشاء كلاس جديد بإسم : WebViewPage
ولكي نجعله اكتفتي نضيف له امتداد (extends) من AppCompatActivity
ونضيف بداخله دالة الاون كريت onCreate الدالة التي يتم استدعائها بعد فتح هذا الاكتفتي.
وبداخل دالة الاون كريت نقوم بربط باللياوت التي اعددناها في الدرس السابق التي اسمها webpage
setContentView(R.layout.webpage);



ومن ثم نقوم بتجهيز هذه الاكتفتي لاستقبال قيمة نصية وهي ” رابط المقال ” عن طريق الـ
Intent Intent in = getIntent();
 String page_url = in.getStringExtra("page_url");
 



تم تخزين الآن قيمة رابط المقال بداخل متغير جديد اسمه page_url

ومن ثم نقوم بالربط مع كائن الويب فيو الموجود بداخل اللياوت لنقوم باستدعائه وجعله يقوم بفتح هذا الرابط.

ليصبح الآن الكود النهائي لاكتفتي عرض صفحات الويب WebViewPage كما الكود التالي :
package com.andrody.bloggerproject;

 import android.content.Intent;
 import android.os.Bundle;
 import android.webkit.WebView;
 import android.webkit.WebViewClient;

 import androidx.appcompat.app.AppCompatActivity;

 public class WebViewPage extends AppCompatActivity {

 WebView webview;
 @Override
 public void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.webpage);

 Intent in = getIntent();
 String page_url = in.getStringExtra("page_url");

 webview = findViewById(R.id.webViewid);
 webview.loadUrl(page_url);

 webview.setWebViewClient(new DisPlayWebPageActivityClient());
 }

 private static class DisPlayWebPageActivityClient extends WebViewClient {
 @Override
 public boolean shouldOverrideUrlLoading(WebView view, String url) {
 view.loadUrl(url);
 return true;
 }
 }


 }



وهكذا نكون قد انتهينا من تجهيز كل الكلاسات عدا الاكتفتي الرئيسي للتطبيق MainActivity




ما تبقى لنا فقط الواجهة الرئيسية البرمجة وهي الاكتفتي التي سوف يتم اطلاقها مع فتح التطبيق.

وفي مشروعنا تحمل اسم MainActivity.

في البداية نقوم بتعريف الكلاس الذي قمنا بإنشائه سابقاً بإسم Parser لكي نستطيع استخدام الدوال التي فيه بداخل هذه الاكتفتي الرئيسية, بالشكل التالي :
Parser parser = new Parser();



عرفناه بإسم parser إي عند استخدام هذا المتغير اي اننا نقصد فيه الكلاس السابق.

ثم نقوم بتعريف List تحمل داخلها بينانات فقط الانواع التي حددنها في الكلاس المنشأ سابقاً بإسم Item, بالشكل التالي :
List<Item> items = new ArrayList<>();



هذه اللست سوف تكون الوسيط بين استقبال البيانات من الـ RSS بالشكل الذي حددناه حسب المتغيرات التي حددناها.

ومن ثم تعريف ArrayList اخيرة التي تقوم بأخذ البيانات من اللست السابقة واستخدامها في مشروعنا وعرضها للمستخدمين بداخل عنصر ListView. وهذه اللست سوف تكون HashMap يحمل مفتاح وقيمة لاستخدام المتغيرات التي حددناها سابقاً واستدعاء قيمها بإستخدام اسمها المحدد, بالشكل التالي :
ArrayList<HashMap<String, String>> rssItemList = new ArrayList<>();



الآن بداخل دالة الاون كريت onCreate الدالة التي سوف يتم تشغيلها بعد فتح تطبيقك, نقوم بتجهيز ExecutorService + Handler

نقوم اولاً بتعريف متغير من نوع ExecutorService للقيام بمهمة في الخلفية مرة واحدة واستخدام نتائجها في التطبيق, وتلك المهمة هي التي سوف نحددها : قراءة رابط موقعك الخلاصات RSS وجلب التاجات التي نحتاجها منه وتخزينها لدينا في مصفوفة مؤقتة وهي التي تخزن نوع كلاس item التي قمنا بإنشائها سابقاً, بالشكل التالي :
ExecutorService executor = Executors.newSingleThreadExecutor();



والان نقوم بتعريف الـ Handler ليقوم بإستقبال كل بوست او موضوع او مقال من موقعك وإضافته مباشرة للقائمة لعرضه للمستخدمين, بالشكل التالي :
Handler handler = new Handler(Looper.getMainLooper());



حتى الآن الكود الذي وصلنا له هو :
package com.andrody.bloggerproject;

 import androidx.appcompat.app.AppCompatActivity;

 import android.os.Bundle;
 import android.os.Handler;
 import android.os.Looper;

 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;

 public class MainActivity extends AppCompatActivity {


 Parser parser = new Parser();

 List<Item> items = new ArrayList<>();
 ArrayList<HashMap<String, String>> rssItemList = new ArrayList<>();


 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_main);

 ExecutorService executor = Executors.newSingleThreadExecutor();
 Handler handler = new Handler(Looper.getMainLooper());

 }
 }



الآن نقوم بما عرفنا سابقاً, واختصاراً سوف اقوم بالتعليق في سطور تعليقات على الكود للتوضيح لتصبح النتيجة النهائية للاكتفتي الرئيسية MainActivity :
package com.andrody.bloggerproject;

 import androidx.appcompat.app.AppCompatActivity;

 import android.content.Intent;
 import android.os.Bundle;
 import android.os.Handler;
 import android.os.Looper;
 import android.view.View;
 import android.widget.AdapterView;
 import android.widget.ListAdapter;
 import android.widget.ListView;
 import android.widget.SimpleAdapter;
 import android.widget.TextView;

 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;

 public class MainActivity extends AppCompatActivity {

 Parser parser = new Parser();

 List<Item> items = new ArrayList<>();

 ArrayList<HashMap<String, String>> rssItemList = new ArrayList<>();


 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_main);

 ExecutorService executor = Executors.newSingleThreadExecutor();
 Handler handler = new Handler(Looper.getMainLooper());

 executor.execute(() -> {

 // رابط الخلاصات لموقعك
 String rss_url = "http://www.turkish-language.com/feeds/posts/default";

 // من خلال الاستعانة بكلاس ال Parser نقوم بإرسال الرابط اليه واستخراج البيانات التي نحتاجها وتخزينها في المصفوفة المؤقتة
 items = parser.getRSSFeedItems(rss_url);

 // نقوم بحلقة فور تدور كل مرة عند عنصر من عناصر القائمة المؤقتة اي عند كل موضوع او مقال
 for (Item item : items) {

 // انشاء قائمة مؤقتة لنرتب فيها البيانات واضافتها للقائمة الاساسية التي سوف تخزن كل المقالات فيها
 HashMap<String, String> map = new HashMap<>();

 // نعرف الاسماء التي نريد استدعاء فيها القيم وهي متغيرة حسب موقعك والتاجات الذي يحمله
 map.put("title", item.getTitle());
 map.put("link", item.getLink());
 map.put("pubDate", item.getDate());

 // اضافة هذا العنصر القائمة المؤقتة للقائمة الاساسية
 rssItemList.add(map);
 }

 // هنا يبدأ دول الهاندلر لتجهيز الادابتر وتجهيز المعلومات وعرضها بداخل عنصر اللست فيو الذي لديك
 handler.post(() -> {

 ListAdapter adapter = new SimpleAdapter( // قمنا بإنشاء ادابتر جديد
 getApplicationContext(), // قمنا بتعيين الكونتكست وهو الواجهة التي نحن فيها
 rssItemList, R.layout.list_row, // قمنا بالإشارة إلى القائمة الاساسية + لياوت الفيو لكل عنصر بالقائمة
 new String[]{"link", "title", "pubDate"}, // هذه البيانات بالترتيب كما قمنا بتخزينها بالاعلى
 new int[]{R.id.page_url, R.id.title, R.id.pub_date}); // ربط هذه البيانات بالترتيب بالعناصر بداخل الفيو اين سوف تعرض

 // تحديث عنصر اللست فيو وتفعيل الادابتر الجديد عليه
 ListView lv = findViewById(R.id.listview);
 lv.setAdapter(adapter);

 });
 });

 // تعريف من جديد اللست فيو لنقوم بإعطاء اوامر الضغط على كل عنصر
 ListView lv = findViewById(R.id.listview);

 //بعد الضغط على كل عنصر من القائمة
 lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {

 public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
 // انتنت جديد للانتقال إلى اكتفتي اسمها WebViewPage قمنا بإنشائها سابقاً
 Intent in = new Intent(getApplicationContext(), WebViewPage.class);
 // جلب رابط المقال وتخزينه في سترنج جديد اسمه page_url
 String page_url = ((TextView) view.findViewById(R.id.page_url)).getText().toString();
 // خذ رابط المقال معك واذهب الى الاكتفتي لعرض صفحة الويب هناك
 in.putExtra("page_url", page_url);
 // قم بالانتقال الان
 startActivity(in);

 }
 });
 }
 }



وهكذا نكون قد انتهينا من هذا المشروع البسيط ..