2016/10/04

اهم مجلدات المشروع في اندرويد


فيما يلي شرح لأنواع الملفات التي يحويها كل مجلد من مجلدات الموارد في مشروع آندرويد:
على اليسار هناك ثلاثة ملفات / مُجلّدات رئيسية تكونت تلقائياً بداخل app وهي:
  • manifests 
  • java 
  • res


مجلد manifest
والذي يحتوي على ملف AndroidManifest.xml ويعتبر هذا الملف مهم جداً لنظام أندرويد لما يقدمه من معلومات أساسية للنظام قبل أن يقوم بتشغيله، أبرز هذه المعلومات:
  • يحتوي على اسم الحزمة Package Name: وهو اسم مميز للتطبيق لتمييزه عن باقي التطبيقات المتواجدة على الهاتف ، فمثلاً إن كان اسم تطبيقك Gallery و هناك تطبيق آخر على الهاتف يسمى Gallery كيف يستطيع النظام التفرقة بين صلاحيات كل منهما و معلوماتهما الخاصة؟

    يقوم النظام بتمييزهما عن طريق Package Name لذا فهو يعتبر اسمًا مُميّزًا لتطبيقك لا ينبغي أن يتشابه مع Package Name لأي تطبيق آخر ، من أجل ذلك وضعت قواعد لتسمية الـ Package أهمها هو أن تجعل تطبيقك على هيئة اسم نطاق لموقعك - إن وجد – فمثلا نجد شركة Google عند تسمية حزم تطبيقاتها تستخدم com.google.appName فيكون لها اسم حزمة Package Name فريد لا يتكرر.
ملحوظة: يتم تحديد Package Name عند إنشاء التطبيق في الخانة الخاصة بالـ Company Domain.
  • يقوم بتعريف المكونات الأساسية التي يتكون منها التطبيق الخاص بك: سوف نتعرف على هذه المكونات في الدرس التالي، ويتكون التطبيق من أحد هذه المكونات أو أكثر على حسب حاجة التطبيق.
  • يحتوي الإصدار الأدنى الذي يعمل التطبيق معه وهو ما قمنا بتحديده مسبقا عند إنشاء للمشروع.
  • يحتوي على الصلاحيات التي سيعطيها النظام للتطبيق –إن وجدت-.
  • يحتوي على الصلاحيات التي يجب على التطبيقات الأخرى أن تطلبها إن أرادت أن تتبادل معلومات مع تطبيقك.
لذا يعتبر هذا الملف من الملفات الأساسية التي يعتمد عليها النظام في تحديد كيفية التعامل مع التطبيق وإذا لم يتم تحديد كل شيء بشكل صحيح فذلك يعرض تطبيقك إلى ألا يعمل.

مجلد java
يختص هذا المُجلّد بالكود التى سنكتبه للتطبيق و هو الكود الذى يحدد وظيفة التطبيق و استجابة الواجهة و تنفيذها للأوامر.

مجلد res
و يهتم هذا المُجلّد بكل الموارد التي يتعامل معها التطبيق من صور و عناصر مكونة لواجهة المستخدم و عناصر مكونة للقوائم ويتكون من مجموعة من المجلّدات المرتبة كالآتي:
  • drawable ويخص هذا المُجلد كافة الصور التي سيتم استخدامها في التطبيق. 
  • layout ويخص هذا المجلد بالتصميم الخاص بواجهة المستخدم و ما تحتويه من عناصر مختلفة. 
  • menu ويخص هذا المجلد بالقوائم و ما تحتويه من عناصر. 
  • mipmap ويخص هذا المجلد بالأيقونة الخاصة بالتطبيق فقط. 
  • values ويحتوى هذا المجلد على ملفات أخرى لكل منها وظيفة مختلفة و لكنها تشترك في فكرة عامة واحدة وهي جعل التطبيق أكثر مرونة لدعم دقة الشاشات المختلفة و الأحجام المختلفة ودعم اللغات المختلفة.

مدخل الي برمجة اندرويد

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

الطبقات الرئيسية المكونة لنظام أندرويد

الصورة التالية توضح الهيكل الداخلي للأندرويد والطبقات الرئيسية المكونة لنظام التشغيل.
 


ينقسم نظام التشغيل إلى خمس طبقات وظيفتها كالآتي:

طبقة التطبيقات Application Layer (الطبقة العلوية)
وهي الطبقة التي نتعامل معها دائمًا كمستخدمين لنظام التشغيل، فهي تحتوي على تطبيقات النظام والتطبيقات التي نقوم بتحميلها من المتجر -وهي الطبقة التي سيعمل فيها تطبيقك في آخر هذا الدرس-، أمثلة على ذلك تطبيق الاتصال وتطبيق البريد الإلكتروني وتطبيق المتصفح.

الطبقة الخاصة ببيئة عمل التطبيقات Application Framework Layer

تحتوي تلك الطبقة على مكتبات بُنيت بلغة الجافا خصّيصًا لنظام تشغيل أندرويد وتوفر هذه المكتبات طرق الوصول إلى الموارد الخاصة بالهاتف مما يجعل تطوير التطبيقات أسهل -وهي الطبقة التي سنتعامل معها كمطوري تطبيقات للأندرويد- وأمثلة على ذلك:
  • View System: وهي مكتبة تحتوي على العناصر اللازمة لإنشاء واجهة المستخدم مثل TextViews و Buttons و Checkboxes و غيرها من العناصر الخاصة بواجهة المستخدم.

  • Notification Manager: تحتوي هذه المكتبة على العناصر اللازمة لإنشاء و إرسال الإشعارات للمستخدم الخاصة بتطبيقك.
  • Telephony Manager: وهي المكتبة المسؤولة عن استقبال و إرسال المكالمات الهاتفية من داخل تطبيقك. 
  • Location Manager : وهي المكتبة المسؤولة عن تحديد المواقع باستخدام GPS Sensors المتواجدة بالهاتف.
أسفل هذه الطبقة سنجد طبقة خاصة تنقسم إلى جزئين:
طبقة المكتبات المطورة بلغة C و ++C (المعروفة باسم Libraries Layer)
وتحتوي هذه الطبقة على مكتبات مكتوبة بلغة C لقدرة لغة C على القيام بالمهام القوية بشكل كفء دون إهدار لموارد النظام. أمثلة على ذلك:
  • SQLite: تستخدم للتعامل مع قواعد البيانات.
  • OpenGL|ES: تستخدم للتعامل مع الرسوميات ثنائية و ثلاثية الأبعاد و تستخدم بشكل أكبر مع ثلاثية الأبعاد.
  • FreeType: تستخدم للتعامل مع أنواع الخطوط المختلفة.
  • Media FrameWork: تستخدم للتعامل مع الصيغ المختلفة لملفات الفيديو.
Android Runtime
و تحتوى هذه الطبقة على مجموعة من المكتبات والتي تجعل المطور قادر على برمجة التطبيقات باستخدام لغة الجافا.
كما تحتوى على الآلة الافتراضية (Virtual Machine) المسؤولة عن تشغيل التطبيقات والتي تم تطويرها لكي تعمل على الهواتف المحمولة وتتميز باستهلاكها القليل للموارد من الذاكرة العشوائية والمعالج وبطارية الهاتف وتسمى بـ Dalvik Virtual machine.
ويعمل كل تطبيق داخل نسخة خاصة به من الآلة الافتراضية مما يميزها بالأمان فالتطبيق لا يستطيع أن يرى باقي التطبيقات ولا يستطيع الوصول إلى بيانات من داخل الهاتف دون علم المستخدم ومنحه الصلاحيات اللازمة لذلك - تلك الصلاحيات التي يتم منحها للتطبيق عند تحميله من المتجر- لذلك ينصح بالتدقيق فيما يحتاجه التطبيق من صلاحيات وألا تقوم بتحميل تطبيقات ذات صلاحيات زائدة عن حاجة التطبيق لكي يعمل ، وصُممت الآلة الافتراضية بطريقة تجعل أكثر من نسخة من الآلة الافتراضية تعمل معًا بسلاسة وذلك لكي يصبح المستخدم قادراً على تشغيل واستخدام أكثر من تطبيق معًا دون الشعور باختلاف في الأداء.

طبقة النواة (Kernel)
وهي الطبقة المسؤولة عن التعامل مع العتاد المختلف للهواتف فتحتوي على التعريفات الأساسية الخاصة بهذا العتاد كما توفر طريقة أبسط للطبقة العلوية للوصول لمميزات العتاد وهي نفس نواة لينكس.
تعتبر كل طبقة هي حلقة الوصل بينها وبين ما فوقها أو تحتها من طبقات، وكلما أتجهنا للأسفل كلما استُخدمت لغات وطرق أقرب في تعاملها مع العتاد كلغة C أو الأسمبلي مثلاً وكلما صعدنا للأعلى كلما استُخدمت لغات وطرق أسهل للمستخدم وتقدم خدمات غنية له كالجافا مثلاً.

إصدارات أندرويد

قبل البدء بتطوير التطبيقات ينبغي علينا معرفة ما هي إصدارات أندرويد، سأقوم سريعًا بذكر كافة إصدارات أندرويد المختلفة ورقم الإصدار ورقم الـ API الخاص بها.
Cupcake 1.5 API 3
Dount 1.6 API 4
Eclair 2.0 API 5
Froyo 2.2 API 8
Gingerbread 2.3.3 API 10
Honeycomb 3.0 API 11
Ice Cream sandwich 4.0 API 14
Jellybean 4.1 API 16
Kitkat 4.4 API 19
Lollipop 5.0 API 22
Marshmallow 6.0 API 23
nougat 7.0 API 24  
جديد

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

لكل إصدار من إصدارات أندرويد مزايا خاصة أُضيفت له لم تكن متوافرة في الإصدارات الأقدم، ولكي تستطيع بناء هذه المزايا في تطبيقك ينبغي اختيار الإصدار الأدنى المناسب لمزايا تطبيقك لأنك تستطيع دعم المزايا الخاصة بالإصدار الأدنى فقط، لذا كلما قمنا بدعم إصدارات أقدم كلما فقدنا المزايا الحديثة وفي المقابل نحصل على عدد مستخدمين أكثر وإذا قمنا بدعم أحدث الإصدارات سوف نحصل على مزايا أكثر وعدد مستخدمين أقل. لذا سنختار الحد الأدنى الذي سنحتاجه من المزايا دون خسارة عدد المستخدمين، وإصدار Jellybean يتيح لك مزايا جيدة واستهداف عدد مستخدمين أكبر لأن تطبيقك سيعمل على كل من Jellybean و kitkat و lollipop و marshmallow وما سيأتي بعد ذلك من إصدارات أحدث وهو كما يتضح في الرسم البياني السابق أكثر من 90% من مستخدمي أندرويد، ولكنه لن يعمل على أي هاتف يعمل بإصدار أقدم من Jellybean.

المتطلبات للبدء ببرمجة تطبيقات أندرويد

كل ما تحتاجه هو حاسوب يعمل بأي نظام من أنظمة التشغيل الرئيسية -ويندوز أو لينكس أو ماك- لتبدأ معنا هذه الدروس.
لا يوجد حاجة لمعرفة سابقة بلغة برمجة فسنتعلم معاً ما نحتاج إليه.
هذه الدروس موجهة بشكل أساسي للمبتدئين.
البرامج التي سنعمل عليها خلال الدروس القادمة:
JDK
Android Studio

ملاحظة: ينبغي تثبيت JDK أولاً قبل البدء في تثبيت Android Studio حيث أنه يحتاج إليه عند التثبيت.

2016/10/02

كيفية التبديل بين الـ Activities في اندرويد

بسم الله الرحمن الرحيم 
في هذه التدوينة سنتكلم عن كيفية التبديل بين الانشطة " Activities "


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

 فتح " Activity " جديد 
لكي نقوم بفتح "Activity" جديد نستخدم دالة " ()StartActivity "
Intent i = new Intent(getApplicationContext(), SecondScreen.class);
StartActivity(i);
 ارسال براميترللـ "Activity" الجديد 
لكي نرسل براميتر للـ"Activity" الذي انشاناه نستخدم دالة " ()putExtra "

i.putExtra("key""value");

// Example of sending email to next screen as
// Key = 'email'
// value = 'myemail@gmail.com'
i.putExtra("email""myemail@gmail.com");

استلام البراميتر في الـ"Activity" الجديد
لكي يتم استلام البراميتر في الـ"Activity" الذي انشاناه نستخدم دالة " ()getStringExtra "

Intent i = getIntent();
i.getStringExtra("key");

// Example of receiving parameter having key value as 'email'
// and storing the value in a variable named myemail
String myemail = i.getStringExtra("email");

لاغلاق الـ "Activity" نستخدم دالة  " ()finish " 
finish();
الان سنقوم بإنشاء مشروع بسيط يوضح كيفية التنقل بين الـ "Activities" .
في هذا المشروع سوف اقوم بإنشاء ملفين xml  للواجهات ( Screen1 , Screen2)  وملفين جافا (Activity1 , Activity2)
كما في الصوره التالية :

1. الان نقوم بإنشاء مشروع جديد  File > New > New Project 
2. عند انشاء المشروع اعطي لملف الجافا اسم " Activity1 " , ولملف الـxml اسم " screen1 " .
3. الان قم بكتابة الكود التالي في ملف screen1.xml   . هذا الكود يحتوي علي شكل بسيط و زر . 

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

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Name: " />

    <EditText
        android:id="@+id/name"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginBottom="10dip" />

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Email: " />

    <EditText
        android:id="@+id/email"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginBottom="10dip" />

    <Button
        android:id="@+id/btnNextScreen"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="15dip"
        android:text="ارسال البيانات الي الشاشة التالية" />

</LinearLayout>




4. قم بفتح ملف Activity1.java وقم بكتابة الكود التالي بداخله . هذ الكود سوف نقوم بإنشاء " Intent " جديد وسنمرر برامترات عند الضغط علي الزر .

package mesalm.switchbetweenactivities;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

public class Activity1 extends Activity {
    // تهيئة المتغيرات
    EditText inputName;
    EditText inputEmail;

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

        inputName = (EditText) findViewById(R.id.name);
        inputEmail = (EditText) findViewById(R.id.email);
        Button btnNextScreen = (Button) findViewById(R.id.btnNextScreen);

        //الاستماع الي حدث الزر
        btnNextScreen.setOnClickListener(new View.OnClickListener() {

            public void onClick(View arg0) {
                //بداية intent جديد
                Intent nextScreen = new Intent(getApplicationContext(), Activity2.class);

                //ارسال البيانات الي Activity  اخر
                nextScreen.putExtra("name", inputName.getText().toString());
                nextScreen.putExtra("email", inputEmail.getText().toString());

                Log.e("n", inputName.getText() + "." + inputEmail.getText());

                startActivity(nextScreen);
            }
        });
    }
}


5. الان سنقوم بإنشاء الشاشة الثانية كالتالي : كليك يمين علي layout 
layout > New > Activity > Empty Activity



- Activity Name  سيكون Activity2
- layout Name سيكون  screen2

6. قم بكتابة الكود التالي في ملف screen2.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#f06">

    <TextView android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="لقد ادخلت . . . ."
        android:textSize="25dip"
        android:gravity="center"
        android:layout_margin="15dip"/>

    <TextView android:id="@+id/txtName"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="15dip"
        android:textSize="18dip"/>

    <TextView android:id="@+id/txtEmail"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="15dip"
        android:textSize="18dip"/>

    <Button android:id="@+id/btnClose"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="15dip"
        android:textSize="25dip"
        android:text="اغلاق"/>

</LinearLayout>

7. الان نقوم بكتابة الكود التالي في ملف Activity2.java  . الهدف من الكود هذا  عرض البراميترات التي قمنا بإرسالها من الشاشة الاولي .

package mesalm.switchbetweenactivities;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class Activity2 extends Activity {
    /* يتم استدعاء هذه الداله عند بداية الـActivity */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.screen2);

        TextView txtName = (TextView) findViewById(R.id.txtName);
        TextView txtEmail = (TextView) findViewById(R.id.txtEmail);
        Button btnClose = (Button) findViewById(R.id.btnClose);

        Intent i = getIntent();
        //استلام البيانات
        String name = i.getStringExtra("name");
        String email = i.getStringExtra("email");
        Log.e("Second Screen", name + "." + email);

        // عرض البيانات المستلمة
        txtName.setText(name);
        txtEmail.setText(email);

        // ربط حدث النقر بالزر
        btnClose.setOnClickListener(new View.OnClickListener() {
            public void onClick(View arg0) {
                //اغلاق الـActivity الثاني
                finish();
            }
        });
    }
}

8.  نذهب الي ملف AndroidManifest.xml ونقوم باضافة الكود التالي بين الوسم "application" لربط الـ " Activities " ببعضها .

<activity android:name=".Activity2"></activity>

 9. اخيراً نقوم بتشغيل التطبيق بالضغط علي " Run " (  )
 النتيجة كالتالي :


2016/09/11

انواع المخططات في اندرويد - android layouts

في هذا البوست سوف نتحدث حول المخططات  (layouts) .

يوجد  في نظام الاندرويد  ستة مخططات هما:

1. Linear Layout
2. Relative Layout
3. Table Layout
4. Grid View
5. Tab Layout
6. List View

 ويتم وضعها  بصيغة XML في ملف res/layout كما في الصورة .


الان لنبدأ في عرض كل مخطط بشئ من التفصيل

1. Linear Layout
معني (LinearLayout) باللغة العربية  التخطيط الخطي , وهي من اسمها تعني انه يتم عرض كافة العناصر التي بداخلها بطريقة خطية  , سواء كانت افقية Horizontally او  راسية  Vertically  ويتم تعيين هذا السلوك في اندرويد من خلال التوجية التالي  : android:orientation   .
مثال علي الــ  Vertical layout :
<LinearLayout android:orientation="vertical"> .... </LinearLayout>
ايضا مثال علي الــ  Horizontal layout :
<LinearLayout android:orientation="horizontal"> .... </LinearLayout>


الان عرفنا  ان للــ Linear Layout نوعين .

والان سنعرف كيف ننشئها .
1. ننشئ مشروع جديد  File => New => NewProject .
2. نريد ان ننشئ ملف xml جديد  سنعطية اسم  "  linear_layout.xml "  سوف ننشئ هذا الملف في المسار res/layout.
 كليك يمين علي res/ layout -> New -> Layout resource file .
3. الان افتح الملف الذي انشأناه وضع فيه الكود التالي .

<?xml version="1.0" encoding="utf-8"?>
<!-- هذا الـ LinearLayout من النوع الرأسي (Vertical) -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="5dip"
        android:text="Email:" />
    <EditText
        android:inputType="textEmailAddress"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginBottom="10dip" />
    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Login"
        android:background="#4333"/>
    <!-- هذا الـ LinearLayout من النوع الافقي (Horizontal) -->
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="25dip"
        android:background="#d9d"
        android:orientation="horizontal">
        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:gravity="center"
            android:padding="15dip"
            android:text="Home" />
        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:gravity="center"
            android:padding="15dip"
            android:text="About" />
    </LinearLayout>
</LinearLayout>

4. لكي يعمل هذ التطبيق  نريد ان نعدل شئ صغير في ملف الـ MainActivity.java  سنفهم فيما بعد السر وراء هذا التعديل .
التعديل كالتالي : نذهب الي ملف MainActivity.java  وفي دالة الـ OnCreat  سنقوم بتغيير R.layout.activity_main الي R.layout.linear_layout
package mesalm.layout;

        import android.support.v7.app.AppCompatActivity;
        import android.os.Bundle;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.table_layout);
    }
}
5. لتشغيل التطبيق اضغط علي " Run " (      ) يجب ان تري النافذة التالية علي شاشة  المحاكي .


2. Relative Layout
او بالعربية تدعي التخطيط النسبي بمعني ان كل عنصر يرتب نفسه  بالنسبة الي العناصر الاخرى .
ففي الرسمة التي بالاسفل يتم وضع زر " Cancel " نسبياً الي اليمين من زر  " login " , وايضا ً هذا الزر تم وضعة نسبياً الي ما فوقه وهكذا .



في البداية نريد ان نذكر بعض الخصائص التي نستخدمها مع RelativeLayout والتي تساعدنا في ترتيب العناصر وربطها ببعضها البعض .
android:id
وهو مُعرّف يتم اعطاءه للعنصر , ويتم استخدام العنصر في المكان المطلوب عن طريق استخدام هذا المعرف .
android:layout_above
 تستعمل بغرض محاذاة العنصر فوق الأخر.
android:layout_below
تستعمل بغرض محاذاة العنصر أسفل الأخر.
android:layout_toRightOf
 تستعمل بغرض محاذاة العنصر بيمين الأخر.
android:layout_toLeftOf
 تستعمل بغرض محاذاة العنصر بيسار الأخر.
android:layout_alignParentTop 
تستعمل بغرض محاذاة العنصر أعلى الـlayout, و لا عنصر يكون قبله.
android:layout_alignParentEnd
 تستعمل بغرض محاذاة العنصر يمين الـlayuot, و لا عنصر يكون قبله.
android:layout_alignParentBottom
 تستعمل بغرض محاذاة العنصر أسفل الـlayout, و لا عنصر يكون بعده.
android:layout_alignParentStart
 تستعمل بغرض محاذاة العنصر أسفل الـlayout, و لا عنصر يكون بعده.

ملاحظة : هناك خصائص مهمة جداً لابد من معرفتها 
ويمكنك الرجوع الي موقع مطوري اندرويد لمعرفة المزيد حول باقي خصائص الـ RelativeLayout .

والان سنبدأ في إنشاء RelativeLayout .
1. انشاء مشروع جديد . File=> New=> NewProject
2. في الملف  res/layout   سنقوم بانشاء ملف XML جديد , سنعطيه الاسم  relative_layout.xml
 كليك يمين علي res/ layout -> New -> Layout resource file .
3. نفتح الملف الذي انشأناه ونكتب فية الكود التالي.
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content">
    <EditText
        android:layout_alignParentTop="true"
        android:hint="Email"
        android:id="@+id/Email"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
    <EditText
        android:layout_below="@id/Email"
        android:id="@+id/pass"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="password" />
    <Button
        android:id="@+id/btnLogin"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_below="@id/pass"
        android:layout_marginRight="80px"
        android:layout_marginLeft="80dp"
        android:text="Login" />
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignTop="@id/btnLogin"
        android:layout_toRightOf="@id/btnLogin"
        android:text="Cancel" />
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:text="forget password?" />
</RelativeLayout>
4. نفس ما فعلناه من قبل في ملف الـ MainActivity.java  سنفعله الان , سنقوم بتغيير R.layout.activiy_main  الي اسم الملف الذي انشأناه  R.layout.relative_layout
package mesalm.layout;

        import android.support.v7.app.AppCompatActivity;
        import android.os.Bundle;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.relative_layout);
    }
}
5. نقوم الان بتشغيل التطببيق , نضغط " Run " (      ) يجب ان تري النافذة التالية علي شاشة  المحاكي .



3 .Table Layout
التخطيط الجدولي وهي تتكون من صفوف rows  واعمدة  columns  ليس من الصعب ان تفهمها , والصورة التي بالاسفل ستعطيك الفكرة .


1. انشاء مشروع جديد 
او بإمكانك ان تبدأ من الخطوة التالية وتنشئ ملف XML  جديد بجانب الملفات السابقة في مجلد res/layout  .
2. في الملف  res/layout   سنقوم بانشاء ملف XML جديد , سنعطيه الاسم  table_layout.xml
 كليك يمين علي res/ layout -> New -> Layout resource file .
3. قم بكتابة الكود التالي في الملف الذي قمت بانشاءه .

<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#ffffff"
    android:shrinkColumns="*"
    android:stretchColumns="*">
    <!-- الصف الاول معه عمود واحد -->
    <TableRow
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center_horizontal">
        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_span="3"
            android:background="#5b7331"
            android:padding="18dip"
            android:text="Row 1"
            android:textColor="#000"
            android:textSize="18dp" />
    </TableRow>
    <!-- الصف الثاني معه ثلاث اعمدة -->
    <TableRow
        android:id="@+id/tableRow1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <TextView
            android:id="@+id/r2c1"
            android:layout_weight="1"
            android:background="#9bdc55"
            android:gravity="center"
            android:padding="20dip"
            android:text="Row 2 column 1"
            android:textColor="#000000" />
        <TextView
            android:id="@+id/r2c2"
            android:layout_weight="1"
            android:background="#71a137"
            android:gravity="center"
            android:padding="20dip"
            android:text="Row 2 column 2"
            android:textColor="#000000" />
        <TextView
            android:id="@+id/r2c3"
            android:layout_weight="1"
            android:background="#3e6109"
            android:gravity="center"
            android:padding="20dip"
            android:text="Row 2 column 3"
            android:textColor="#000000" />
    </TableRow>
    <!--الصف الثالث معه عمودين  -->
    <TableRow
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:gravity="center_horizontal">
        <TextView
            android:id="@+id/r3c1"
            android:layout_weight="1"
            android:background="#5c7125"
            android:gravity="center"
            android:padding="20dip"
            android:text="Row 3 column 1"
            android:textColor="#000000" />
        <TextView
            android:id="@+id/r3c2"
            android:layout_weight="1"
            android:background="#417020"
            android:gravity="center"
            android:padding="20dip"
            android:text="Row 3 column 2"
            android:textColor="#000000" />
    </TableRow>
</TableLayout>

4. نفس ما فعلناه من قبل في ملف الـ MainActivity.java  سنفعله الان , سنقوم بتغيير R.layout.activiy_main  الي اسم الملف الذي انشأناه  R.layout.table_layout
package mesalm.layout;

        import android.support.v7.app.AppCompatActivity;
        import android.os.Bundle;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.table_layout);
    }
}
5. نقوم الان بتشغيل التطببيق , نضغط " Run " (      ) يجب ان تري النافذة التالية علي شاشة  المحاكي .




في هذه التدوينة وضحنا كلاً من linear_layout   ,  Relative_layout  , Table_layout
وفي تدوينات تالية  سنناقش الباقي من الــ layouts ان شاء الله .



2016/09/09

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

في هذا الدرس سنوضح كيفية إنشاء مشروع اندرويد جديد في اندرويد  ستوديو  .
قبل ان تبدأ في هذه التدوينة تأكد من انك قمت بالتالي :
  1. تنصيب ادوات تطوير جافا " JDK " .
  2. تنصيب اندرويد استوديو .
  3. اعداد الــ SDK Manager .
  4. تنصيب محاكي " Genmotion "  علي جهازك .   

الان انت  مستعد لانشاء مشروع اندرويد جديد. 
1. من شاشة " welcome to android studio " اختر " Start new project " .

2. اسم التطبيق : وهو الاسم الذي سيظهر لمستخدمين التطبيق ,  سأتركه افتراضي " My Application " .
 ثم اضغط " Next " .

3. - "Target Android Devices " .
من هذه النافذة نختيار لاي  شئ سنبرمج ؟  (هواتف - ساعات  -  تلفاز - نظارات ) .
نحن سنبرمج  تطبيقات للهواتف لذلك سنختار " Phone and Tablet ".

- " Minimum SDK "   من هنا نحدد اقل اصدار يمكن ان يعمل عليه تطبيقك , بمعني اننا لو اخترنا  " API 15  " فان هذا يعني ان التطبيق يعمل علي جميع الاصدارات ما بين " API 15 " الي اعلي اصدار متوفر الان وهو " API 24 " .
 بعد ذلك اضغط " Next " .

4. من النافذة التالية نختار " Empty Activity " ثم نضغط " Next " .

5.
" Activity Name "  اسم الملف البرمجي , العمل فيه سيكون بلغة " Java "
" Layout Name " اسم ملف التصميم وهو مبنى بلغة " xml "
ساتركهم افتراضيا ثم اضغط " Finish " .

 6. الان اندرويد ستوديو يقوم بانشاء تطبيقك .
      || ملاحظة لا تقم بعمل اي شئ حتي ينتهي انشاء التطبيق .

7. هاقد فتح اول مشرع لنا علي  اندرويد ستوديو. لا تقلق من هذا المنظر المرعب " ان شاء الله ستفهم كل شئ  
الان ساقوم بشغيل التطبيق , ساضغك علي السهم هذا " Run " .

  || ملاحظة اذا قمت بتنصيب محامكي الـ Genymotion علي جهازك , فقم بتشغيله اولا قبل الخطوة التالية .
او قم بالذهاب الي تنصيب محاكي الـ Genymotion  وقم بتنصيبه الان .

8.  الان نختار محاكي " Genymotion " , ثم " ok " .

تنصيب محاكي Genymotion وربطه بأندرويد ستوديو



مرحبا ..

قبل ذلك شبهنا android studio بورشة العمل , واتفقنا انه لكي تنشئ تطبيقك امامك اربع متطلبات لابد ان يتوفرو في جهازك الحاسوب .
المتطلب الاول كما قلنا هو تنصيب ادوات تطوير جافا (JDK) .
و المتطلب الثاني قمنا بتنصيب android studio .
المتطلب الثالث قمنا باعداد الــ SDK Manager .
والان حان دور المتطلب الرابع والاخير وهو الــ emulator   او المحاكي , اذن ما هو محاكي الاندرويد ؟

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

 الان سنقوم بتحميل Genymotion .
يمكنك الذهاب الصفحة التالية من هنا  
ستقوم بانشاء حساب  ومن ثم تسجيل الدخول .


بعد تسجيل الدخول نضغط علي  Download  من القائمة العلوية .
ستأخذنا الي الصفحة التالية , 
سنقوم بتحميل Genymotion ومعه virtualBox .
 لذلك سنضغط علي   with VirtualBox .

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


 الان نريد ان نسجل دخول بأستخدام  الايميل والباسور اللذان قمنا بالتسجيل بهما في الموقع اثناء التحميل .
سأضغط " Sign in "

 نسجل الان

الان ظهرت الاجهزة , انا افضل جهاز Nexus5 وسوف اقوم بتحميله .
سأضغط " Next "

يمكنك تعديل اسم الجهاز ان اردت .
ثم اضغظ " Next "
 الان جاري التحميل .

ها قد انتهي , سوف اضغط " finish " .

الان انا لدي جهاز Nexus5  ساقوم بتشغيله بالضغط علي " Start "

كيفية اعداد الـ sdk manager


مرحبا  

ما زلنا مع المتطلبات الاربعة لكي تبدأ بانشاء تطبيقك الاول . 
المتطلب الاول كما قلنا هو تنصيب الــ JDK يمكنك الرجوع اليه من هنا  .
المتطلب الثاني هو تنصيب android studio . ويمكنك ايضا الرجوع اليه من هنا .

المتطلب الثالث وهو عنوان هذه التدوينة وهو اعداد الــ SDK Manager .
في  التدوينة السابقة وبعد الانتهاء من تنصيب اندرويد ستوديو وقفنا بالتحديد عن النافذ التالية(Welcome to Android studio) . 
الان لكي نقوم بفتح SDK Manager من هذه النافذة , في اسفلها نضغط علي " Configure "  ثم نختار " SDK Manager "