تعلم برمجة تطبيق اندرويد لمدونتك البلوجر (3)

بسم الله الرحمن الرحيم

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

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

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

كما ذكرنا هذه معاينة بالفيديو لترى ما النتيجة التي سوف تتوصل إليها بعد انتهائك من تطبيق هذه الدروس :


ما قمنا به في الدرس الثاني هو تنسيق وتجهيز صفحات الـ XML الواجهات التي تظهر للمستخدم, والآن في هذا الدرس سوف نقوم ببرمجتها.

والآن لنبدأ بالدرس الثالث على بركة الله ..

لدينا حالياً فقط الاكتفتي ( الكلاس ) للواجهة الرئيسية + وسوف نقوم بإنشاء اخر لفتح المقال داخل التطبيق.
كذلك نحن بحاجة لـ 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

سوف يكون بالدرس القادم الأخير لهذه الدروس .. ونكون قد انتهينا من برمجة هذا التطبيق.

اتمنى لكم التوفيق اصدقائي .. لا تنسوا الاشتراك في القائمة البريدية أسفل الموقع ليصلكم كل جديد يقوم بنشره اندرودي عربي.

 

About عبدالقادر عليوي

مواليد 1996 , سوري الجنسية, طالب علم, لدي شغوف كبير في تعلم كل ما يتعلق بالانترنت من تطوير وحماية, أحب القراءة كثيراً .. هدفي نشر العلم بشتى أنواعه ومجالاته, متابع من الدرجة الأولى لـ الدكتور ابراهيم الفقي و الشيخ أحمد ديدات - رحمهم الله -.

Check Also

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

هل أنت محتار من أين تريد البدأ في مجال برمجة التطبيقات للهواتف الذكية أو الألعاب عالية الاداء ؟ تعرف في هذا المقال عن اللغات والتقنيات واختر منها ما يناسبك لدخول هذا المجال

عرض صورة في التطبيق من فايربيس

بسم الله الرحمن الرحيم اليوم سيكون شرحنا عن كيفية عرض صورة  في التطبيق من قاعدة …

برمجة custom Toast بطرق مختلفة

بسم الله الرحمن الرحيم الكثير منا عندما يبرمج تطبيق للاندرويد يحتاج الى وضع Toast في …

ضع بصمتك بتعليق يعبر عن امتنانك

هذا الموقع يستخدم Akismet للحدّ من التعليقات المزعجة والغير مرغوبة. تعرّف على كيفية معالجة بيانات تعليقك.