الجمعة، 29 ديسمبر 2017

How to make your YouTube video go viral 2018

الثلاثاء، 5 يناير 2016

How To Chase Spam


I Hate Spam


I really hate it. I hate it so much, that I threw together some basic directions on how to chase the spam you get. What does that mean? It means you track down where the spam came from, and you forward it to the source. In theory, they will stop/block/cancel the person responsible for sending it, making sending spam that much more difficult.
Looking for a more automated solution? Scroll to the bottom...

Summary

Here's the basic idea of what you need to do:
1) Identify your mail server
2) Identify exactly where the junk mail came from
3) Forward the junk mail to the junk mail's source and your ISP
4) Forward the junk mail to the owner of the site that the junk mail advertises
5) Repeat (since you probably have a crap load of junk mail)

Step By Step Instructions

1) Identify your outgoing mail server. If you use an email address from your ISP, then you most likely use their mail server. It may be something like smtp.[yourisp].com or mail.[yourisp].com.
2) Identify where the mail is coming from. This part is complicated. There are lots of mail clients out there, so its impossible for me to give you specific instructions. But I can tell you generally what you need to do. First, if there's a 'From:' address, ignore it completely. What you have to do is show the full mail headers. By default, most mail programs show an abbreviated set of mail headers, because you really don't need to know the details on legitimate emails. For Spam Chasing, you need it all. Once you have the full headers showing, its time to get busy. The following is an example of the type of headers you may see, without their actual values in place:
Subject:
Date:
To:
Reply-To:
Received:
Received:
Received:
Received:
X-Antivirus:
X-Priority:
X-Msmail-Priority:
X-Mailer:
X-Mimeole:
Organization:
Mime-Version:
Content-Type:
Message-Id:
X-Virus-Scanned:
Now you may see a lot of different web sites and domain names in there, but ignore them. Everything there can be and probably has been faked. Everything but one line. Look for the 'Received:' line that contains your mail server. The format should be something similar to this:
Received: from domain.com [202.154.161.61] by your.mail.host.com (AppleMailServer 10.2.3.0) id 47313 via TCP with SMTP; Sat, 21 Feb 2004 05:44:50 -0500
That line is they key, it tells you the exact IP address that talked to your mail server. It is the source of the junk mail. Copy that IP address.
3) The next step is to find out who that IP address belongs to. Go to my WhoIs page and look up the IP:
You have to read the results carefully. If the IP is not in the arin database, it should send you a link to another database that does contain that IP. Once in a while you may have to jump to a 3rd database, but not usually. Once you get the results, it should list who owns the IP address, and it should have IP addresses you can forward the junk mail too. The best address is an abuse@domain.com address, but if they don't list an address like that, send it to whoever they do list. From time to time I go to their web site and look up some email address on their site, to make sure they get the junk. Bookmark the arin web site, you will be using it a lot.
So in addition to any email address you find for the IP's owner, you also want to forward the junk mail to your ISP's email address, usually abuse@[yourisp].com or spam@[yourisp].com.
4) Next you want to find out who owns the web site the spam mail advertises. There has to be a link in the mail somewhere. If not, its probably a virus-generated email and not spam per-se. Find the link, and copy just the domain name. For instance below, you'd want just the green part...
http://click.wonderful-deals.com/sp/t.pl?id=277136:1421725
That domain is what you need. Now with that address, you want to go back to my whois page, and look up who owns the domain. There will be email addresses. They may or may not be real, but those should be to the spammer himself so it will be nice to send him his mail back.
Next, on the whois page, you want to type the domain into the top box and resolve it to its IP address. Now lookup that IP address and see what you get. That most likely will be the ISP or web host of the spammer's web site. Add any email addresses you see there to your forwarding. They will close down the spammers web site and make him start all over. The harder is it so be a spammer, the fewer spammers there will be.
5) Repeat until your junk mail folder is empty, or until you have gone insane.

Automate The Process

Sign up for SpamCop (Its free although you can donate if you want to). You will be given your own unique email address to use. Forward your SPAM to that email address. For each spam you sent to it, spamcop will automatically scan the email headers and body, and lookup all the 'Abuse' email addresses, and send you a confirmation email. That confirmation email contains a link that will bring you to yet another page. This page lets you send, in a single click, all of the SPAM reports for the server(s) the email came from, and the server(s) hosting the web site the SPAM is advertising. Its a little confusing at first but in the end it lets you save a TON of time by automating a lot (but not all, you still have to click on the confirmation email YOU get sent, for each SPAM you send to SpamCop) of the process of reporting SPAM.
To forward a SPAM to them, you have to do so with full headers. I've found that the best program for SPAM reporting is Mozilla ThunderBird. It automatically does full headers when you forward, so you don't have to do anything special there. And it lets you click on multiple emails and click forward, so you can send all of your SPAM email to SpamCop all at once. I use Apple Mail as my primary email client, and I have my SPAM filters put all my SPAM in a special email account. I have Thunderbird check JUST that account. It seems like a complicated process but its really much simpler than it seems. And this system allows me to report 100% of my SPAM! Doing it by hand, I never had near enough time to do it all!

How Do Spammers Get Your Email Address ? Can We Prevent Them ?


spam[3]
Spam seems to arrive in every single email account we use, no matter how careful we are. How are spammers getting all our email addresses? And can we do anything to hide our email address from spammers?
Unfortunately, there’s not a lot you can do to prevent spammers from bombarding you with emails. There are some tips that will help protect you, but spammers will probably find your email address eventually.


Leaked Account Databases


The easiest way for spammers to collect large lists of good, active email addresses is via leaked account databases. These password leaks happen with frightening regularity. Organizations as big as Adobe, LinkedIn, eHarmony, Gawker, Last.fm, Yahoo!, Snapchat and Sony have all been compromised in the past few years. These leaked databases are normally considered a security threat because they often show  account names and passwords. However, they generally show email addresses, too. Spammers can download these leaked databases and add the millions of email addresses to their email lists. Spammers know that the majority of these email addresses should be active, so these databases are excellent for them.
This is likely the way most spammers are currently finding email addresses to spam. There’s really not much you can do to protect yourself from a spammer getting your email address in this way.
A site like Have I been pwned?  can tell you if your account information might have been leaked, but these sites won’t include every leak. You can protect yourself from password leaks by not re-using the same password everywhere, but you practically have to re-use the same email address everywhere.
check-for-leaked-account-passwords

Clicking Links or Loading Images in Spam Emails

If you do get spam emails, you should avoid clicking links in the email. If you see an “Unsubscribe” link in an email from a legitimate company, it’s probably safe to click it. A legitimate company doesn’t want to spam you and potentially run afoul of anti-spam laws, so they’ll just remove you from their list.
On the other hand, if you see an “Unsubscribe” link (or, worse yet, a “Buy Now!” link) in spam email that looks very unprofessional and scammy, the spammer won’t necessarily remove you from their lists. They’ll note your click and their systems will identify your email address as active. They know you’re there, and you may see larger amounts of spam after you click the link.The same goes for loading images in spam emails. Don’t click the “Load Images” button, or the spammers will know you’ve opened the email. Even if you don’t see an image in the email, there may be a tiny one-pixel tracking bug that allows the spammer to identify you if you load it. This is why most email clients don’t automatically load images.
spam-email-images-not-displayed

Scraping the Web For Plain-Text Addresses

Spammers have traditionally harvested email addresses by scraping the web — kind of like Google does — and look for email addresses mentioned on websites. For example, someone may post a comment like “Email me at jon@example.com”. The spammer would then add this address to their spam lists. This is why Craigslist provides a temporary email address where you can be reached rather than including your real email address. This technique is probably less common now that spammers have such large leaked account databases to feast on.
Spammers may also try to acquire valid email addresses by looking in other places they’re publicly available, such as whois records for a domain. These records display an email address associated with the person or organization who registered the domain name.
whois-records-for-google-with-email-addresses

Buying Lists of Email Addresses

Why do the work yourself when other spammers have already built up lists of email addresses for you? Unscrupulous people will sell lists of email addresses to spammers for a low price. These email addresses were often distributed on CDs in the past, and they may still be, but leaked account databases have probably taken some steam out of this marketplace. Spammers may also just trade their lists of email addresses with other spammers, ensuring more spammers will get their hands on your email address once one does.
Legitimate businesses won’t sell or buy lists of email addresses.
cd

Spammers can also get email addresses in other ways — for example, malware could harvest address book data and send it to spammers — but the above methods are some of the most common.
There’s not a lot you can do to avoid having your email address spammed. You can avoid putting your email address on the web in plain-text form and never click a link or load an image in a spam email. But your email address will still end up out there at some point — if only because you signed up to a popular website and their account database was compromised.
Thankfully, we have better spam filters these days. If you’re using an email service with a good spam filter, you shouldn’t need to care about spam beyond clicking the occasional “Report Spam” button when a spam email makes it to your inbox.

[دورة تعليميه] تعلم صنع تطبيقات الاندرويد بالتفصيل


الدرس الاول : [دورة تعليميه - الدرس 1] تعلم صنع تطبيقات الاندرويد بالتفصيل - اعداد بيئه العمل

الدرس الثاني: [دورة تعليميه - الدرس 2] تعلم صنع تطبيقات الاندرويد بالتفصيل - بنيه التطبيق ومكوناته

الدرس الثالث: [دورة تعليميه - الدرس 3] تعلم صنع تطبيقات الاندرويد بالتفصيل - التطبيق الاول 

الدرس الرابع: [دورة تعليميه - الدرس 4] تعلم صنع تطبيقات الاندرويد بالتفصيل - تشغيل البرنامج على المحاكي

الدرس الخامس: [دورة تعليميه - الدرس 5] تعلم صنع تطبيقات الاندرويد بالتفصيل - شرح العناصر الرئيسيه وبرنامج جمع رقمين

الدرس السادس: [دورة تعليميه - الدرس 6] تعلم صنع تطبيقات الاندرويد بالتفصيل - تصدير البرامج بصيغه APK

الدرس السادس: [دورة تعليميه - الدرس 6] تعلم صنع تطبيقات الاندرويد بالتفصيل - تصدير البرامج بصيغه APK






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

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

اولا نحتاج توضيح مفهوم وهو ال sign او التوقيع وهو عباره عن توقيع الكتروني مميز
لا يتكرر ومهمته هو توقيع البرامج التي تنتجها ويشكل ما يشبه البصمه.

فتكون الخطوات هي انتاج ملف ال apk ثم توقيعه وبهذا يصبح ملف موقع يمكن تثبيته على الهواتف

الاضافه ADT اذا كنتم تذكرونها .. تقوم بكل هذا العمل عنا بشكل مبسط...
يلزمنا اولا انشاء ما يسمى keystore او مخزن المفتاح وهو ملف يحوي التوقيع الذي ستسعمله
ويكون محمي بكلمه سر...
هذا الملف يتم انشاءه ومن ثم استعماله من قبل ال ADT لكي يوقع البرامج
ويمكنك نقله من حاسوب لاخر لكي توقع برامجك عليه ، هذه الحاله مفيده بحاله كنت تعمل على اكثر من حاسوب ولكنك تريد توقيع برامجك بنفس الملف، ولكن قد يسأل احد ... لماذا استعمال نفس ال مخزن .. يمكنني انشاء ملف اخر ... والاجابه تكون انه عند عمل تحديثات update لبرنامجك ورفعها مره ثانيه على الماركيت او مكان الرفع الذي تستعمله ... اذا كانت التواقيع مختلفه (يعني من ملفين مخزن مختلفين) عندها واذا اراد شخص اعاده تثبيت التحديث فأنه سيفشل وسيتظهر له رساله خطأ على الهاتف مفادها ان التواقيع غير متطابقه وبهذا يجب عليه حذف النسخه القديمه وتثبيت الجديده ... ومن هنا تأتي اهميه الملف الموحد ... لكي تكون كل تطبيقاتك وكل تحديثاتها موقعه من نفس الملف بنفس التوقيع

قد اكون اطلت بالشرح السابق لانه مهم ومهم ان نعرف ماذا نفعل ... هي ليست مجرد خطوات 1 2 3 لكنني احرص على ان تفهمو ما الذي يحدث ...

الان نفترض انك انهيت برنامجك واصبحت جاهزا لنشره...

***** نبدأ ... اولا انشاء ملف المخزن او keystore (نقوم بهذا مره واحده)

1- تعمل كليك يمين على مجلد المشروع الرئيسي من داخل الايكليبس

** ابحث بالقائمه عن خيار build project واضغط عليه ... تأكد انه لم يعطي رسائل خطأ او اشاره x حمراء... اذا لم تجد هذا الخيار يكون محدد بشكل تلقائي ... اذا انت جاهز للمتابعه

2- نختار من القائمه التي تظهر android tools وهو الخيار قبل الاخير
3- من القائمه الفرعيه التي تظهر نختار export signed application package
4- من المربع الذي يظهر يكون به اسم المشروع الذي ترغب بتصديره .. اضغط next
5- يأتيك خيارين بأعلى المربع ... اختر create new keystore
6- اضغط browser وحدد المكان الذي تريد انشاء الملف به ... حاول ان لا يكون على القسم c حتى لا تفقد الملف بحاله عطب القسم c لنفرض انك حددت d:\mystores الان بخانه الاسم اكتب اسم الملف مثلا mykeystor واضغط save
7- عبئ حقلين password و confirm بكلمه السر التي ترغب بحمايه المخزن بها ... واضغط next

ستظهر هذه الشاشه وهي لانشاء المفتاح نفسه الموجود داخل المخزن


- الحقل الاول معبأ ... لا تغيره
- الحقل الثاني والثالث كلمه السر password يمكنك استعمال نفس كلمه السر الاولى وهو الافضل حتى لا تتشتت
- validity years مده الصلاحيه ... عبئ مثلا 110
- من القسم الاسفل على الاقل حقل واحد مطلوب ... عبئ الاسم وهو اسمك واذا اردت اكمال البقيه يجوز ذلك واعتقد انه افضل ...
ثم اضغط next

الان انهينا الاجراءات اللازمه لانشاء المخزن وملف المفتاح للتوقيع

الان يسألك عن المكان الذي تريد تخزين ملف ال apk به يفضل ان يكون داخل مجلد البرنامج نفسه
اختر المكان من خلال browse وحدد اسم الملف apk الذي تريده واضغط save
وعلى المربع الرئيسي اضغط finish

الان اصبح هناك ملف apk جاهز للتثبيت على الهاتف او الرفع على الماركيت او الرفع والارسال لاي مكان

في المرات التاليه ... عندما تختار export signed application ... لا تختار create new كما في الخطوه 5 بل اختار use existing 
ومن خلال الزر browse حدد مكان ملفك الذي انشأته d:\mystores\mykeystore
وضع كلمه السر و next ومن الشاشه التاليه 
افتح القائمه ستجد الاسم مره ثانيه اختاره واكتب كلمه السر الثانيه التي حددتها مسبقا وتابع الخطوات كما في الشرح اعلاه (لن تحتاج انشاء المفتح مره اخرى: الشاشه التي بها validity year لن تظهر مره ثانيه)

الدرس الخامس: [دورة تعليميه - الدرس 5] تعلم صنع تطبيقات الاندرويد بالتفصيل - شرح العناصر الرئيسيه وبرنامج جمع رقمين



السلام عليكم،

درس اليوم سيتطرق لشرح انواع العناصر objects الرئيسيه التي يمكن استعمالها لصنع التطبيقات
طبعا بعضها سيكون متشابه والذي يحدد ماذا نستخدم هو طبيعه عمل البرنامج مالوظيفه المطلوب تأديتها

بالاضافه لبرنامج بسيط في النهايه وظيفته جمع رقمين وعرض الناتج على الشاشه






TextView
هذا العنصر يمكنك من عرض نص معين للمستخدم دون ان يتمكن المستخدم من تعديله ويمكنك تعديله انت من خلال الكود اثناء تشغيل البرنامج وكذلك يمكن تعديله في وقت البرمجه

Button
كبسه زر، غنيه عن التعريف، يمكن ان تضع اي نص بها مثلا .. موافق .. الغاء .. خروج ... يمكن تعديل محتوى النص من البرنامج او وقت البرمجه

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

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

---------
في المجموعه الثانيه :
TextFields
هي مربعات نصيه نوعها الرئيسي يسمى EditText تمكن المستخدم من كتابه ما يريد ويكون عباره عن مدخلات لبرنامجنا
ويتفرع عنها انواع متعدده تكون للتسهيل بالعمل ... مثلا حقل النص من نوع password يظهر الكلام المكتوب به على شكل نجوم او نقاط سوداء لكي لا يشاهدها احد...
اما نوع Number مثلا فهو يحدد نوع المدخلات بالارقام فقط وذلك من خلال عرض لوحه مفاتيح الارقام فقط وبهذا يمنع المستخدم من ادخال حرف بدلا من الرقم.
والبقيه اتوقع واضحه من خلال الاسم ومن يواجه صعوبه بنوع يتفضل بالسؤال.

---------
المجموعه الثالثه:
Layouts
وهي عباره عن مستوعبات Containers ان صح التعبير تحدد سلوك العناصر السابقه على الشاشه من ناحيه مكان وجودها وترتيبها واحتلالها للمساحات...صراحه لست متمكننا منها كلها لكن سأشرح ما اعرف منهم:

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

RelativeLayout
يقوم هذا النوع بوضع كل عنصر بشكل نسبي لعنصر اخر .. مثلا تضع TextView وتضع حقل password وتخبره ان حقل كلمه السر تحت مربع TextView
وهكذا تبني التصميم بشكل معتمد على بعضه.

TableLayout
اي الجدول وهو عباره عن تقسيم الشاشه لجدول، صفوف واعمده ومن ثم تعبئه هذه الخلايا (الناتجه عن الصفوف والاعمده) بالعناصر المطلوبه
يلزم للعمل به اضافه TableRow به بعدد الصفوف المطلوبه ومن ثم البدء بالتعبئه

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

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


نأتي للبرنامج الان...
سيكون كما قلت جمع رقمين وعرض الناتج.. اذا المطلوب من البرنامج ما يلي:
1- اخذ مدخلات من المستخدم (رقمين)
2- اجراء عمليه الجمع عليهم
3- اعطاء مخرجات للمستخدم من خلال عرض الناتج على الشاشه
5- قد نضيف زر اضافي لمسح الخانات.

نبدأ:
انشئ مشروع جديد كما تعلمنا وسميه مثلا SumTwoNumbers، لتجنب المشاكل لمن يرغب باستعمال الملفات التي سأضعها هنا
ضع في خانه Package Name عند انشاء المشروع القيمه : com.ce4arab.sumNum
والباقي عبئه كما تحب

التصميم سيكون مربعين من نوع Number لكل رقم سيدخله المستخدم
ثم زر للجمع مكتوب عليه Sum وبعدها TextView لعرض الناتج بها وسيكون واجبكم المنزلي عمل زر المسح الذي سيفرغ مربعين ال Number من القيم التي بهما.

هذا سيكون ملف ال main.xml وهو الملف الذي سيحوي التصميم، سنستعمل layout من نوع linear وهو النوع الذي يكون مستعمل عند انشاء المشروع.
سنضيف له العناصر السابقه مرتبه تحت بعضها ، بالنسبه لل TextView الذي سيعرض النتيجه وللزر بعد اضافتهم للتصميم،
نعمل كليك يمين على كل واحد ونختار layout_width - fill parent هذا يعني ان العرض لهم هو ملئ الاب والاب هو الشاشه الخلفيه ستلاحظون الفرق عند تنفيذ هذه الحركه.
وهذا ملف التصميم النهائي:
كود PHP:
<?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"
    />
<EditText android:layout_height="wrap_content" android:layout_width="fill_parent" android:inputType="number" android:id="@+id/txtN1">
    <requestFocus></requestFocus>
</EditText>
<EditText android:layout_height="wrap_content" android:layout_width="fill_parent" android:inputType="number" android:id="@+id/txtN2"></EditText>
<Button android:layout_height="wrap_content" android:id="@+id/btnSum" android:text="Sum" android:layout_width="fill_parent"></Button>
<TextView android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceLarge" android:id="@+id/lblResult" android:text="0" android:layout_width="fill_parent"></TextView>
</LinearLayout>
الان نأتي للكود:
هذا هو الكلاس النهائي للفعاليه التي انشأها لنا ال ADT واسمها SumTwoNumbersActivit
كود PHP:
package com.ce4arab.sumNum;
import android.app.Activityimport android.os.Bundleimport android.view.Viewimport android.view.View.OnClickListenerimport android.widget.Buttonimport android.widget.EditTextimport android.widget.TextView;

public class 
SumTwoNumbersActivity extends Activity //متغيرات لكي يتم ربطها بالعناصر على التصميم
    
Button btnSum;
    
EditText txtN1txtN2;
    
TextView lblResult;
    
    @
Override
    
public void onCreate(Bundle savedInstanceState) {
        
super.onCreate(savedInstanceState);
        
setContentView(R.layout.main);
         
//عمليه الربط بين المتغيرات والتصميم ... لنتمكن من كتابه الكود والتحكم بها
        
btnSum = (ButtonfindViewById(R.id.btnSum);
        
txtN1 = (EditTextfindViewById(R.id.txtN1);
        
txtN2 = (EditTextfindViewById(R.id.txtN2);
         
//تحديد معالج الحدث عند الضغط على الزر ... المعالج نفسه مكتوب بالاسفل 
        
btnSum_actionListener btnSumLsnr = new btnSum_actionListener(this);
        
btnSum.setOnClickListener(btnSumLsnr);
    }
//onCreate()
     
}//CLASS

//معالج الحدث actionListeer  
class btnSum_actionListener implements OnClickListener{
    
SumTwoNumbersActivity adaptee;
    
    public 
btnSum_actionListener(SumTwoNumbersActivity a){
        
adaptee a;
    }
    
    @
Override
    
public void onClick(View v) { //متغيراتلاخذ الارقام من المستخدم
        
int num1=0;
        
int num2=0;
        
//اخذ القيم من مربعين النص في التصميم txtN1 . txtN2 ووضعهم في متغيرات هنا مع تحويلهم لارقام
//لان المدخلات من المستخدم تكون نصيه دائما حتى لو كتب رقما لذا يجب تحويلها من خلال ()Integer.parseInt
        
num1 Integer.parseInt(adaptee.txtN1.getText().toString());
        
num2 Integer.parseInt(adaptee.txtN2.getText().toString());
        
//عمليه الجمع وتخزين الناتح بمتغير جديد result
        
int result num1 num2;
         
// وضع قيمه result داخل TextView في التصميم والذي اسمه lblResult
        
adaptee.lblResult.setText(""+result);
    }    
}
//btnSum_actionListener  
** استعمال الرمز // وكتابه كلام بعده يسمى تعليقات comments تكون لتوضيح الكود والمترجم compiler يتجاهلها
يفضل ازاله التعليقات العربيه من الكود اذا واجهت مشاكل الوضع الصيحي ان يتم تلوينها بالاخضر عند نقلها للمحرر eclipse 

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

الدرس الرابع: [دورة تعليميه - الدرس 4] تعلم صنع تطبيقات الاندرويد بالتفصيل - تشغيل البرنامج على المحاكي



السلام عليكم،

نتابع الدروس معكم وسيكون الدرس الرابع عن كيفيه تشغيل البرامج التي نقوم ببرمجتها

يمكن لنا ان نشغل البرنامج بطريقتين:
- باستعمال المحاكي (هاتف اندوريد داخل الكومبيوتر)
- باستعمال هاتف حقيقي

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

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

باستعامل المحاكي:

اولا يتوجب عليك انشاء هاتف افتراضي لكي تشغله باستعمال المحاكي ومن ثم تشغل برنامجك عليه
يطلق على الهاتف الافتراضي AVD او Android Virtual Device اي جهاز الاندرويد الافتراضي
ويمكن انشاؤه كالتالي:

- من Window اختر Android SDK and AVD Manager
- اول خيار في القائمه على اليسار Virtual Devices
- اضغط New





والارقام كما يلي:
1- اسم الجهاز الافتراضي سميه اي اسم تحب
2- من هنا تختار اي نظام تشغيل او اي اصدار ترغب بأن يعمل على هذا الهاتف، تذكرون الانظمه التي اخترناها عند عمل تحديث لل ADT...
3- اذا اردت ان يحو الهاتف بطاقه ذاكره، تحدد هنا ان كان ملف او خيار الحجم Size، وتحدد الحجم الذي تريده... نحتاج هذه اذا كان البرنامج الذي تعمل عليه سيتدخل في بطاقه الذاكره سواء للكتابه عليها او القراءه منها ... يمكن ان تترك الخيار على Size وتحدد مثلا 50 ميجا ... (يمكن التعديل لاحقا)
4- هذه من التحديثات الجديده لا اعرف صراحه ما عملها
5- اعتقد هي لشكل الهاتف وشكل شاشته اذا كان يهمك الدقه في الصوره وقياسات الشاشه ..
عاده انا اختار HVGA.
6- هذه من الاضافات الجديده كذلك وهي لاضافه اشياء معينه للهاتف الافتراضي .. ربما ليكون العمل كأنه ببيئه هاتف حقيقي اكثر... صراحه لم اجربها بعد واذا ضغط new التي بجانبها ترى الخيارات الممكن اضافتها





- اضغط Create AVD
وهكذا اصبح الهاتف الافتراضي جاهز...
اغلق ال AVD Manager

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


- من قائمه Run اختر Run Configurations





اختر android application رقم 1 بالصوره
ثم اضغط ايقونه جديد رقم 2 في الصوره اعلاه
وبقيه الارقام كما يلي:
3- اسم هذا الاعداد اعطه اي اسم تريد.
4- من هنا تضغط browse وتحدد هذا الاعداد مرتبط لاي مشروع
5- من هنا Target تحدد اي هاتف افتراضي ستستعمل (من التي انشأتها مسبقا)
وهناك خيارين .. Automatic و Manual حيث لا يسألك كل مره عن اي هاتف تريد العمل عندما تضغط تشغيل. يعني تختار autiomatic وتضع اشاره صح بجانب الهاتف الافتراضي الذي تريد استعماله

اضغط apply
الان من قائمه Run اختر Run او اختصارها Ctrl+F11 او من شريط الادوات الزر الدائري الاخضر بداخله مثلث البيض (الزر الكبير وليس الصغير)

هنا يبدأ عمل المحاكي ويقوم بتبويت النظام كاملا للهاتف الافتراضي الذي حددته من الاعداد





انتظر حتى يكتمل التشغيل وتظهر شاشه فك القفل.





وبمجرد فتح القفل انتظر قليلا وسترى برنامجك على الهاتف .. واذا لم يعمل بشكل تلقائي يمكنك فتح قائمه البرامج والبحث عنه وتشغيله بنفسك... كأنك على هاتف حقيقي .. يكون اسمه HelloWorldCe4arab
كما اسميناه في الدرس السابق.




الان حاول الضغط على زر Change تلاحظ ان النص تغير، وبهذا يكون برنامجنا يؤدي عمله المطلوب

** اذا اجريت تعديلات على البرنامج فلا داعي لاغلاق المحاكي واعاده تشغيله.. فقط اعد الضغط على زر التشغيل من برنامج الايكليبس، فيقوم بتثبيت برنامجك على المحاكي مره ثانيه ويشغله.

عند الانتهاء اغلق المحاكي على زر X كأنك تغلق اي برنامج اخر.


نهايه الدرس واتمنى لكم الفائده

الدرس الثالث: [دورة تعليميه - الدرس 3] تعلم صنع تطبيقات الاندرويد بالتفصيل - التطبيق الاول



السلام عليكم،

نكمل من حيث بدأنا … اليوم سيكون اول برنامج لنا على الاندرويد مع شرح تفاصيله
وسنبدأ من انشاء مشروع جديد، وتعريف بالملفات الناتجه، ومن ثم تصميم الواجهه مع شرح ملف ال GUI بشكل اوسع ومن ثم الانتقال لمرحله الكود.

1- انشاء مشروع جديد:
افتح الايكليبس واختر كما في الصوره






ثم اختر android project كما في الصوره





اضغط next فيظهر المربع التالي:




حيث تمثل الارقام:
1 – اسم المشروع بالنسبه لبرنامج الايكليبس
2- اختر اصدار نظام التشغيل الذي ترغب ببناء البرنامج له والذي سيتم تشغيل البرنامج عليه اثناء العمل
3- اسم البرنامج الذي سيظهر عند تنصيبه على الهاتف
4- اسم الحزمه التي سيكون الكود بداخلها وله تسميه متداوله حيث يبدأ ب com ثم اسم مميز لك مثلا اسم شركتك او اسمك ثم اسم التطبيق، تفصل كل واحده نقطه . عن الثانيه، هذه تهدف لترتيب الكود ولكي تحصل لنفسك على حزمه مميزه لانه قد تنشء ملف له نفس الاسم لملف موجود مسبقا فعندما تريد الوصول له يكون باستعمال اسم الحزمه وبهذا تضمن انك تستعمل الملف الذي تريده، الحزم بالنهايه ستكون على شكل مجلدات وعند توليد ملف البرنامج APK ستكون كلها وحده واحده.
5- اذا وضعت اشاره صح فإن الايكليبس ينشئ لك اول شاشه او فعاليه كما ذكرنا بالدرس السابق وهذا نوع من اختصار الوقت والجهد، فمؤكد ان برنامجك سيحوي فعاليه، اصطلاحا تنتهي اسماء الفعاليات بكلمه Activity
ويفضل ان يكون اسمها يدل على عملها لكي تسهل عملك اذا زاد عدد الفعاليات... مثلا فعاليه تسجيل الدخول يكون اسم ملفها LoginActivity وهكذا...
6 – الحد الادنى المستعمل لاصدار ال SDK في العمل، يتم تعبئته تلقائيا عندما تحدد اصدار نظام التشغيل من نقطه رقم 2
7- اضغط انهاء

يقوم الايكليبس بتوليد وانشاء كافه الملفات الضروريه للمشروع ويضعها بترتيب معين
وكذلك ينشئ لك اول ملف للفعاليه التي طلبت انشاءها وكذلك ملف ال GUI الخاص بها
ويكون شكل الملفات وترتيبها كما في الصوره:




والارقام شرحها كما يلي:
1- مجلد src مجلد الكود المصدري الذي ستقوم بكتابته، تجد فيه عنوان رئيسي هو اسم الحزمه package الذي ادخلته عند انشاء المشروع com.ce4arab.helloworld وكذلك به اول ملف Java انشأه ADT بشكل تلقائي وهو للفعاليه الاولى التي طلبت انشاءها.
2- الملجد gen هو مجلد يقوم ال ADT بانشاء ملفات به بشكل تلقائي لا تعبث به ولا تغير شيء به نهائيا.
3- مجلد res وهو المجلد الذي يحوي اي مصادر غير الكود، مثل ما ذكرت سابقا: صور، اصوات، وغيرها، كذلك فهو يحوي مجلد layout وبداخله يكون كل ملفات XML التي تستخدم لانشاء شاشات ال الفعاليات من ناحيه التصميم GUI،
نشاهد به ملف main.xml وهو ملف ال GUI 
للفعاليه الموجوده حاليا HelloWorldCe4arabActivity.java
4- الملف AndroidManifest.xml هو ملف xml كذلك ومهم للغايه يكون به كل فعاليه يتم اضافتها وكذلك به معلومات عن الصلاحيات التي سيحتاجها النظام وسيحوي ايضا اشياء اخرى مهمه نذكر بعضها لاحقا.

بالجافا كل ملف يتم انشاؤه يحوي شيء يسما Class او فئه، هذا الكلاس هو وحده البناء الاساسيه للجافا من ناحيه كتابه الكود، يشترط ان يكون اسم الكلاس واسم الملف الموجود به متطابقين 100% اذا كان الكلاس من نوع الدخول public.

لنلقي نظره على ملف الفعاليه الموجود لدينا HelloWorldCe4arabActivity.java انقر عليه نقر مزدوج وسيظهر محتواه الذي تم توليده تلقائيا من قبل اداه ال ADT
كود PHP:
package com.ce4arab.helloworld;
 
  
import android.app.Activity;
  
import android.os.Bundle;
   
  public class 
HelloWorldCe4arabActivity extends Activity {
      
/** Called when the activity is first created. */
      
@Override
      
public void onCreate(Bundle savedInstanceState) {
          
super.onCreate(savedInstanceState);
          
setContentView(R.layout.main);
      }
  }  


**اول سطر هو اعلان ان هذا الملف موجود في الحزمه المذكوره.
package com.ce4arab.helloworld;

** السطور التي تبدأ بكلمه import تعني انه يتم استيراد كلاسات مكتوبه سابقا ليتم استعمالها هنا في هذه الفعاليه
وهذه الكلاسات سيم استيرادها من ال android SDK التي قمنا بتنزيلها ... من هنا نعرف اهميتها لانه هي مثل المواد الخام الموجوده في المصنع وسنبدأ باستغلالها لتصنيع برامجنا.

** السطر
public class HelloWorldCe4arabActivity extends Activity {
هو سطر يحدد بدء انشاء الكلاس الخاص بهذه الفعاليه، محدد الدخول له public اي عام يعني يستطيع اي كلاس من اي حزمه الوصول له، وكلمه class هي كلمه مفتاحيه keyword تخبر المترجم الـ compiler اننا ننشئ كلاس جديد... واسمه HelloWorldCe4arabActivity وهو مطابق لاسم الملف.. لاحظو معي ..

** اما extends فهي كلمه مفتاحيه كذلك تخبر المترجم ان هذا الكلاس HelloWorldCe4arabActivity سيقوم بوراثه كلاس اخر موجود واسم الكلاس هو Activity

** الوراثه: في اللغات التي تدعم ما سيمى البرمجه الكينونيه او Object Oriented ويرمز لها احيانا O.O.
مبدأها يقوم على كتابه كلاسات ثم تداخلها معا، ولا داعي لاعاده الكتابه من الصفر دوما، بل تستعمل كلاس موجود سابقا وترثه، والوراثه تكون لكل الخصائص والوظائف التي يملكها الكلاس الاب، الا التي تم تعليمها انها غير قابله للوراثه اثناء فتره برمجه الكلاس الاب، ويكون هناك اسباب منطقيه لا داعي ان نخوض بها لمنع وراثه وظيفه معينه او خاصيه معينه.

** السطر
public void onCreate(Bundle savedInstanceState) {
هو سطر يخبر المترجم اننا نريد انشاء وظيفه (function, method) وهي مجموعه من الاكواد تكتب داخل مكان واحد محصوره ب {} ويتم اعطاؤها اسم، ويتم استدعاؤها وقت الحاجه دون اعاده كتابه الكود مره ثانيه، او تكون وظيفه اساسيه، مثل هذه الحاله حيث ان كل فعاليه يشترط ان يكون بها هذه الوظيفه onCreate لكي يتم مناداتها عند انشاء الفعاليه وقت التشغيل.
اذا لدينا وظيفه اسمها onCreate محدد دخولها public وتأخذ مدخلات من نوع Bundle واسم المدخل savedInstanceState
كلمه void هنا تعني ان هذه الوظيفه لن تقوم بارجاع شيء او قيمه بل ستكون نتيجه استدعاؤها عمليه تنفذها فقط ولن ترجع قيم.

** السطر
super.onCreate(savedInstanceState);
يتم مناداه وظيفه اخرى اسمها onCreate كذلك لكنها موجوده في الكلاس الاب لهذا سبقها كلمه super اي الكلاس الاعلى الذي تم وراثته وبهذه الحاله هو Activity ... تتذكرون الجمله extends Activity

** السطر
setContentView(R.layout.main);
يتم مناداه وظيفه اسمها setContentView وهي موجوده بالكلاس الاب كذلك، 
ويتم تمرير مدخلات لها وهي R.layout.mainهذه مأخوذه من الملف المولد تلقائيا في المجلد gen اذا كنتم مركزين معي هناك ستجد ملف اسمه R.java وهو ملف يتم بناؤه تلقائيا كلما اضفت شيء للمشروع ومن خلاله تستطيع الوصول للعناصر وبعض الملفات ... فهنا R.layout,main ترمز لملف ال main.xml الموجود في مجلد ال layout الذي تكلمنا عنه سابقا.

اذا هذه الفعاليه سيتم انشاؤها، ووضع التصميم لها باستعمال الملف main.xml الذي تم بناؤه كذلك وبهذه الطريقه تكون اول شاشه ظاهره على الموبايل عند تشغيل البرنامج.

الان دعونا نلقي نظره على ملف main.xml عند النقر المزدوج على الملف سيظهر كما الصوره




كما تشاهدون تظهر شاشه الفعاليه وهكذا ستظهر على الهاتف، اذا لاحظتم بالاسفل هناك مربعين
Main.xml و Graphical Layout
ما تشاهدوه الان اذا كان شاشه سوداء وبها جمله بالاعلو هو Graphical Layout
واذا ضغطتم على main.xml سيظهر الكود المصدري للملف وهو xml الذي شرحناه بالدرس السابق
كود PHP:
<?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>


اعتقد ان الملف اصبح مألوف لكم...
يتم استعمال layout من نوع linear له خصائص اذكر منها
android:layout_width="fill_parent" اي انه يملأ المكان الموجود به من ناحيه العرض وكذلك من ناحيه الارتفاع android:layout_height="fill_parent"

TextView هي كما قلت مثل ليبل label يتم عرض معلومه او عنوان به وهذه هي ما يظهر على الشاشه السوداء عند التحول لنظام العرض ال graphical
لها خصائص كذلك، والجديد هنا هو الخاصيه android:text وهي القيمه التي تكتب بها
للوقت الحالي تجاهلو ما كتب بها ... يمكنكم الان تعديل ما داخل ال "" ليعرض اي نص تريدونه مثلا:

android:text="my name is Yazan"

الان لو عدنا لنظام العرض ال graphical وقمنا بالضغط بالماوس على المربع بأعلى الشاشه السوداء والذي تغيرت قيمته (اذا كنتم قد غيرتم ما كتب به) الان بعد ان نقرت عليه مره واحده انظر لليمين ستشاهد اطار تأكد ان تختار من اعلى الاطار الخيار properties والذي سيحوي خصائص هذا العنصر...

شخصيا لا اعرف كل شيء فيها لكن يهمنا منها مثلا id حيث هذا هو الاسم المميز لهذا العنصر والذي من خلاله نستطيع استعماله عن طريق ملف الكود java
وهنا كذلك تجد الخاصيه text والتي قمنا بتعديلها من داخل الملف .. يمكن تعديلها من هنا ايضا
وانصح باستعمال هذه الطريقه بدل من عرض ملف ال xml والتعديل به بشكل يدوي تجنب لحدوث خطأ الا اذا الحاجه لتعديل يدوي..... مع الحذر الشديد.

الان حدد العنصر واعمل عليه كليك يمين right click واختر Edit Id واكتب بها lblTitle

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

سنضيف زر button وهو موجود على اليسار قم بسحبه وافلاته فوق الشاشه السوداء
اضغط عليه وكليك يمين و Edit Id واكتب btnChange و OK

لتغير النص المكتوب داخل الزر اختر الزر ثم ابحث بالقائمه على اليمين عن الخاصيه text واكتب بها Change واضغط Enter
شكر لكل من sma666 و fartoot321 على التنبيه.

الان بعد ان اعطيت قيمه لل ID فان ال ADT يعيد بناء الملف R.java ويضيفها له
وهنا يأتي دور الربط بين الكود والتصميم...

*** نعود لملف HelloWorldCe4arabActivity.java :

*** يلزمنا للعمل:

- تعريف متغيرات تؤشر على الbutton وال textView الذين انشأناهما سابقا
- نحتاج لانشاء كلاس لكي يتعامل مع ضغطت الزر اي انه عندما يضغط احد على الزر ... ماذا يحدث؟
هذا الكلاس سيكون actionListener الخاص بالزر، ومن صفاته انه يستعمل كلاس اسمه OnCLickListener وهذا الكلاس بدوره يعالج عمليه الكليك على الزر او اللمس بحالتنا.

طريقه اضافه معالج الحدث او action listener لها عده طرق، والطرقه التي سأستعملها اعتبرها جيده وعامه ومرنه يمكنك استعمالها لعده حالات ... قد تكون طويله قليلا وهناك طرق اقصر منها لكنها المفضله لدي.

ومن ثم سنضيف الكود الخاص بعمل الزر .. وفي حالتنا هذه سنعمل كود يؤدي لتغير قيمه lblTitle لتصبح قيمتها الجمله Hello Android!
*** الشرح:

Button btnChange;
TextView lblTitle;
متغيرات ستقوم بالتأشير على كل من ال button وال textview

btnChange = (Button) findViewById(R.id.btnChange);
lblTitle = (TextView) findViewById(R.id.lblTitle);
اسناد قيمه للمتغيرين لكي يؤشرو على العناصر من شاشه التصميم
باستعمال الوظيفه findViewById() والتي تحضر ال object من خلال اسمه، ونحصل الاسم من خلال الكلاس المولد تلقائيا R.java

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


btnChecng_onclickListener btnChngeLsnr = new btnChecng_onclickListener(this);
btnChange.setOnClickListener(btnChngeLsnr);


هذه الجمله تحدد ان المعالج للحدث الخاص بهذا الزر سيكون object وسيكون من كلاس اسمه btnChecng_onclickListener وقد انشأنا المتغير btnChngeLsnr واسندناه لهذه المهمه.

واخر فقره .. 
من عند class btnChecng_onclickListener implements OnClickListener{ والى نهايه الملف، هي المكلاس المعالج للحدث، والذي ينفذ الوظيفه 
onClick(View v) كلما تم لمس الزر وبداخلها كتبنا الكود الخاص بوضع نص داخل المتغير lblTitle والذي بدوره يؤشر على العنصر على شاشه التصميم.

الملفات النهائيه بالمرفقات

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

الى لقاء قريب في درس جديد ان شاء الله

الدرس الثاني: [دورة تعليميه - الدرس 2] تعلم صنع تطبيقات الاندرويد بالتفصيل - بنيه التطبيق ومكوناته

السلام عليكم،

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

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

** يمكن ان نقسم مكونات البرامج الهواتف الذكيه الى ثلاث اقسام:
1- الواجهات المرئيه وتسمى Graphical User Interface ويرمز لها GUI وهي الازرار ومربعات ادخال النص والقوائم المنسدله وما الي ذلك...

2- الكود البرمجي، وهي طريقه التحكم بهذه الواجهات والعناصر وتطبيق المنطق الذي نرغب به ليؤدي البرنامج غرضه، ممكن ان نقول ان الواجهات هي سياره وان الكود البرمجي هو الشخص الذي يقود السياره ويتحكم بها.

مثلا لو اردنا عمل برنامج يجمع رقمين:سيكون لدينا مربعين نص و زر، هذه هي الواجهه. ثم الكود البرمجي هو الذي سيقوم بالعمل ... يأخذ الرقم الاول ويجمعه للرقم الثاني ويظهر النتيجه للمستخدم. كل هذا يحدث عندما يضغط المستخدم الزر.

3- المصادر الخارجيه او ما يسمى resources وهي اي شيء خارجي تستعمله في برنامجك... مثل الصور، ملفات صوتيه، ملف خط مثلا او ملف مكتبه jar وهذه معروفه بالجافا وهي ما يقابل ملف dll ببرمجيات الويندوز مثلا ال VB فيمكن ان تستعمل ملف jar به وظيفه معينه بدون ان تضطر لاعاده العمل.

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

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

من خلال بيئه العمل ايكليبس وبفضل ال ADT الذي تحدثت عنه، عمليه تصميم ال GUI سهله ان شاء الله، وكذلك كتابه الكود الخاص بها، كما قلت كل هذا يتم من خلال برنامج واحد الايكليبس.

نأتي للقسم الاول: GUI
الواجهات ببرامج الاندرويد يتم تصميمها بملف XML 
ولمن لا يعرف الـ XML هو ليس لغه برمجه بل يسمى data structure اي بنيه بيانات وطريقه لتمثيل بيانات معينه بطريقه محكومه وهذا مثال بسيط عليه:



** مثلا نريد تمثيل قائمه من الاشخاص لكل واحد اسم، بريد الكتروني وعمر سيكون ملف ال XML كما يلي


كود PHP:
<?xml version="1.0" encoding="UTF-8"?> 
<myList> 
<person> 
<name>ahmad</name> 
<email>ahmad@someemail.com</email> 
<age>25</age> 
</person> 
<person> 
<name>khaled</name> 
<email>khaled@someemail.com</email> 
<age>18</age> 
</person> 
</myList>

وتستمر القائمه ويستمر بناء الملف ويمكن اضافه اي قدر تريده من الاسماء شرط ان تلتزم بالبنيه
والفكره لل XML هي انه لا يوجد له قواعد او ما يعرف بلغات البرمجه بال syntax اي انه لا يجبرج على اختيار كلمه معينه لكن له قواعد تلتزم بها اثناء بناء الملف.

شرح بسيط:

كود PHP:
<?xml version="1.0" encoding="UTF-8"?>

هي الترويسه او header وهذه لكي تخبر اللغه او النظام الذي سيقوم بقراءه الملف عن معلومات مثل اي اصدار xml نستعمل وما هوالترميز encoding الذي نستعمله لانه قد يحوي كلمات عربيه او صينيه وهكذا

كل اشاره <> تسمى تاغ tag وتسمى باسم اول كلمه بها
مثلا تاغ العمر age tag <age>

<myList> هي العنصر الرئيسي بالملف root node
<person> هي ابن او child لـ mylist
<name> ، <email> ، <age> هي عناصر elements او ابناء لل person
الان لا يوجد قانون او قاعده تجبرني على انتقاء هذه الكلمات مثلا،
ممكن استعمل بدل من <myList> ان استعمل <myFriendsList>

نلاحظ وجود تاغ tag مشابه بالاسم ولكنه يحوي / هذا يسمى close tag او تاغ الاغلاق
وهذا من شروط ال xml يجب عليك ان تغلق كل التاغات التي تفتحها، وان تحافظ على ترتيب الفتح والاغلاق

مثلا

كود PHP:
<person> 
<name>ahmad</name> 
<email>ahmad@someemail.com</email> 
<age>25</age> 
</person> 


لاحظو معي ترتيب الفتح والاغلاق، فتح person وبداخله:
فتح name وقيمه له ثم اغلاق name
فتح email وقيمه له ثم اغلاق email
فتح age وقيمه له ثم اغلاق age
اغلاق person


لا يجوز مثلا عمل هذا


كود PHP:
<person> 
<name>ahmad</person> 
</name> 


ترتيب الفتح يجب ان يكون مطابق للاغلاق وهذا يسمى nest او nesting
يعني يجب ان يكون ال nesting صحيح.

الان يمكن ان تكون القيم بداخل ما يسمى attribute وليس داخل عناصر elements كما في المثال السابق
فتصبح مثلا:


كود PHP:
<myList> 
<person name="ahmad" age="18" email="ahmad@someemail.com"></person> 
<person name="khaled" age="22" email="khaled@someemail.com"></person> 
</myList> 


هذه افضل من ناحيه الحجم وكميه الكتابه، اذا كنت تبني ملف ال xml الخاص بك لك الحريه بالانتقاء اما اذا كنت تبني ملف xml سيتم استعماله من قبل نظام اخر يجب ان تلتزم بقوانين هذا النظام.

شيء اخر ممكن ان يكون تاغ الاغلاق عباره عن / بنهايه التاغ الاول بدون اعاده كتابته، مثال:


كود PHP:
<person name="ahmad" age="18" email="ahmad@someemail.com"></person> 
يصبح 
<person name="ahmad" age="18" email="ahmad@someemail.com" /> 


لاحظو معي اضافه / فقط والاستغناء عن </person> كامله. هذا جائز ايضا.

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

ويأتي الجزء الثاني وهو البرمجه، ويكون بملف مختلف عن هذا الملف، ويكون بلغه ال Java لهذا نحتاج لربط العناصر الموجوده في ملف التصميم GUI مع الملف الذي يحوي الكود لكي تستطيع التحكم بهذه العناصر، والكتابه بها او اخذ قيمه منها او عرض صوره معينه عليها وهكذا...
هذا الربط يكون بنفس ملف البرمجه من خلال كود معين سنتطرق اليه في وقتها.

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

كل فعاليه تحتاج ملف برمجه وملف GUI، ملف البرمجه يكون بلغه Java وملف ال GUI يكون مكتوب على شكل ملف XML الذي شرحناه الان.



فيما يلي ملف xml بسيط لشاشه (او فعاليه) او activity لبرنامج اندرويد بسيط:


كود PHP:
<?xml version="1.0" encoding="utf-8"?> 

<TableLayout 
android:id="@+id/TableLayout01" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:stretchColumns="1" 

<TableRow> 
<TextView 
android:text="User Name" 
android:padding="3dip" /> 

<EditText android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/txtLoginUsername"> 
</EditText> 

</TableRow> 

</TableLayout>

لا تخافو ... هذا كله يكون جاهز من الايكليبس، المهم نحاول نفهمه ونفرق بين التاغات الموجوده.

<?xml version="1.0" encoding="utf-8"?> هو الترويسه التي تكلمنا عنها
<TableLayout هو تاغ لشيء يسمى layout وهو معروف بالجافا حيث انه يحدد الطريقه التي سيتم عرض العناصر بها على الشاشه من ناحيه ترتيبها واحتلالها للمساحات... هنا نستعمل واحد نوعه table
وهذا تاغ البدايه له.

android:id="@+id/TableLayout01" 
android:layout_width="fill_parent" 
هذه عباره عن خصائص او attributes للتاغ السابق... لا تقلقو كلها تأتي جاهزه لن نكتب بها شيء ربما نغير كلمه او اثنتين لكن الملف الرئيسي يتم بنائه بشكل سهل جدا.

سوف اقوم بتجاهل بعض التاغات الان وسأشرحها بوقت لاحق ... لنأخذ هذا الان <TextView
هو تاغ يعني ان هناك شيء اسمه textView سيكون ظاهر على الشاشه وهو عباره عن مربع يمكن الكتابه به وقت البرمجه او من خلال الكود فقط ولا يمكن للمستخدم ان ينقر عليه ويكتب من لوحه المفاتيح، فهو يكون لوضع عنوان لشيء ما ... "مثلا اسم المستخدم" ويكون بجانبه عنصر اخر هو مربع نص لكي ينقره المستخدم ويكت به الاسم، اي انه شيء للتوضيح والدلاله.

التاغ <EditText هو مربع نص يمكن للمستخدم الكتابه بداخله من خلال لوحه المفاتيح، ويكون لاخذ مدخلات من المستخدم لكي نعالجها ببرنامجنا.

لاحظو معي كافه الاغلاقات للتاغات موجوده وبالترتيب واخر شيء اغلاق التاغ 
الرئيسي وهو تاغ الـ </TableLayout>
*** هناك قاعده بسيطه لترتيب الفتح والاغلاق وهي: اول تاغ تفتحه هو اخر تاغ تغلقه وهكذا... لاحظو ان اول تاغ تم فتحه هو <TableLayout واخر تاغ تم اغلاقه هو </TableLayout> وبداخلهما كل التاغات الاخرى.

سأقف هنا في هذا الدرس، سيكون الدرس التالي نظره تفصيليه اكثر على ملف GUI ال XML حتى نفهم كل شيء يهمنا به وبعدها ننتقل الى ملف الكود الذي سيشغل البرنامج.

قد اكون تكلمت كثيرا عن ال XML هنا ولكنه شيء مهم برأيي لانك بالمستقبل ستبني واجهات قد تكون معقده قليلا فإذا لم تفهم بشكل جيد البنيه للملف وقواعد الكتابه به، لن تستطيع انجاز عملك بسهوله

والى درس قادم ان شاء الله،