الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

البداية مع الاندرويد

بدأه الاخير زمانه في 13 يونيو 2012 · 10 رد · 8,619 مشاهدة · في Android
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ورحمة الله،

ابدء معكم على بركة الله بسلسلة دروس لتعلم الاندرويد

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

لن أذهب بعيدا في الامال بخصوص هذه الدروس فالوقت ضيق، لكن ان شاء الله احاول قدر المستطاع ان اضيف دروس كلما سنح لي الوقت.

الدروس – غالبا – و الله اعلم - ستكون مقسمة الى مجموعة اجزاء، فبعد المقدمة التي تشرح اساسيات برنامج الاندرويد، سيكون الجزء الاول خاص بالـ GUI .

لن اتكلم عن كيفية تنصيب متطلبات العمل - تستطيع ان تجدها بسهولة على النت – او من كتاب الاخ الاستاذ محمد بدوي في هذا الرابط

كتاب اندرويد ببساطة

لنبدأ على بركة الله

لإنشاء مشروع جديد – من برنامج ال Eclipse

كون مشروع جديد كما في الصورة

post-47438-075368200 1339555891_thumb.pn

(صورة رقم 1)

ثم

post-47438-084782900 1339555898_thumb.pn

(صورة رقم 2)

ثم اكتب اسم المشروع

post-47438-045600300 1339555915_thumb.pn

(صورة رقم 3)

وضغط على Next ثم Next لتحصل على هذه النافذة

post-47438-006059700 1339555920_thumb.pn

(صورة رقم 4)

سنقوم فقط بتغيير أسم الـ package – مثلا سنكتب

net.arabteam2000.Android1

post-47438-041447300 1339555925_thumb.pn

(صورة رقم 5)

ثم نضغط على Finish

يمكنك الان ان ترى مشروعك و جميع الملفات الخاصة به من خلال الـ Package Explorer . سنتكلم عن كل ملف او مجلد وقت الحاجة له.

الان لدي اهم ملفين هما – كما في الصورة

post-47438-032692900 1339555930_thumb.pn

(صورة رقم 6)

الملف الاول – و يحوي على كود الجافا الخاص بالبرنامج ، اما الملف الثاني (ملف الـ xml) فهو يحوي على الكود الخاص بتصميم الواجهة الخاصة بالبرنامج.

قم بالضغط double-click على ملف الجافا ليفتح الكود الخاص بالبرنامج. الان وقبل ان نتكلم بصورة اكثر عن الكود و هذه الملفات – قم بتنفيذ البرنامج (من المفترض اولا انك قد قمت بأعداد المحاكي.)

عند التنفيذ – ستظهر لك هذه النافذة

post-47438-062054400 1339555934_thumb.pn

(صورة رقم 7)

اختر منها خيار الـ Android Application

و هذه واجهة التنفيذ

post-47438-066923100 1339555940_thumb.pn

(صورة رقم 8)

البرنامج سيقوم بعرض نص ترحيبي – كما في الصورة التي بالأعلى.

الان أترك المحاكي يعمل وقم بالرجوع الى الـ Eclipse لنتكلم قليلا عن البرنامج.

لنتكلم اولا عن ملف الـ xml والذي كما ذكرت هو الخاص بتصميم الواجهة. قم بالنقر عليه ليفتح كما في الصورة

post-47438-013355600 1339555946_thumb.pn

(صورة رقم 9)

من خلال هذه النافذة يمكنك تصميم الواجهة الخاصة ببرنامجك. كما توضح الصورة التي في الاعلى، يمكنك اضافة الـ views الى برنامجك عن طريق خاصية الـ drag-and-drop .

ملاحظة: في الاندرويد الـ views تساوي الـ controls (اذا كنت مبرمج دوت نت)

يعني مثلا لو أردنا ان نضيف زر، يمكننا بكل سهولة بسحب Button من جهة اليسار و أضافته الى واجهة برنامجنا. و اذا ضغطنا على الزر المضاف بـ right-click يمكننا من تعديل الخصائص الخاصة بالزر

post-47438-082364400 1339555951_thumb.pn

(صورة رقم 10)

او يمكننا تعديل الخصائص من نافذة properties في الجهة اليمنى.

طريقة ثانية للتحكم بالـ views في برنامجي – اذا لاحظت في الصورة رقم 9 – هناك في الاسفل خيارين:

- Graphical Layout

- Main.xml

نحن في الاساس في الـ Graphical Layout وهو الذي يمكنك من اضافة و التحكم في الـ views عن طريق الواجهات.

يمكنك الانتقال الى الـ main.xml حيث يمكنك استخدام الـ xml للأضافة او التحكم بالـ views.

الان انتقل الى main.xml عن طريق النقر عليه لتحصل على النافذة التالية

post-47438-016304200 1339555959_thumb.pn

- -صورة رقم 11 -

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

لو تلاحظ في الصورة التي بالأعلى هناك خط اصفر تحت هذا السطر

android:text=”Button”

ما معنى هذا؟

هيكلية برنامج الاندرويد تختلف عن غيرها (اقلها عن برامج الدوت نت – التي انا قادم منها!!)

الاندرويد يقوم بتعريف ملف من نوع xml اسمه strings و من الافضل ان تقوم بتعريف جميع المتغيرات من نوع string داخل هذا الملف. وعندما تريد ان تستخدمها من خلال برنامجك عليك ان تشير اليها. أين يمكن أن تجد هذا الملف؟

حسنا هذا الملف موجود في المجلد values تحت الـ res

كما في الصورة

post-47438-091173500 1339555963_thumb.pn

- صورة رقم 12 -

وايضا كما تلاحظ لو قمت بفتح هذا الملف انه يمكن التعامل معه اما عن طريق الماوس والواجهات، او عن طريق ملف الـ xml

الان لو نرجع الى المشكلة و التي كانت في هذا السطر

android:text=”Button”

هذا السطر الغرض منه انه يقوم بأضافة نص الى الزر. قمنا بوضع النص بصورة مباشرة بين علامتي اقتباس، وكما ذكرنا انه من الافضل ان نقوم بتعريف جميع المتغيرات من نوع string في ملف الـ strings.xml

الان لو اردنا ان نضيف متغير داخل هذا الملف، كل ماعلينا هو اضافة هذا السطر (اذا استخدمنا طريقة الـ xml)

     <string name="btn1">Hello</string>

بكل بساطة انت الان عرفت متغير اسمه btn1 يحوي على القيمة Hello

وهذه صورة ملف الـ strings.xml بعد الاضافة

post-47438-085497400 1339555969_thumb.pn

(صورة رقم 13)

الان لو اردنا ان نستخدم هذا المتغير من داخل البرنامج، بالعودة الى ملف الـ main.xml ، وتحديدا الى السطر الذي كان به مشكلة

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

android:text=”Button”

الى

android:text="@string/btn1”

الان لو تنتقل الى الـ Graphical Layout الخاصة بـ main.xml ستلاحظ تغيير النص الظاهر على الزر.

اتمنى ان الصورة الان واضحة.

تلخيص: نقوم بتعريف المتغيرات من نوع string في ملف strings.xml ثم نقوم بالوصول واستخدام هذه المتغيرات من داخل برنامجنا حسب الحاجة.

ربما مستقبلا سنتكلم ان شاء الله بتفاصيل اكثر عن هذا الملف وما الفائدة من ورائه.

الان بقي شيء أخير نتكلم عنه في هذا الدرس، وهو الملف الخاص بكود الجافا (في مثالنا هنا اسمه Android1Activity.java)

قم بالنقر عليه ليفتح كما في الصورة التالية

post-47438-045051900 1339555975_thumb.pn

(صورة رقم 14)

لن اتكلم كثيرا عن هذا الكود الان على وعد ان افصل به ان شاء الله مستقبلا. ما اود ان اشير له الان هو المصطلح Activity

مرة اخرى، اذا كنت قادم من الدوت نت

الـ Activity هي تساوي الـ Form في بيئة الدوت نت.

سنتكلم بصورة مفصلة في الدرس القادم عن الـ onCreate و أخواتها بأذن الله.

فكر معي :resentful:

منذ بداية تعلمي للبرمجة عرفت ان لكل برنامج له main تعتبر هي الـ entry point التي يبدأ البرنامج منها التنفيذ. لذا كنت اسأل نفسي : يا ترى أين الـ main في برنامج الاندرويد؟

يتبع... اذا كان في العمر و الوقت متسع.

و السلام عليكم و رحمة الله

المرفقات
1.png2.png3.png4.png5.png6.png7.png8.png9.png10.png11.png12.png13.png14.png
4

/index.php/topic/264448-%D8%A7%D9%84%D8%A8%D8%AF%D8%A7%D9%8A%D8%A9-%D9%85%D8%B9-%D8%A7%D9%84%D8%A7%D9%86%D8%AF%D8%B1%D9%88%D9%8A%D8%AF/

 

اني وان كنت الاخير زمانه ---- لأتِ بما لم تستطعه الاوائلُ

#2

السلام عليكم

نكمل ان شاء الله مع مجموعة ملاحظات سريعة،

اذا كنتَ جديد على الاندرويد، فأريدك أن تضع في بالك النقطتين التاليتين (سبق ان ذكرتُهما في الدرس الاول)

-	Activity is equivalent to a Form in traditional desktop development.
- In Android, visual components are called Views, which are similar to controls in traditional desktop development.

رغم اني اكره الكلام النظري- الا اني اجد نفسي مضطرا للحديث قليلا عن الـ activities.

في الدرس السابق كان لدينا الكود التالي

public class Android1Activity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }
}

هذا الكود هو المسئول عن عرض الـ activity للمستخدم.

فما هي الدالة onCreate وما فائدة setContentView ؟؟

كما تلاحظ اولا، ان الـ class الخاص ببرنامجنا مشتق من Activity class

. هذا الـ class الاساسي يمثل نافذة خالية من أي عناصر (empty screen) ، لذا فنحن نحتاج الى اضافة بعض الـ views الى هذه النافذة.

الان، لكي اقوم بتخصيص واجهة معينة وعرضها على الـ activity يجب ان استدعي الدالة setContentView ونمرر لها ال view المراد عرضه. في الكود الذي في الاعلى، الدالة كانت كالاتي

  setContentView(R.layout.main);

هنا ال main هو اسم ملف الـ xml الذي تعاملنا معه في الدرس السابق و قلنا انه من خلاله يمكنني التحكم و تصميم واجهة برنامجي.

أسف اذا الكلام غير واضح الان، لكن مستقبلا عندما نقوم بتصميم و أضافة activity جديدة للبرنامج ثم عرضها، سيتضح الامر بصورة أكبر.

فقط الان حاول ان تضع هذا السطر في بالك

The resources for an Android project are stored in the resfolder of your project hierarchy, which includes layout, values, and a series of drawable subfolders.[1]

للوصول الى هذه المصادر من خلال الكود، يمكنك ذلك عن طريق المتغير R .

الان، ماهي الدالة onCreate؟

الـ activity بصورة عامة تمر بمجموعة من الحالات (states) واليك ملخص لهذه الحالات

-	Active --> visible, focused, foreground Activity that is receiving user input.
-	Paused --> visible but will not have focuse
-     Stopped --> Not visible (remain in memory)
-	Inactive --> after killed

الاندرويد يوفر مجموعة من الاحداث events و الدوال methods والتي تمكننا من متابعة هذه الحالات الخاصة بالـ activity. من هذه الدوال دالة الـ onCreate وهناك عدد من الدوال غيرها.

المخطط التالي يوفر الكثير من الكلام.

post-47438-022991400 1339645935_thumb.pn

الوقت المستغرق بين onCreate و onDestroy يعرف بـ Full Lifetime

بينما الوقت المستغرق بين onStart و onStop يعرف بـ Visible Lifetime

الوقت المستغرق بين onResume و onPause يعرف بـ Active Lifetime

---

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

لمعلومات اكثر عن الموضوع

[1] Professional Android 4 Application Development
المرفقات
1.png
3

/index.php/topic/264448-%D8%A7%D9%84%D8%A8%D8%AF%D8%A7%D9%8A%D8%A9-%D9%85%D8%B9-%D8%A7%D9%84%D8%A7%D9%86%D8%AF%D8%B1%D9%88%D9%8A%D8%AF/

 

اني وان كنت الاخير زمانه ---- لأتِ بما لم تستطعه الاوائلُ

#3

السلام عليكم

نكمل ان شاء الله،

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

البرنامج سيتكون من two EditText وعندما يقوم المستخدم بالكتابة في الـ editText1 ستظهر الكتابة (أول بأول) في الـ editText2.

اي سنتعلم كيفية التعامل مع editText برمجيا (وهناك بعض الاساسيات التي ستنطبق عى جميع الـ views عندما التعامل معها من خلال برنامج الاندرويد)

سنقوم بتكوين برنامج جديد.

اولا سنحتاج الى تصميم الواجهة المطلوبة – وهي بسيطة جدا في حالتنا الان –

بعد تكوين برنامج جديد – افتح ملف الـ main.xml وهو الخاص بتصميم الواجهة – سيكون كما في الصورة

post-47438-008291700 1339823323_thumb.pn

- صورة رقم 1 –

قم بحذف الـ textview

بعدها قم بأضافة الـ editText

post-47438-021858900 1339823341_thumb.pn

- صورة رقم 2 –

الان لو تنتقل الى نسخة الـ xml ستراه كالأتي تقريبا

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

    <EditText
        android:id="@+id/editText1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:ems="10" >

        <requestFocus />

    </EditText>

    <EditText
        android:id="@+id/editText2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:ems="10" />

</LinearLayout>

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

لن نتكلم كثيرا عن كل الخصائص، ما يهمنا في هذا الدرس هي خاصية الـ id. وأظنه واضح!

للتعامل مع الـ widget من خلال الكود عن طريق برنامجك – بكل تأكيد ستحتاج الى الـ id الخاص به – و عليه، يجب ان تعرف الـ id لكي تستطيع ان تذكره من خلال الكود.

في برنامجنا بالاعلى – الـ Ids الخاصة بنا هي

editText1
editText2

قم بخزن التغيرات التي اجريتها على ملف الـ xml.

الان افتح ملف الـ java – لكي نقوم بأضافة الكود اللازم

الملف سيكون تقريبا كلاتي

package net.arabteam2000.android2;

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

public class Android2 extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

    }
}

اول شيء سنحتاج له هو الوصول الى الـ widgets التي اضفناها على واجهة برنامجنا – لكي نفعل ذلك سنحتاج الى الكود التالي داخل الـ onCreate

edit1 = (EditText) findViewById(R.id.editText1);
edit2 = (EditText) findViewById(R.id.editText2);

هذا الكود – ربما ستجده في كل برامج الاندرويد تقريبا – لا اقصد نفس الكود بالضبط – لكن نفس الفكرة – وهو استخدام الدالة findViewById و التي من خلالها استطيع التعامل مع عناصر الواجهة – وبما ان هذه الدالة تتعامل مع جميع الـ views (widgets) - لذا نحن مضطرين لعمل casting للتحويل الى النوع المطلوب – مثلا في حالتنا الان نحتاج ان نتعامل مع editText.

(طبعا خارج دالة الـ onCreate عليك ان تعرف المتغيرات ، هكذا:)

EditText edit1;
EditText edit2;

لاحظ اننا وصلنا الى الـ IDs عن طريق المتغير R. ربما الان تسأل ما هو هذا المتغير بالضبط؟!

يمكنك ملاحظته عن طريق الـ package explorer كما في الصورة

post-47438-077270800 1339823481_thumb.pn

- صورة رقم 3 -

ربما سنتكلم اكثر ان شاء الله عن المجلد gen في درس قادم.

عند كتابتك الكود الذي في الاعلى، ستحصل على خطأ، كما في الصورة

post-47438-005341500 1339823496_thumb.pn

- صورة رقم 4 –

السبب بسيط – فقط ستحتاج الى عمل import للـ widgets. يمكنك الضغط فقط على Ctrl + Shift + O – لكي يتم معالجة المشكلة!

الخطوة التالية – ستحتاج الى ان نضيف حدث (event) لكي نقوم بعمل المطلوب من البرنامج – وهو كما ذكرنا – عندما نكتب شيء في الـ editText1 سيظهر مباشرة في الـ editText2 - لذا سنحتاج ان نضيف الـ event الى الـ editText1

لكي نقوم بعمل ذلك نحتاج الى اضافة السطر التالي اولا – داخل دالة الـ onCreate

      edit1.addTextChangedListener(editTextWatcher);

عن طريق هذا السطر – قمنا بتسجل دالة مسؤولة عن معالجة الـ event من نوع TextChanged - اسم الدلة هو editTextWatcher – والان علينا ان نضيف التعريف الكامل لهذه الدالة – لنا سنقوم بأضافة الكود التالي بعد دالة الـ onCreate مباشرة

    private TextWatcher editTextWatcher = new TextWatcher() 
    {

       @Override
       public void onTextChanged(CharSequence s, int start, 
          int before, int count) 
       { 
             edit2.setText(s.toString());          

       }

       @Override
       public void afterTextChanged(Editable s) 
       {
       } // end method afterTextChanged

       @Override
       public void beforeTextChanged(CharSequence s, int start, int count,
          int after) 
       {
       } // end method beforeTextChanged

    };

الحدث الاساسي الذي نريد ان نعالجه هو onTextChanged لذا كتبنا بداخله الكود الذي سيؤدي وظيفة البرنامج.

المتغير s يحمل القيمة الموجودة حاليا في الـ editText1 والتي نقوم ببساطة بأعادة اظهارها في الـ editText2.

الكود النهائي للبرنامج سيكون كالاتي

package net.arabteam2000.android2;

import android.app.Activity;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.widget.EditText;

public class Android2 extends Activity {

	EditText edit1;
	EditText edit2;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);        

        edit1 = (EditText) findViewById(R.id.editText1);
        edit2 = (EditText) findViewById(R.id.editText2);    

        edit1.addTextChangedListener(editTextWatcher);

    }    

    private TextWatcher editTextWatcher = new TextWatcher() 
    {

       @Override
       public void onTextChanged(CharSequence s, int start, 
          int before, int count) 
       { 
             edit2.setText(s.toString());          

       }

       @Override
       public void afterTextChanged(Editable s) 
       {
       } // end method afterTextChanged

       @Override
       public void beforeTextChanged(CharSequence s, int start, int count,
          int after) 
       {
       } // end method beforeTextChanged

    };  
}

ربما عملية معالجة الـ event لازالت غير واضحة لديك.

بصراحة – انا ما أريده الان ان تتضح لديك الصورة العامة فقط – ثم بعد ذلك يمكننا ان نتحدث على كل موضوع على حدى – فلدينا اكثر من طريقة – عى سبيل المثال – لمعالجة الاحداث (events) في الاندرويد – وبكل تأكيد سيكون لنا وقفة معها.

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

البرنامج سيكون كالاتي

لدينا two editText لادخال رقمين

ولدينا زر button وضيفته جمع الرقمين.

ثم لدينا editText ثالث لعرض النتيجة.

البرنامج جدا بسيط – فقط ما اريده توضيح عملية الحصول على الـ Ids عن طريق دالة الـ findViewById ثم كيفية أضافة الحدث event

اولا قم بتصميم البرنامج – كما فعلنا سابقا ليكون الشكل النهائي كلاتي

post-47438-072478800 1339823551_thumb.pn

- صورة رقم 5 –

والكود كاملا سيكون كالتالي:

package com.arabteam2000.android3;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

public class Android3 extends Activity {
    private EditText edit1;
	private EditText edit2;
	private EditText edit3;
	private Button btn;

	/** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        edit1 = (EditText) findViewById(R.id.editText1);
        edit2 = (EditText) findViewById(R.id.editText2);  
        edit3 = (EditText) findViewById(R.id.editText3);
        btn = (Button)  findViewById(R.id.button1);

        btn.setOnClickListener(new View.OnClickListener() {

			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				int no1 = Integer.parseInt(edit1.getText().toString());
				int no2 = Integer.parseInt(edit2.getText().toString());
				int no3 = no1 + no2;

				edit3.setText(String.valueOf(no3));


			}
		});        

    }
}

لاحظ هنا عالجنا الحدث (event) مباشرة داخل دالة onCreate

كما ذكرت – سنفصل في هذا لاحقا ان شاء الله.

يتبع... اذا كان في العمر و الوقت متسع.

و السلام عليكم و رحمة الله

المرفقات
1.png2.png3.png4.png5.png
2

/index.php/topic/264448-%D8%A7%D9%84%D8%A8%D8%AF%D8%A7%D9%8A%D8%A9-%D9%85%D8%B9-%D8%A7%D9%84%D8%A7%D9%86%D8%AF%D8%B1%D9%88%D9%8A%D8%AF/

 

اني وان كنت الاخير زمانه ---- لأتِ بما لم تستطعه الاوائلُ

#4

السلام عليكم و رحمة الله

في درسنا اليوم سنتكلم عن كيفية معالجة الاحداث (events) في الاندرويد.

تحديدا سنتكلم عن الحدث onClick الخاص بـ button. هذا الحدث يتم معالجته عن طريق تعريف class يطبق الـ OnClickListener interface ثم يتم ربط هذا الـ class مع الزر المطلوب عن طريق الدالة setOnClickListener. هناك اكثر من طريقة لتعريف الـ class وربطه مع الـ button.

فيما يلي هذه الطرق

(( اولا ستحتاج الى تكوين مشروع جديد، وليكن التصميم كما في الصورة التالية ))

post-47438-071755900 1339900328_thumb.pn

- صورة رقم 1 -

الكود ان شاء الله واضح، انا اردت ان اضعها هنا للتوثيق.

Method 1: The Member Class (using nested class)

public class Android4_events extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        findViewById(R.id.button1).setOnClickListener(new HandleClick());
        findViewById(R.id.button2).setOnClickListener(new HandleClick());
        findViewById(R.id.button3).setOnClickListener(new HandleClick());
    }

    private class HandleClick implements OnClickListener{
    	public void onClick(View arg0){
    		Button btn = (Button) arg0;
    		TextView tv = (TextView) findViewById(R.id.textView1);
    		tv.setText("You pressed " + btn.getText());

    	}
    }
}

Method 2: The Interface type


public class Android4_events extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        findViewById(R.id.button1).setOnClickListener(handleClick);
        findViewById(R.id.button2).setOnClickListener(handleClick);
        findViewById(R.id.button3).setOnClickListener(handleClick);
    }

    private OnClickListener handleClick = new OnClickListener(){
    	public void onClick(View arg0){
    		Button btn = (Button) arg0;
    		TextView tv = (TextView) findViewById(R.id.textView1);
    		tv.setText("You pressed " + btn.getText());

    	}
    };
}

Method 3: The anonymous inner class

public class Android4_events extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        findViewById(R.id.button1).setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				Button btn = (Button) v;
	    		TextView tv = (TextView) findViewById(R.id.textView1);
	    		tv.setText("You pressed " + btn.getText());				
			}
		});

        findViewById(R.id.button2).setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				Button btn = (Button) v;
	    		TextView tv = (TextView) findViewById(R.id.textView1);
	    		tv.setText("You pressed " + btn.getText());				
			}
		});

        findViewById(R.id.button3).setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				Button btn = (Button) v;
	    		TextView tv = (TextView) findViewById(R.id.textView1);
	    		tv.setText("You pressed " + btn.getText());				
			}
		});
    }
}

Method 4: Implementation in Activity

public class Android4_events extends Activity implements OnClickListener{
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        findViewById(R.id.button1).setOnClickListener(this);
        findViewById(R.id.button2).setOnClickListener(this);
        findViewById(R.id.button3).setOnClickListener(this);
    }

    public void onClick(View arg0){
    	Button btn = (Button) arg0;
    	TextView tv = (TextView) findViewById(R.id.textView1);
    	tv.setText("You pressed " + btn.getText());  	
    }
}

Method 5: Attribute in View layout for OnClick events

public class Android4_events extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);      
    }

    public void HandleClick(View arg0){
    	Button btn = (Button) arg0;
    	TextView tv = (TextView) findViewById(R.id.textView1);
    	tv.setText("You pressed " + btn.getText());  	
    }
}

هذه الطريقة مختلفة قليلا، هنا سنحتاج الى التعديل في ملف الـ xml

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

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="TextView" />

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Button1" 
        android:onClick = "HandleClick"
        />


    <Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Button2" 
        android:onClick = "HandleClick"
        />

    <Button
        android:id="@+id/button3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Button3" 
        android:onClick = "HandleClick"
        />

</LinearLayout>

كما تلاحظ في الكود، قمنا بمعالجة هذه الخاصية onClick

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

المصدر: Android Cookbook

يتبع... اذا كان في العمر و الوقت متسع.

و السلام عليكم و رحمة الله

المرفقات
1.png

تم تعديل هذه المشاركة بواسطة الاخير زمانه في 17 يونيو 2012 في 05:40

1

/index.php/topic/264448-%D8%A7%D9%84%D8%A8%D8%AF%D8%A7%D9%8A%D8%A9-%D9%85%D8%B9-%D8%A7%D9%84%D8%A7%D9%86%D8%AF%D8%B1%D9%88%D9%8A%D8%AF/

 

اني وان كنت الاخير زمانه ---- لأتِ بما لم تستطعه الاوائلُ

#5

بارك الله فيك

لو تعمل الدورة فيديو اسرع وافضل إنتشاراً وخاصة في اليوتيب

#6

اسلوبك في الطرح جدا ممتاز كيف لو فديو

#7

السلام عليكم ورحمة الله

شكرا للأخوة الذين قاموا بالرد على الموضوع.

بخصوص دروس الفيديو -

بصراحة انا فكرت بالموضوع في اول الامر – لكن كما ذكرت انا فقط مبتدئ – واكتب ما اتعلمه مباشرة. لذا هذه الدروس لكن تكون وبصراحة على افضل ما يكون – هي فقط محاولة اولى – لكن اذا قدر الله ان استمر في هذه الدروس و وصلت فيها الى مرحلة متقدمة – ربما حينها اعيد طرحها وترتيبها في ملف pdf وايضا ربما على شكل فيديوات. و الله الموفق.

/index.php/topic/264448-%D8%A7%D9%84%D8%A8%D8%AF%D8%A7%D9%8A%D8%A9-%D9%85%D8%B9-%D8%A7%D9%84%D8%A7%D9%86%D8%AF%D8%B1%D9%88%D9%8A%D8%AF/

 

اني وان كنت الاخير زمانه ---- لأتِ بما لم تستطعه الاوائلُ

#8

السلام عليكم ورحمة الله

نكمل ان شاء الله.

اظن ان الدروس – اذا شاء الله – ستكون على شكل برامج بسيطة و صغيرة، ومن خلال هذه البرامج، سنتعلم اشياء مختلفة.

لكن هناك بعض الامور الاساسية التي يجب ان تكون واضحة ومفهومة بخصوص برمجة الاندرويد – والتي يكاد ان لا يخلو برنامج منها.

لقد تحدثنا مسبقا عن بعض هذه الامور – ولازال هناك المزيد.

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

1-	Activities

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

2-	Views (Everything is a view)

ايضا لقد تحدثنا مسبقا عن هذه النقطة، ويجب الان ان تكون على دراية بفائدة هذا السطر

TextView myTextView = (TextView) findViewById(R.id.myTextView);

ايضا اريدك هنا ان تقرء و تنتبه لهذه الاسطر

View is an overloaded word:
a-	Layout (layout xml file)
b-	Individual widgets (Button, TextView,..)
c-	Entire UI

اما النقطة الثالثة و المهمة جدا

3-	Intent (an inter-application message-passing framework. You can use it to start and stop activities and services)

بعد قليل سنتكلم عن هذا الموضوع ان شاء الله و نفصل به لأهميته.

4-	Manifest file

كل تطبيق اندرويد يحوي على ملف AndroidManifest.xml والذي يحوي على هيكلية و متطبات و صلاحيات برنامجك. على سبيل المثال، عندما نقوم بأضافة activity جديدة للبرنامج، ستحتاج ان تضيفها داخل هذا الملف. وايضا كمثال اخر، اذا كان برنامجك يتعامل مع البلوتوث مثلا، تحتاج ان تضيف صلاحيات داخل هذا الملف.

يمكنك مشاهدة هذا الملف والوصول اليه من خلال الـ Package Explorer

post-47438-050056600 1340580471_thumb.pn

- صورة رقم 1 -

يمكنك التعامل مع هذا الملف عن طريق الواجهات (Manifest Editor) او عن طريق الـ xml

post-47438-092394300 1340580516_thumb.pn

- صورة رقم 2 -

سنحتاج هذا الملف كثيرا، ومع الاستخدام ستكون الصورة اوضح لك.

5-	Resources

بصراحة هذا الموضوع مهم و طويل ايضا. وانا هنا احاول ان ارسم الصورة العامة للموضوع.

المصادر الخاصة ببرنامجك تجدها تحت المجلد res ضمن مشروعك. تلاحظ ان هناك العديد من المجلدات الفرعية تحت هذا المجلد – ويمكنك انت اضافة المزيد.

طبعا نحن مسبقا تعاملنا مع هذا المجلد – فلقد تعاملنا مع الـ main.xml والذي هو موجود تحت الـ layout تحت الـ res. وايضا تعاملنا مع الـ strings.xml تحت الـ values تحت الـ res.

و عليه، الـ resources في برنامجك ممكن تكون strings او colors او themes او layouts و غيرها الكثير.

سنتكلم عن كل شيء وقت الحاجة اليه، لكن النقطة المهمة التي اريد ان اشير اليها هنا هي كيفية التعامل و الوصول الى هذه المصادر من خلال الكود. (و ايضا نحن مسبقا تعاملنا مع هذا الامر)

بصورة عامة للوصول و التعامل مع المصادر من خلال الكود، الاندرويد يوفر لنا class لهذا الامر

static R class

وهذا الـ class بدروه يحوي على static subclasses لكل المصادر التي عرفتها في برنامجك. كمثال – اذا تذكرون كيف كنا نصل الى widget معين قد اضفناه على برنامجنا –

R.id.myTextView

الان على سبيل المثال لو لديك برنامج android (او ممكن تكون واحد جديد) لو تفتح ملف الـ strings.xml سيكون بالاساس هكذا

post-47438-018535300 1340580612_thumb.pn

- صورة رقم 3 -

لاحظ انه لدي string معرفة بأسم hello

طيب، الان لو اردت ان اصل لهذه الـ string من خلال الكود في برنامجي.

على سبيل المثال، لو اريد ان اقرء هذه الـ string لأقوم بعرضها في textView. كيف يمكنني عمل ذلك.

الكود التالي يوضح هذه العملية:

 Resources r = getResources();
  TextView tv = (TextView) findViewById(R.id.textView1);
  tv.setText(r.getText(R.string.hello));

عن طريق استخدام الدالة getResources.

اما لو اردنا الاشارة الى هذه الـ string من ملف الـ layout – كما في ملف الـ main.xml

فحينها نستخدم شيء مقارب الى هذا

android:text="@tring/hello

----------------

الصورة التالية توضح تقريبا المكونات السابقة

post-47438-029849300 1340580672_thumb.pn

- صورة رقم 4 -

--

الان دعونا نتكلم عن موضوع مهم وهو الـ intent وكيفية استخدامه

An intent generically defines an “intention” to do some work.

يستخدم الـ intent في كثير من الامور – مثلا

-	Start a service
-	Launch an activity
-	Dial a phone number or answer a phone call

ومن اهم هذه الامور هو بدء activity جديدة. و هذا ما سنتكلم عليه تحديدا في الجزء المتبقي من هذا الدرس ان شاء الله.

ان افضل طريقة للتعلم - من وجهة نظري - هي اخذ مثال يوضح الامر.

دعونا نكون تطبيق جديد لنستخدم الـ intent في ابسط صورة.

كون تطبيق جديد وقم بأضافة button

الان سنضيف activity جديدة كما في الصور

اضغط بالزر الايمن على المجلد layout ثم New واختار File

post-47438-019869400 1340580725_thumb.pn

- صورة رقم 5 –

ثم اكتب اسم الـ activity

post-47438-086068600 1340580745_thumb.pn

- صورة رقم 6 –

الان ستفتح لك النافذة الخاصة بالتصميم للـ activity الثانية

لاحظ انه الان لدينا ملفين xml كل ملف خاص عن نافذة في برنامجنا (activity)

post-47438-071915700 1340580764_thumb.pn

- صورة رقم 7 –

للسهولة يمكنك فتح ملف الـ main.xml و نسخ محتوياته الى ملف activity2 ثم عدل عليه

انا لدي ملف الـ activity2 هكذا

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

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="Activity 2" />



</LinearLayout>

فقط سيكون يحوي على text view معروض به كلمة activity 2

الان انتهى جزء التصميم.

الان ما سنفعله ببساطة، عندما نقوم بالضغط على الزر في الـ activity الاولى ، سنقوم بعرض الـ activity الثانية.

لكن قبل هذا يجب ان نضيف ملف اخر. كل activity هنالك جزئين خاصيين بها. الجزء الاول هو جزء التصميم و الجزء الثاني هو ملف الكود

لذا يجب الان ان نضيف ملف الى مجلد الـ src

كما في الصورة

post-47438-035775800 1340580810_thumb.pn

- صورة رقم 8 –

ثم ادخال اسم الملف – و تأكد ان الملف يتم اضافته الى الـ package الخاصة بك

وايضا قم بتغيير الحقل الخاص بـ superclass كما في الصورة

post-47438-026434900 1340580827_thumb.pn

- صورة رقم 9 –

الملف المضاف سيكون بهذه الصورة

package com.arabteam2000.android5;

import android.app.Activity;

public class activity2 extends Activity {

}

الان نحتاج الى معالجة الدالة onCreate

لعمل ذلك – يمكنك نسخ هذا اجزء من المف الخاص بالـ activity الاولى

او يمكنك هكذا

من قائمة source قم بالاختيار كما في الصورة

post-47438-008131800 1340580883_thumb.pn

- صورة رقم 10 -

ثم قم بأختيار الدالة onCreate

post-47438-062571600 1340580933_thumb.pn

- صورة رقم 11 -

بعد اضافة الدالة قم بأضافة السطر التالي

		setContentView(R.layout.activity2);

يصبح شكل الملف النهائي كالاتي

package com.arabteam2000.android5;

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

public class activity2 extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);

		setContentView(R.layout.activity2);
	}

}

الان سنعود الى الملف الخاص بالـ activity الاولى.

نريد عندما نضغط الزر يقوم البرنامج بأظهار activity2

لذا علينا معالجة ضغط الزر

في دالة الـ onCreate سنقوم بمعالجة هذا الحدث

public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        Button btn = (Button)  findViewById(R.id.button1);  
        btn.setOnClickListener(new View.OnClickListener() {

			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub



			}
		});      

    }

الان بقي في داخل الحدث onClick نكتب الكود الخاص بفتح الـ activity الثانية.

لتحقيق ذل سنستخدم الـ intent

اضف هذين السطرين داخل الحدث onClick

Intent i = new Intent(Android5Activity.this, activity2.class);
startActivity(i);

اخيرا – يجب اضافة الـ activity الجديدة الى ملف الـ Manifest

لذا قم بأضافة هذا السطر المضلل الى ملف الـ AndroidManifest.xml

post-47438-006713800 1340581005_thumb.pn

- صورة رقم 12 -

الان قم بتنفيذ البرنامج

ثم قم بضغط الزر – ستلاحظ انك تنتقل الى الـ activity الثانية.

هذا مثال بسيط جدا يوضح احدى استخدامات الـ intent .

لازال هذا الامر يتطلب الكثير من التوضيح – كيفية الربط بين اكثر من activity و كيفية تمرير البيانات و القيم بين الـ activities.

سنتكلم ان شاء الله بتفصيل اكثر في الدرس القادم.

يتبع... اذا كان في العمر و الوقت متسع.

المرفقات
1.png2.png3.png4.png5.png6.png7.png8.png9.png10.png11.png12.png
1

/index.php/topic/264448-%D8%A7%D9%84%D8%A8%D8%AF%D8%A7%D9%8A%D8%A9-%D9%85%D8%B9-%D8%A7%D9%84%D8%A7%D9%86%D8%AF%D8%B1%D9%88%D9%8A%D8%AF/

 

اني وان كنت الاخير زمانه ---- لأتِ بما لم تستطعه الاوائلُ

#9

الـــــــــــــــــــــــــــــــــــــــــــــــــــف شكــــــــــــــــــــــــــــر

الله يـــــــــجـــــــــزاكــــــــ الجنـــــــــــــــــــه

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

#10

اخوي لاهنت ابي رابط للبرنامج الى تستخدمه حملت برامج كثير بس صعب التعامل معاها

تحياتي

#11
NOB كتب:

اخوي لاهنت ابي رابط للبرنامج الى تستخدمه حملت برامج كثير بس صعب التعامل معاها

تحياتي

اهلا بك اخي الكريم.

هل تقصد برنامج ال eclipse؟

يمكنك تحميله من هنا

http://www.eclipse.org/downloads/

لاضافة المكتبات المطلوبة، راجع كتاب اندرويد ببساطة - والذي وضعتُ رابطه في اول الموضوع.

بالتوفيق

/index.php/topic/264448-%D8%A7%D9%84%D8%A8%D8%AF%D8%A7%D9%8A%D8%A9-%D9%85%D8%B9-%D8%A7%D9%84%D8%A7%D9%86%D8%AF%D8%B1%D9%88%D9%8A%D8%AF/

 

اني وان كنت الاخير زمانه ---- لأتِ بما لم تستطعه الاوائلُ

مواضيع مشابهة