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

ليه بنعمل Cast

[alert heading=”تنبيه (14/1/2016)” color=”#d77330″ close=”true” style=”” id=”” class=””]هذا المقال مكتوب باللغة العامية المصرية .. وبناءا على استفتاء متابعين هنديوير اخذنا قرار بالكتابة باللغة العربية الفصحى .. لذلك نعتذر ان كان هناك بعض المصطلحات الغير مفهومة ويمكنك الرد بتعليق اذا واجهتك صعوبة فى أحد المصطلحات .[/alert]

من البداية خالص أول ما بدأت تتعلم الأندرويد وكنت فرحان انك عملت TextView أو Button ظاهر على الشاشة وبتقدر تتعامل معاه بكود الجافا لكن ياترى ليه لما بنيجى نعمل findViewById  ليه لازم نعمل نفس اسم الشىء الى معرفينه بين قوسين يعنى لو بتعرف Button جديد بتقول

Button btn = findViewById(R.id.mybutton);

لكن بتلاقى الأندرويد ستوديو بيجبلك خط أحمر ويقولك لازم تعمل Cast فبتعمل Cast وبيبقى الكود كالاتى :

Button btn = (Button) findViewById(R.id.mybutton);

والسؤال هنا ايه هو الـ Casting و ليه بنعمل Cast أساسا

rt

يعنى ليه مينفعش يقبل findViewById من غير ما تعمل Cast  ؟

الموضوع ده بقى له علاقة بموضوع الوراثة فى الجافا  ومبدأ الـ Cast مش بس موجود فى جافا بل فى لغات تانيه كتير  وده الى هنتكلم فيه دلوقت

مدخل إلى الـ Casting 

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

تخيل دلوقت إنى بعمل تطبيق عن الأشكال الهندسية  عندنا Class اسمها Shape الكلاس دى فيها مجموعة Attributes ومجموعة من  الـMethods  الخاصة بالأشكال العامة   لو عاوز أعمل Shape جديد بكل بساطه فى أى كلاس تانى فى التطبيق هعمل كده

 Shape shape = new Shape();

مفيش أى مشكلة خالص فى الكلام ده والعملية بسيطه وتمام

هعمل بقى  كلاس اسمها Circle وهتورث من الـ Shape

 public class Circle extends Shape{
     ....................
 }

وهنفتترض بقى انا عملت كده  مع Triangle ومع Square و اى شكل بقى أنا حابب أعمله طالما شكل هخليه يورث من Shapes علشان استفيد من الـ Method الى عملتها فى Shape  وتنفع فى كل الأشكال

 

دلوقتى بقى انا فى أى كلاس وليكن كلاس Main مثلا جيت حابب أعمل Circle جديدة والمفروض انى هعملها كالاتى :

 Circle circle = new Circle();

طيب هل لو أنا عملت كده زى السطر الى جاى ده هيبقى صح ولا غلط ؟

 Shape cricle = new Circle();

الإجابة صح

لأن الـ Circle بتورث من الـ Shape وبالتالى فالدائرة هى شكل ينفع أمسكها بـ reference من النوع Shape زى ما عملت كده عرفت إن فيه Shape  اسمه circle وهو عباره عن new Circle  دائرة جديدة والى حصل ده يعتبر upcasting يعنى مسكت أوبجكت بـ reference من نوع أبوه الا وهو الـ shape   لحد دلوقت كده تمام لكن ماذا لو العكس  يعنى أعرف new Shape وأمسكه بـ reference دائرة زى كده مثلا

 Circle circle = new Shape();

كده الموضوع اختلف لان الى فات كنت بمسك الدائرة على أنها شكل   دلوقت هل ينفع أمسك الشكل على أنه دائرة ؟  مهو هو شكل لكن منعرفش بقى ممكن يكون دائرة أو  يكون مربع مينفعش كده أجى أمسكه بدائرة وخلاص لذلك اجباريا لازم اعمله cast من النوع الى عاوز امسكه  ويبقى كالاتى علشان يبقى صحيح

 Circle circle = (Circle) new Shape();

افرد بقى جيت أمسك شكل مش صحيح وعملتله Cast يعنى مثلا جيت وروحت كاتب إن الدائرة هتمسك مربع  كالاتى :

 Circle cricle = (Circle) new Square();

حتى مع إنى عامل كاست لكن ده غلط وأول ما اشغل البرنامج هتلاقى Exeption جميل كده اسمه ClassCastExeption

كده تمام عرفنا بما إن الشكل ده شىء عام  وإن الدائرة عبارة عن شكل فينفع أمسك الدائرة بواسطة شكل (يسمى بالـ  upcasting) لكن مينفعش امسك الشكل بواسطة الدائرة الا لما اعمله cast لدائرة  (يسمى بالـ downcasting)

الـ Casting فى الأندرويد 

نرجع بقى للأندرويد الى اتكلمنا عنه فى أول المقال

دلوقت كل المكونات الى بتتعرض عالشاشة زى الـ TextView أو Button بتورث من الـ View فالـ View هنا فى الأندرويد زيه زى الـ Shape كده حاجه عامه منظر وخلاص  أما الـ Button نوع معين من المناظر والـ TextView كذلك لذلك لما باجى استخدم ميثود findViewById  بترجع View وأنا هستقبله فى Button مثلا أو فى TextView زى ما كنت بستقبل الـ Shape فى Circle

لا بد أعمله Cast

أفتح الأندرويد ستوديو كده وحاول تكتب

 View v = new Button(this);

هتلاقى تمام مفيش اى مشاكل خالص

أما تعالى بقى اكتب

 Button b = new View(this);

هتلاقيه حطلك خط أحمر تحت الكود وبيقولك لازم تعمل Cast ويبقى الكود كده

 Button b = (Button) new View(this);

 

طبعا this هنا بنحطها علشان الـ Context لو متعرفش ليه حطناها ممكن تقرأ موضوعنا ما راء الـContext
طيب إذا كان الموضوع كده بقى ليه مش أريح نفسى واستقبل نتايج findViewById   فى View وخلاص بدل ما اعمل button او textview واقعد اعمل كاست  ؟

الإجابة انك لما بتعمل upcasting وتستقبل حاجه من النوع sub زى الـ Button فى refference من النوع Super فبيبقى متاح ليك تستخدم الـ Methods العامة بتاعة الـ Views لكن الـ Method الخاصة بالـ النوع متقدرش تستخدمها

مثال توضيحى :

افتح دلوقت الأندرويد ستوديو وجرب تستقبل findViewById تجيب بيها TextView وامسكها بـ View  زى كده مثلا

View text = findViewById(R.id.mytextview);

تعالى بقى تحته وحاول تستخدم setText مثلا علشان تغير النص  هتلاقى ان text.setText غير متاحة لأنه هنا الشىء الممسوك فى text عباره عن view ملوش دعوة بقى ده TextView ولا Button لذلك لازم تعرف وتعمل Cast علشان تقدر تستخدم الـ Methods الخاصة بالـ Button أو الـ TextView أو أى مكون أخر.

 

بس كده ياسيدى .

 

 

 

السابق
ما وراء الـ Context
التالي
كود أسرع باستخدام الـ Live Templates فى أندرويد ستوديو

31 تعليق

أضف تعليقا

  1. المهدي قال:

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

    1. Hendiware قال:

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

  2. Omar قال:

    شرح ممتاز جداً، بارك الله فيك و جزاك الله كل خير يا طيب.

    1. Hendiware قال:

      وجزاكم ياعمر شكرا على زيارتك للمدونة ويسعدنا إن الموضوع عجبك ^_^

  3. Emra قال:

    استمروا هكذا بارك الله فيكم

    1. Hendiware قال:

      إن شاء الله هنستمر شكرا لزيارتك

  4. youssef قال:

    ارجو ان تشرح بالعربية الفصحى لاني لا افهم العامية
    جزاك الله خيرا

  5. Muhammad Mustafa قال:

    عاش

    1. Hendiware قال:

      منور المدونة ياسيد مصطفى

  6. waleed قال:

    أسلوب رائع اوي اوي ياريت تستمر وتكون منظمة …جزاك الله خيرا

    1. Hendiware قال:

      إن شاء الله هنستمر ومبسوطين انه عجبك
      شكرا لتعليقك

  7. عبدالله النجار قال:

    شرح ممتاز استمر

    1. Hendiware قال:

      شكرا لك على الدعم صديقى عبدالله ^_^ نورت المدونة

  8. Mohamed Shawky Salah قال:

    شرح وافٍ
    استمر…. وفقك الله لما يحب ويرضى

    1. Hendiware قال:

      إن شاء الله صديقى
      ربنا يوفقنا جميعا
      شكرا لتعليقك

  9. Mostafa Flash قال:

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

    1. Hendiware قال:

      إن شاء الله قريب هنشوف تطبيق وهنعمل كده

  10. Mostafa Flash قال:

    جهد كبير وجميل

  11. شرح ممتاز اتمنى الاستمراريه والهجه العميه جيده وفقك الله

  12. Alaa قال:

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

  13. محمد قال:

    جزاك الله خيرا

  14. احمد قال:

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

  15. محمد ابو ساجد قال:

    شرح اكثر من رائع …. بالتوفيق ان شاء الله.. وجزاكم الله خيرا

  16. Abdallah J.Murad قال:

    شكرا على الشرح الممتاز
    بالتوفيق
    إستمر 🙂

  17. omnyyah قال:

    صراحه الكاتب هذا مبدع لو عنده كتاب اشتريته ولو في مجال للتبرع للموقع كمان ياليت
    شرح واضح ومفهوم جدا
    الله يعطيكم العافية ويجزاكم خير

  18. saruna قال:

    chokran ktiiiir istemir

  19. timelancer قال:

    شكرا على الشرح

  20. Mohamed Raafat قال:

    عاش بجد مدونة جميلة

  21. alaa zyoud قال:

    موقع رائع و شروحات ممتازه

اترك تعليقاً

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