16يوليو

ج 2 – مدخل إلى عالم اﻷندرويد

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

صورة

src : – Sources –
هذا المجلد به الكود أو الشيفرة المصجرية للتطبيق الخاص بك والمكتوبة بلغة الجافا

Android 1.5 :

يحتوي على ملف .jar به مجموعة المكتبات التي سوف تقوم باستدعائها لتستخدمها في التطبيق كأن تقول مثلا

 import android.app.Activity;

وهذا سوف نتطرق إليه في وقت لاحق

gen :
يحوي هذا المجلد ملف R.java وهو الملف الذي يحفظ فيه امكان كل المصادر او موارد التطبيق من صور او ملفات للواجهات الرسومية وسوف يتضح ذلك معك في استدعائك لاي منها

res : – Resources –
مجلد يحتوي على عدد من المجلدات و تحوي هذة المجلدات مجموعة المصادر أو موارد التكبيق

drawable :
يحتوي على ملفات الصور

layout :
يحتوي على ملفات الواجهات الرسومية Layout

vlaues :
يحتوي على مختلف القيم التي تقوم بتعريفها و من ثم حفظها في شكل ملفات XML لتستدعيها مرة آخرى

ِAndroid Mainfest.XML :
هو الملف الذي يحوي كل مواصفات التطبيق و كذا عدد و أسماء الـ Activities وايضا التصاريح التي يحملها التطبيق اثناء تشغيله.

ملحوظة : Activity هو عبارة عن الجزء التفاعلي او الذي يحمل واجهه رسومية ويعرف في J2se بالـ JFrame وفي الـ J2me Midlet

default.properties :
هذا الملف ذاتي الإنشاء يتم إنشائه مع بداية المشروع حيث يحمل بيانات المحاكي و خصائصه لا تقوم بالتعديل فيهيدويا تحت اي ظرف.

نظرة سريعة على الكود الخاص بالمثال :

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

.. عندما تقوم بفتح الملف

Hello.java

في مشروعنا – الملف الاساسي في الكود – :

تفصيل الكود :

pakage yahia.andro

الحزمة التي يوضع بها ملفات الشفرة المصدرية

import android.app.Activity;
import android.os.Bundle;

يستدعي المكتبات التي سوف يستخدمها في التطبيق

public class Hello extends Activity {}

تعريف الكلاس الاساسية والتي تحمل صفات الـ Activity اي انها تحمل واجة سوف تظهر على شاشة الجهاز

وهي تعادل في الـ J2se

public class Hello extends JFrame {}

وفي الـ J2me

public class Hello extends MIDlet {}
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}

الدالة (Method) onCreate هي الدالة الاساسية في التطبيق الحالي وهي تشبه بصورة كبيرة

في الـ J2se

main(String [] args)

وفي الـ J2me

startApp()

يقوم التطبيق باستدعاء الدالة بصورتها المجردة – وذلك سوف نستفيض في الحديث عنه في وقت لاحق –

super.onCreate(savedInstanceState);

ومن ثم يقوم بوضع الواجهة الرسومية الخاصة بالتطبيق كالتالي

setContentView(R.layout.main);

الدالة setContentView() هي التي تقوم بوضع الواجهة الرسومية على الشاشة, بالنظر لما تأخدة هذة الدلة من متغيرات R.layout.main

نجد انه استدعى الكلاس R -التي ذكرنا مسبقا أنها تحمل كل مصادر و موارد التطبيق- ومن ثم layout -وهو المجلد الخاص بالواجهات الرسومية- وأخيراً main وهو الملف الحامل للواجهة الرسومية
ننتقل إلى الملف

main.xml

بالمجلد res >> layout

ملحوظة : أعيد الذكر بأنه ينصح ان تكون على دراية ولو بسيطة باساسيات الكتابة في لغة الـ XML وذلك لكي لا تفني الوقت في البحث عن الأخطاء و في النهاية تجد انك قد نسيت أن تكتب > أو ” وبالتالي الكود لن يعمل إطلاقا.

 <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
>
   <TextView
       android:layout_width="fill_parent"
       android:layout_height="wrap_content"
       android:text="@string/hello"
   />
</LinearLayout>

الملف به اوسمه مختلفة

هذا الوسم يحمل نوع الـ XML و الي الترميز الخاص بالملف

<?xml version="1.0" encoding="utf-8"?>

هذا الوسم يمثل طريقه عرض المكونات على الشاشة و طرق العرق مختلفة و متنوعة

<LinearLayout></LinearLayout>

اما عن الوسم الأهم قهو

<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello"
/>

ويمثل صندوق لعرض المعلومات أو البيانات .. مثل الـ TextField بالنظر إلى خصائصة

android:layout_width="fill_parent"
android:layout_height="wrap_content"

تمثلان ابعادة فالعرض يمثل العرض الكلي للشاشة و الارتفاع على قدر البيانات الموجودة و يزداد بزيادتها

 android:text="@string/hello"

المحتوى الكتابي للصندوق و هنا سوف ننتقل مرة أخرى لملف آخر فستجد انه قام باستدعاء متغير باسم hello موجود في الملف

strings.xml

في المسار التالي res >> values

Hello World, Hello!

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

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

رجوعاً إلى

main.xml

ستجد انه في نهاية الملف قام بإغلاق الوسم

ورجعوعاً إلى

Hello.java

نجد ان التطبيق قد انتهى

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

أنواع التطبيقات في أندرويد :

1- Foreground Activities
تطبيق عادي جداً مثل الآلة الحاسبة أو قارئ الخلاصات يكون مفيد وعامل فقط إذا كان على الشاشة الرئيسية أما اذا لم يكن على الشاشة فهو في حالة من التوقف – يعمل في الخلفية بدون فائدة – .

2- Background Services
هذا التطبيق عندما تقوم بفتحه وإعطائة بعض المتغيرات و من ثم يذهب إلى الخلفية ليظل يعمل إلى انا يحين وقته مثل برنامج المؤذن يظل يعمل في الخلفية ووقت الأذان ينطلق صوت المؤذن لعلن عن دخول وقت الصلاة عادة ما تعرف هذة التطبيقا بتطبيقات الخدمات.

3- Intermittent Activities
التطبيق المتقطع و من أفضل أمثلته مشغل الوسائط .

Dalvik.equals(Java) == false

Delvaik virtual Machine وهي نسبة إلى قريةDalvík in Eyjafjörður في أيس لاند قام بستميتها Bornstein وذلك بسبب انتماء يعض اقاربه إليها !!. DVM هو اسم الآله الوهمية في أندوريد وهي فقط تقوم بتطبيق الملفات الحاصه بها من امتداد .dex ولها القدرة على تطبيق و تشغيل مجموعة من الكلاسات الخاصة بالجافا. تم إعداد الـ DVM لتكون قابلة لاستخدام أكثر من نسخه منها في وقت واحد (multiple instances) و من الجديى بالذكر أن DVM تختلف عن الـ JVM المستخدمة في الجافا بصورة عامة.

نأتي لمثال اليوم وهو To Do List

و سوف نتعلم كيفية استخدام المكونات التي نقوم بتعريفها في ملف الـ XML داخل ملف الجافا
سوف ترى في هذا المثال بعض الكلمات الجديده :

Listview
ArrayList
ArrayAdapter

بسم الله نبدأ :

نقوم بعمل تطبيق جديد كما ذكرنا من قبل نتوجه إلى ملف الـ main.xml

نلاحظ هنا اننا قد اضفنا

 android:id="@+id/myEditText"

إلى

وبذلك نقوم بإعطائه اسم سوف يساعدنا في استخدامه في ملف الجافا و تعد هذة إحدى خصائص هذا الحقل
وأضفنا أيضا

وهي أحد المكونات التي تستخدم في عرض القوائم List وهي مثل الـ JList في الـ J2se

باقي التعريف لا يوجد به جديد

ننتقل إلى

Hello.java

نقوم بتعديل مجموعة المكتبات لتكون كالتالي

import android.app.Activity;
import android.os.Bundle;
import android.view.*;
import android.view.View.OnKeyListener;
import android.widget.*;
import java.util.ArrayList;

و من ثم نبدأ في التعديل على

onCreate(Bundle icicle)

لتصبح كالتالي

public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.main);
ListView myListView = (ListView)findViewById(R.id.myListView);
EditText myEditText = (EditText)findViewById(R.id.myEditText);
final ArrayList todoItems = new ArrayList();
final ArrayAdapteraa;
aa = new ArrayAdapter(this,android.R.layout.simple_list_item_1,todoItems);
myListView.setAdapter(aa);
 
myEditText.setOnKeyListener(new OnKeyListener() {
public boolean onKey(View v, int keyCode, KeyEvent event) {
if (event.getAction() == KeyEvent.ACTION_DOWN)
if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER)
{
todoItems.add(0, myEditText.getText().toString());
aa.notifyDataSetChanged();
myEditText.setText("");
return true;
}
return false;
}
});
}

نجد أننا قد اضفنا إليها تعريف كل من المكونات التي استخدمناها في ملف الـ

 main.xml

وبالنظر إلى الدالة

findViewById(R.id.myListView)

حيث تستخدم لإيجاد المكون عن طريق الـ ID الخاص به الذي قد منا بوضعه مسبقا

final ArrayList todoItems = new ArrayList();

نقوم بتعريف ArrayList من النوع String

&gt;final ArrayAdapter aa;

قمنا بتعريف ArrayAdater من النوع String

و أعطيناه قيمة كالتالي

aa = new ArrayAdapter(this,
android.R.layout.simple_list_item_1,
todoItems);

وظيفة الـ ArrayAdapter انها هي المسؤولة عن إدارة الـ ListView مع اختلاف انواع المتغيرات التي سوف تعمل عليها

وفي الجزء النهائي قمنا بوضع الحدث على زر الـ OK كما أسميه و كما سوف نرى

قم بتشغيل التطبيق سوف يظهر لك كالتالي

صورة

استخدم الزر الذي يقف عليه المؤشر في الصورة لإضافة ما كتبت – زر الـ OK –

بقي جزء أخير في الكود لم يتم شرحه هذا الجزء يؤخد كتمرين فعليك عزيزي القارئ ان تعرف ما يفعله بنفسك و تقوم بالرد و التفاعل معي :)

فعلاً هذة مقدمة لكتاب أدعوا الله ان يكتمل ولكن لا مانع من التفاعل .. فالتفاعل يزيد الأمر متعه .. أليس كذلك ؟!!

يتبع

————————————————————

أعتذر عن تأخر التدوينة نظراً لظروفي الصحية ..

أبحث عن إضافة لعرض الكود بطريقة أفضل
أشكرك عزيزي المعاصر

شارك التدوينة !

عن Mr.Xprt

8 تعليقات

  1. رائع جدا بالفعل استمتعت بالقراءه و التطبيق

    و بالفعل قد قرأت كل ما يدور بثنايا مدونتك

    و ليس لي الا أن اقول انك انسان عظيم

    —————————

    لي تعليق بسيط على الكود الموجود في ملف

    Hello.java

    يجب تعريف هذا السطر

    final EditText myEditText = (EditText)findViewById(R.id.myEditText);

    بدلا من

    EditText myEditText = (EditText)findViewById(R.id.myEditText);

    و لك جزيل الشكر

    • فعلاً تعليقك مظبوط أخي العزيز ..

      أشكرك على حسن المتابعة و ترقب الجديد بإذن الله

  2. أخي مشكور على موضوعك ومنه أستدل أن لك خبره في نظام الأندرويد
    أنا أملك جهاز t-mobile g1 ولا أعرف كيفية تنزيل البرامج للجهاز عن طريق الكومبيوتر أو كرت الذاكره واريد منك أن تشرح لي هذا فمن المعروف أن النت عن طريق الجهاز الخلوي في وطننا العربي مكلف فأريد أن أسحب البرامج من علع الكومبيوتر وأضيفها للجهاز
    ولك جزيل الشكر

    • يمكن ذلك عن طريق توصيل التلفون بالكمبيوتر ومن التلفون تسحب القائمه العلويه ومن ثم الضغط على اس دي كارد واختيار امونت راح يتعرف الكمبيوتر على جوالك ويفتحلك ملف الاس دي كارد حط فيه البرامج والصور والاغاني وزي ماقالك الاخ الفاضل عن طريق برنامج متصفح ملفات الجهاز تستطيع الوصول لملف اس دي كارد من جوالك واعتذر على ضعف الشرح

  3. عزيزي محمد أظن أنك معك حق .. ولكن اعذرني لا أملك الوقت الكافي للتجربه في الوقت الحالي

    أخي كيارا
    انا لم امسح بهذا الجهاز ولكن تعاملت عن طريق المحاكي ولكن يمكنك ان تقوم بتنزيل برنامج File Explorer من هنا http://www.androidfreeware.org/download/file-system-explorer
    ومن ثم تقوم بعد ذلك بتنزيل البرامج الخاصه بالجهاز على الكمبوتر الخاص بك و نقلها إلى الذاكرة و تصفح الذاكرة عن طريق هذا التطبيق .. إن شاء الله هيكون دا حل مناسب و في انتظار ردك

  4. إبداع بكل معنى الكلمة

    أخي أنا أعمل على netbeanse وفي المشروع الأول كل شي تمام , ولكن مشروع To Do List تحصل لي فيه مشكلة حيث يضع الـ netbeanse في الكلاس MainActivity خط تحت id في السطرين التاليين :
    ListView myListView = (ListView)findViewById(R.id.myListView);
    EditText myEditText = (EditText)findViewById(R.id.myEditText);

    , ويبدو أنني أحتاج منك كود كلاس R , حتى تُحل المشكلة .

    • أخي الحبييب

      لم استخدم الـ NetBeans في التطوير للأندرويد مسبقاً

      فالتطبيق المستخدم والرسمي هو الـ Eclipse لتكون العملية اسهل

      كما ان الكلاس R ذاتية التوليد , انصحك باستخدام الـ Eclipse

أضف رد على kira إلغاء الرد

لن يتم نشر البريد الإلكتروني . الحقول المطلوبة مشار لها بـ *

*

© Copyright 2014, All Rights Reserved