Académique Documents
Professionnel Documents
Culture Documents
ﻣﻠﺨﺺ اﻟﺪروس
21 INHERITANCE 27أﺳﻠﻮب اﻟﺘﻮرﻳﺚ 1 1ﻗﻮاﻋﺪ ﻋﺎﻣﺔ ﻓﻲ ﻛﺘﺎﺑﺔ ﻛﻮدات XML
22 RED LINES 28اﻟﺨﻄﻮط اﻟﺤﻤﺮاء 3 2ﻋﻨﺎﺻﺮ اﻟﻌﺮض وﻋﺮض اﻟﺘﺨﻄﻴﻂ
22 29ﻣﺘﻼزﻣﺔ اﻹﺣﺘﻴﺎل IMPOSTER SYNDROME 3 3ﻣﺜﺎل ﺗﻮﺿﻴﺤﻲ ﻟﻮزن اﻟﺘﺨﻄﻴﻂ
22 30اﻟﺤﺼﻮل ﻋﻠﻰ أرﻗﺎم ﺳﺎﻟﺒﺔ ﻓﻲ ﺟﺎﻓﺎ 5 4اﻟﺘﺨﻄﻴﻂ اﻟﻨﺴﺒﻲ واﻹﺳﻢ اﻟﻤﻌﺮف ID
23 INTENT 31أﺳﻠﻮب اﻟﻤﻘﺼﺪ أو اﻟﻮﺟﻬﺔ 6 5ﻣﺜﺎل ﺗﻮﺿﻴﺤﻲ ﻟﻠﺘﺨﻄﻴﻂ اﻟﻨﺴﺒﻲ
25 32اﻟﺘﻨﺴﻴﻘﺎت واﻟﺴﻤﺎت STYLES & THEMES 7 6اﻟﻬﻮاﻣﺶ واﻟﺤﺸﻮ MARGINS & PADDINGS
26 MAINFEST.XML 33ﺷﺮح ﻣﻠﻒ اﻟﻮاﺟﻬﺔ 8 7ﺧﻄﻮات ﺗﺼﻤﻴﻢ واﺟﻬﺔ اﻟﺘﻄﺒﻴﻖ
27 ALTERNATIVE RES. 34اﻟﻤﻮارد اﻟﺒﺪﻳﻠﺔ 8 8اﺧﺘﺒﺮ ﻧﻔﺴﻚ -ﺗﺤﺪﻳﺪ ﻧﻮع اﻟﺘﺨﻄﻴﻂ
29 CLASS TYPES 35أﻧﻮاع اﻷﺻﻨﺎف 9 9ﺗﻤﺮﻳﻦ ﻋﻠﻰ اﻟﺘﺨﻄﻴﻂ اﻟﻨﺴﺒﻲ
30 EVENTS LISTENER 36ﻣﺴﺘﻤﻊ اﻷﺣﺪاث 10 10ﻣﻨﺎﻗﺸﺔ ﺣﻮل اﻷداة CONSTRAINT LAYOUT
31 ARRAYS, ARRAYSLIST 37اﻟﻤﺼﻔﻮﻓﺎت 11 11ﻛﻴﻒ ﺗﺨﺘﺎر ﺑﺮﻣﺠﺔ واﺟﻬﺔ اﻟﺘﻄﺒﻴﻖ API
33 38اﻟﺤﻠﻘﺎت اﻟﻤﺴﺘﻤﺮة WHILE, FOR LOOPS 11 12ﻗﻮاﻋﺪ إدراج اﻟﺼﻮر ﻟﻠﺘﻄﺒﻴﻖ
34 MEMORY RESOURCES 39ﻣﻮارد اﻟﺬاﻛﺮة 12 13ﻣﻘﺪﻣﺔ ﺑﺮﻣﺠﺔ ﻣﻠﻔﺎت ﺟﺎﻓﺎ
34 VIEW RECYCLING 40ﻋﻨﺼﺮ إﻋﺎدة اﻟﺘﺪوﻳﺮ 12 14ﻣﺜﺎل رﺑﻂ ﻋﻨﺼﺮ واﺟﻬﺔ ﺑﻜﻮدات ﺟﺎﻓﺎ
35 41ﻫﻞ ﺗﺤﺘﺎج إﻟﻰ ﻋﻨﺼﺮ إﻋﺎدة اﻟﺘﺪوﻳﺮ؟ 13 COMMENTS 15ﻗﻮاﻋﺪ ﻛﺘﺎﺑﺔ اﻟﻤﻼﺣﻈﺎت
36 CUSTOM CLASS 43ﺻﻨﻒ ﻣﺨﺼﺺ 15 17اﻟﻜﻠﻤﺎت اﻟﻤﻔﺘﺎﺣﻴﺔ اﻟﻤﺤﺠﻮزة KEYWORDS
38 44ﺧﻄﻮات اﻟﺘﻌﺪﻳﻞ ﻋﻠﻰ ﺗﻄﺒﻴﻖ 15 DEBUGGING 18ﻛﻴﻔﻴﺔ ﺗﺼﺤﻴﺢ اﻷﺧﻄﺎء
41 MEDIA PLAYER 45ﻣﺸﻐﻞ اﻟﻮﺳﺎﺋﻂ 16 VARIABLES SCOPE 19ﻣﺠﺎل اﻟﻤﺘﻐﻴﺮات
44 ACTIVITY CYCLE 48دورة ﺣﻴﺎة اﻟﻨﺸﺎط 17 22ﺷﺮح اﻟﻄﺮق وﻛﻴﻔﻴﺔ اﺳﺘﺨﺪاﻣﻬﺎ Methods
45 49ﺗﺮﻛﻴﺰ اﻟﺼﻮت و AUDIOMANAGER 18 23ﺷﺮح ﻣﻠﻔﺎت وﻣﺠﻠﺪات اﻷﻧﺪرﻳﻮد اﺳﺘﻮدﻳﻮ
47 TOUCH FEEDBACK 50اﻹﺳﺘﺠﺎﺑﺔ ﻟﻠﻤﺲ 19 24ﻛﻴﻔﻴﻚ رﺑﻂ اﻟﻤﻮارد ﺑﻤﻠﻔﺎت ﺟﺎﻓﺎ
X APPENDICES 51ﻣﻠﺤﻘﺎت 20 25ﻣﺎ اﻟﺬي ﻳﺤﺼﻞ ﺑﻴﻦ XMLو JAVA
20 JAVA OBJECTS 26ﺷﺮح ﻛﺎﺋﻨﺎت ﺟﺎﻓﺎ
CAMEL CASE WRITING ROLES ﻃﺮﻳﻘﺔ اﻟﻜﺘﺎﺑﺔ ﺑﺄﺳﻠﻮب )(Camel Case
ﻫﻲ ﻃﺮﻳﻘﺔ ﻛﺘﺎﺑﺔ ﻟﻜﻠﻤﺎت دﻻﻟﻴﺔ ﻣﺘﻼﺻﻘﺔ ﺑﺤﻴﺚ ﺗﻜﻮن اﻷﺣﺮف اﻷوﻟﻰ ﻣﻦ ﻛﻞ ﻛﻠﻤﺔ ﺑﺎﻷﺣﺮف
اﻹﻧﺠﻠﻴﺰﻳﺔ اﻟﻜﺒﻴﺮة Capital Letterﻣﻦ دون وﺟﻮد ﻣﺴﺎﻓﺎت أو رﻣﻮز.
ﻣﺜﺎل ذﻟﻚ:
ﺷﺨﺺ اﺳﻤﻪ mohammed ali
ﻓﺈﻧﺎ ﻧﻜﺘﺐ اﺳﻤﻪ ﺑﻄﺮﻳﻘﺔ Camel Caseﻫﻜﺬا )(MohammedAli
وﺗﺴﺘﺨﺪم ﻫﺬه اﻟﻄﺮﻳﻘﺔ ﻓﻲ اﻟﺘﻌﺒﻴﺮ ﻋﻦ اﻟﻜﻠﻤﺎت ﻓﻲ ﻟﻐﺔ ﺗﺼﻤﻴﻢ واﺟﻬﺔ اﻷﻧـﺪروﻳﺪ ﻣﺜﻼ ﻟﺘﻌﺮﻳـﻒ ﻋﻨﺼـﺮ ﻣﻦ ﻧـﻮع ﻧـﺺ
ﻟﻌﺮض اﻟﻨﺼﻮص ﻓﺈن اﻟﺘﻌﺒﻴﺮ ﻟﻪ ﻳﻜﺘﺐ ﻫﻜﺬا TextView
<TextView
"android:text="Hello
" android:layout_height="wrap_content ﻣﺜﺎل
" android:layout_width="wrap_content
>/
ﻗﺮاءة رﺳﺎﻟﺔ اﻟﺨﻄﺄ ﺑﺪﻗﺔ وﻣﻌﺮﻓﺔ اﻟﺴﻄﺮ اﻟﺬي ﻳﻜﻮن ﻓﻴﻪ اﻟﺨﻄﺄ إن ﺗﻢ ﺗﺤﺪﻳﺪه ﻓﻲ اﻟﺮﺳﺎﻟﺔ. 1
اﺳﺘﺨﺪام اﻟـ logcatﻓﻲ ﺗﺘﺒﻊ اﻷﺧﻄﺎء 3 اﺳﺘﺨﺪام ادوات اﻟﺘﺼﺤﻴﺢ ﻓﻰ اﻟﻨﺪروﻳﺪ اﺳﺘﺪﻳﻮ Debugging Tool 2
اﺳﺘﺨﺪام ﺧﺎﺻﺔ اﻟﺘﺮاﺟﻊ ﻋﻦ اﻟﻜﺘﺎﺑﺔ . 5 ﻣﻘﺎرﻧﺔ اﻟﻜﻮدات ﺑﻜﻮد آﺧﺮ ﻣﺸﺎﺑﻪ ﻓﻌﺎل وﻻ ﻳﺤﺘﻮي أﺧﻄﺎء. 4
ﻃﻠﺐ اﻟﻤﺴﺎﻋﺪة ﻣﻦ اﻟﻤﺒﺮﻣﺠﻴﻦ ﻓﻲ اﻟﻤﻨﺘﺪﻳﺎت أو ﻏﻴﺮه ﻣﻦ وﺳﺎﺋﻞ اﻟﺘﻮاﺻﻞ. 6
ﻣﺜﺎل "android:text="Hello وﻫﻲ اﻟﻌﻨﺎﺻﺮ واﻟﻤﻤﻴﺰات اﻟﻲ ﺗﺤﺪد ﺷﻜﻞ وﺳﻠﻮك اﻟﻌﻨﺼﺮ ﻓﻲ ﺷﺎﺷﺔ اﻟﺘﻄﺒﻴﻖ.
Attribute Name Namespace Prefix "android:text = "Hello Attribute Value
ﻣﺴﺎﺣﺔاﻹﺳـــــﻢ اﺳــــﻢاﻟﻤــﻴﺰة ﻗﻴــﻤﺔ اﻟﻤــﻴﺰة
ﻳﻮﺟﺪ ﻓﻲ آﺧﺮ ﻫﺬا اﻟﻤﻠﺨﺺ ﺟﺪول ﻳﻀﻢ ﻗﺎﺋﻤﺔ أﻏﻠﺐ اﻟﻤﻤﻴﺰات اﻟﻤﺴﺘﺨﺪﻣﺔ ﻓﻲ ﻫﺬه اﻟﺪورة ووﻇﻴﻔﺘﻬﺎ
2
Font Sizes and Colors ﺣﺠﻢ اﻟﺨﻄﻮط واﻷﻟﻮان
ﻗﺎﻣﺖ ﺟﻮﺟﻞ ﺑﻌﻤﻞ ﻣﻮﻗﻊ Material Designوﺣﺪدت ﻓﻴﻪ أﺣﺠﺎم اﻟﺨﻄﻮط واﻷﻟﻮان وﻏﻴﺮﻫﺎ ﻣﻦ اﻟﺨﺼﺎﺋﺺ ﺑﺤﻴﺚ ﻳﺴﺘﻄﻴﻊ
اﻟﻤﻄﻮر ﺑﺎﺳﺘﺨﺪﻣﻬﺎ ﺗﺼﻤﻴﻢ ﺗﻄﺒﻴﻘﺎت ﻣﺘﻨﺎﺳﻘﺔ وﺑﺠﻮدة ﻋﺎﻟﻴﺔ .ﻓﺤﺪدت ﻣﺜﻼ ﻟﻠﻌﻨﻮاﻧﻴﻦ ﺣﺠﻢ ﺧﻂ ﻣﻌﻴﻦ وﻟﻨﺼﻮص
اﻷزرار ﺗﻨﺴﻴﻖ ﻣﻌﻴﻦ .وﻳﻤﻜﻦ اﻟﺮﺟﻮع ﻟﻬﺬه اﻟﺘﻔﺎﺻﻴﻞ ﻣﻦ ﺧﻼل اﻟﻤﻮﻗﻊ https://material.io/guidelines/#
<ImageView
وﻫﻮ ﻋﻨﺼﺮ ﻳﺴﺘﺨﺪم ﻟﻌﺮض اﻟﺼﻮر واﻟﺮﺳﻮﻣﺎت ﻓﻲ ﺷﺎﺷﺔ اﻟﺘﻄﺒﻴﻖ,
"android:src="@drawable/cake ﻋﻨﺪﻣﺎ ﻳﻜﻮن ﻋﺮض اﻟﺼﻮرة ﻳﻐﻄﻲ ﻛﺎﻣﻞ اﻟﻤﺴﺎﺣﺔ ﻟﻌﺮض ﺷﺎﺷﺔ
"android:layout_width="wrap_content
"android:layout_height="wrap_content اﻟﺠﻬﺎز وﺑﺪوت ﻫﻮاﻣﺶ ﻓﺈن اﻟﺼﻮرة ﺗﺴﻤﻰ Full Bleeding Image
>android:scaleType="center" /
ﻣﺜﺎل ﻛﻮدImageView
اﻟﻤﻌﻨـــﻰ اﻟﻤﻤﻴــﺰات
وﻫﻨﺎ ﻳﺤﺪد ﻣﺼﺪر اﻟﺼﻮرة ﻣﻦ دون ذﻛﺮ اﻣﺘﺪادﻫﺎ ﻓﻬﺬه اﻟﺼﻮرة ﻓﻲ اﻟﻤﺜﺎل أﻋﻼه ﻣﻮﺟﻮدة ﻓﻲ اﻟﻤﺴﺎر drawable android:src
ﺗﺴﺘﺨﺪم ﻟﺘﺤﺠﻴﻢ اﻟﺼﻮرة داﺧﻞ ﺷﺎﺷﺔ اﻟﺘﻄﺒﻴﻖ ﺑﻄﺮق ﻣﺨﺘﻠﻔﺔ
” - “centerﻟﻌﺮض اﻟﺼﻮرة ﻓﻲ اﻟﻮﺳﻂ ﻣﻦ دون ﺗﺤﺠﻴﻢ android:scaleType
” - “centerCropﻟﺘﺤﺠﻴﻢ اﻟﺼﻮرة ﺑﺸﻜﻞ ﻣﺘﻨﺎﺳﻖ ﺑﺤﻴﺚ ﺗﻜﻮن ﺗﺴﺎوي أﺑﻌﺎد ﺷﺎﺷﺔ اﻟﺘﻄﺒﻴﻖ ﻧﺎﻗﺼﺎ اﻟﻬﻮاﻣﺶ
ﺟﺪول ﻟﺒﻌﺾ ﻣﻤﻴﺰات ImageView
ﻳﺴﺘﺨﺪم ﻛﺈﻃﺎر ﻣﺤﺘﻮى ﻟﻌﺪة ﻋﻨﺎﺻﺮ ﺑﺪاﺧﻠﻪ وﻳﻤﻜـــﻦ اﻟﺘﺤﻜﻢ ﻓﻲ أﺑﻌﺎده وﺧﺼﺎﺋﺼﻪ .ﻳﻄﻠﻖ
ﻋﻠﻰ ﻫﺬا اﻹﻃﺎر اﺳﻢ أب Parentوﻳﻄﻠﻖ ﻋﻠﻰ اﻟﻌﻨﺎﺻﺮ اﻟﺘﻲ ﺑﺪاﺧﻠﻪ أﺑﻨﺎء Childsوﻳﺴﻤﻰ اﻷﺑﻨﺎء
أﻳﻀﺎ إﺧـــﻮة Siblingsوﻛﺄﻧﻤﺎ اﻷب ﻳﺤﻤﻞ اﻷﺑﻨﺎء ﺑﺪاﺧﻠﻪ ،ﻳﺠﺐ ﻛﺬﻟﻚ ﻣﻼﺣﻈﺔ
وﺟﻮد أب رﺋﻴﺴﻲ واﺣﺪ ﻓﻘﻂ وﻳﻤﻜﻦ أن ﻳﺤﺘﻮي ﺑﺪاﺧﻠﻪ ﻋﻠﻰ آﺑﺎء وأﺑﻨﺎء آﺧﺮﻳﻦ
3
ﻣﺜﺎل ﺗﻮﺿﻴﺤﻲ ﻟﻠﺘﺨﻄﻴﻂ اﻟﺨﻄﻲ
ﺑﺎﻟﻨﺴﺒﺔ ﻟﻬﺬه اﻟﻤﻴﺰة
ﻧﺴﺘﻌﻤﻞ ﻣﺴﺎﺣﺔ اﻻﺳﻢ ﻫﺬه ﻟﻜﻲ ﻧﺤﺪد أن
ﻛﻞ ﻫﺬه اﻟﻤﻤﻴﺰات ﺗﻨﺘﻤﻲ إﻟﻰ أﻧﺪروﻳﺪ ﻟﺬﻟﻚ
وﻧﺴﺘﻄﻴـﻊ أنandroid: ﺗﺒﺪأ ﺟﻤﻴﻌﻬــﺎ ﺑﻜﻠﻤـﺔ
ﻧﻌﻤﻞ ﻣﺴﺎﺣﺔ اﺳﻢ ﺧﺎﺻﺔ ﺑﻨﺎ وﻋﻤﻞ ﻣﺮﺟﻊ
Prefix or alias وﺗﺴﻤﻰ أﻳﻀﺎ.اﻟﻤﻮﻗﻊ ﻟﻬـﺎ
<LinearLayout
ﻣﺜﺎل ﺗﻮﺿﻴﺤﻲ ﻟﻮزن اﻟﺘﺨﻄﻴﻂ
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:src="@drawable/ocean"
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_weight="1"
android:scaleType="centerCrop" /> <TextView
android:text="Bonfire at the beach"
<TextView android:layout_width="match_parent"
android:text="You're invited!" android:layout_height="wrap_content"
android:layout_width="match_parent" android:textColor="@android:color/white"
android:layout_height="wrap_content" android:layout_weight="0"
android:textColor="@android:color/white" android:textSize="34sp"
android:textSize="54sp" android:background="#009688" />
android:layout_weight="0"
android:background="#009688" /> </LinearLayout>
4
ﺷﺮح اﻟﻜﻮد اﻟﺴﺎﺑﻖ
اﻟـــﻮزن اﻟﻄـــﻮل اﻟﻌــﺮض اﻟﻌﻨﺎﺻـﺮ ﻣﻦ اﻟﻤﺜﺎل اﻟﺴﺎﺑﻖ ﻧﺮﻛﺰ ﻓﻘﻂ ﻋﻠﻰ
1 0dp match_parent ImageView ﻃﻮل وﻋﺮض ووزن اﻟﻌﻨﺎﺻﺮ اﻷﺑﻨﺎء واﻟﺘﻲ
0 wrap_content match_parent TextView
ﻫﻲ ﺛﻼث ﻋﻨﺎﺻﺮ وﻧﻘﺎرن ﻛﻞ ﻗﻴﻤﺔ ﻓﻴﻬﺎ
ﻟﺘﺘﻀﺢ ﻓﺎﺋﺪة وزن اﻟﻌﻨﺎﺻﺮ
0 wrap_content match_parent TextView
ﻳﺘﺒﻴﻦ أن اﻟﻌﻨﺼﺮ اﻟﺜﺎﻧﻲ واﻟﺜﺎﻟﺚ ﻛﺎﻧﺖ ﻗﻴﻤﺔ اﻟﻮزن ﻫﻲ ﺻﻔﺮ واﻟﻄﻮل ﻛﺎن ﺑﺎﺣﺘﻮاء اﻟﻨﺺ ﻓﻼ ﺣﺎﺟﺔ ﻹﻋﻄﺎء ﻗﻴﻤﺔ
ﺻﻔﺮ ﻟﻠﻄﻮل ﻓﻤﺎ ﻧﺮﻳﺪه ﻓﻘﻂ ﻫﻮ أن ﻳﺘﻢ اﺣﺘﻮاء اﻟﻨﺺ وﻳﻜﻮن ﻇﺎﻫﺮا ﻟﻠﻤﺴﺘﺨﺪم
أﻣﺎ ﻗﻴﻤﺔ ﻋﻨﺼﺮ اﻟﺼﻮرة ﻓﻘﺪ ﺟﻌﻠﻨﺎ اﻟﻄﻮل ﺻﻔﺮ ﺣﺘﻰ ﻧﻌﻄﻲ اﻟﻤﺠﺎل ﻟﻘﻴﻤﺔ اﻟﻮزن ﻓﻲ اﻟﺘﺤﻜﻢ ﻓﻲ اﻟﻄﻮل،
وﻛﺎﻧﺖ ﻗﻴﻤﺔ اﻟﻮزن ﻫﻲ 1وذﻟﻚ ﻷن اﻟﻌﻨﺎﺻﺮ اﻷﺧﺮى ﻗﻴﻤﺘﻬﺎ ﺻﻔﺮ وﻟﻦ ﺗﺄﺛﺮ اﻟﻘﻴﻤﺔ ﻫﻨﺎ ﺣﺘﻰ ﻟﻮ ﺟﻌﻠﺘﻬﺎ 10ﻟﻜﻦ
ﻟﻮ أردﻧﺎ ﻣﺜﻼ ﺗﻮزﻳﻊ اﻷوزان ﻋﻠﻰ ﺛﻼﺛﺔ ﻋﻨﺎﺻﺮ ﺑﺎﻟﺘﺴﺎوي ﻓﺈن ﻛﻞ ﻋﻨﺼﺮ ﺳﻴﻜﻮن وزﻧﻪ 1وﺳﻴﺄﺧﺬ ﻛﻞ ﻋﻨﺼﺮ ﻧﺴﺒﺔ
اﻟﺜﻠﺚ ﻣﻦ ﻃﻮل اﻟﺸﺎﺷﺔ
ﺑﺎﻟﻨﺴﺒﺔ ﻋﻦ ﻋﺮض اﻟﻌﻨﺎﺻﺮ ﻓﻜﻤﺎ ﻫﻮ واﺿﺢ أن ﻛﻞ اﻟﻌﻨﺎﺻﺮ ﻃﻮﻟﻬﺎ ﻳﺴﺎوي ﻃﻮل اﻟﺘﺨﻄﻴﻂ اﻷب
Relative Layout
5
ﻣﺜﺎل ﺗﻮﺿﻴﺤﻲ ﻟﻠﺘﺨﻄﻴﻂ اﻟﻨﺴﺒﻲ
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/lyla_text_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true"
android:textSize="24sp"
android:text="Lyla" />
<TextView
android:id="@+id/me_text_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_toRightOf="@id/lyla_text_view"
android:textSize="24sp"
android:text="Me" />
<TextView
android:id="@+id/natalie_text_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_above="@id/lyla_text_view"
android:textSize="24sp"
android:text="Natalie" />
<TextView
android:id="@+id/jennie_text_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"
android:textSize="24sp"
android:text="Jennie" />
<TextView
android:id="@+id/omoju_text_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_above="@id/jennie_text_view"
android:textSize="24sp"
android:text="Omoju" />
<TextView
<TextView android:id="@+id/kunal_text_view"
android:id="@+id/amy_text_view" android:layout_width="wrap_content"
android:layout_width="wrap_content" android:layout_height="wrap_content"
android:layout_height="wrap_content" android:layout_alignParentTop="true"
android:layout_alignParentRight="true" android:layout_toLeftOf="@id/ben_text_view"
android:layout_above="@id/omoju_text_view" android:textSize="24sp"
android:textSize="24sp" android:text="Kunal" />
android:text="Amy" />
.......... <TextView
<TextView android:id="@+id/kagure_text_view"
android:id="@+id/ben_text_view" android:layout_width="wrap_content"
android:layout_width="wrap_content" android:layout_height="wrap_content"
android:layout_height="wrap_content" android:layout_alignParentTop="true"
android:layout_alignParentTop="true" android:layout_toRightOf="@id/ben_text_view"
android:layout_centerHorizontal="true" android:textSize="24sp"
android:textSize="24sp" android:text="Kagure" />
android:text="Ben" />
</RelativeLayout>
6
ﺷﺮح اﻟﻜﻮد اﻟﺴﺎﺑﻖ
ﻧﻘﺎرن ﻗﻴﻢ اﻟﻤﺤﺎذاة ﻟﻜﻞ ﻣﻨﻬﺎTextView أﺷﺨﺎص ﻣﻀﻤﻨﺔ ﻓﻲ ﻋﻨﺎﺻﺮ ﻣﻦ ﻧﻮع9 ﻓﻲ اﻟﻤﺜﺎل اﻟﺴﺎﺑﻖ ﻛﺎن ﻫﻨﺎك أﺳﻤﺎء
ﻟﻴﻠﻰ وﺟﻴﻨﻲ وﺑﻦ ﻫﻢ اﻷﺷﺨﺎص اﻷﺳﺎﺳﻴﻴﻦ اﻟﺬﻳﻦ ﺳﺘﻌﺘﻤﺪ اﻟﻤﺤﺎذاة ﻟﻸﺷﺨﺎص اﻵﺧﺮﻳﻦ ﺑﺎﻟﻨﺴﺒﺔ ﻟﻬﻢ
" ﻟﻠﻴﻠﻰ ﻓﺈﻧﻨﺎ ﻧﻘﺼﺪ ﻣﺤﺎذاﺗﻬﺎ ﻟﻠﺠﺎﻧﺐtrue" ﺑﻘﻴﻤﺔlayout_alignParentBottom ﻋﻨﺪﻣﺎ ﻧﺤﺪد اﻟﻤﺤﺎذاة
layout_alignParentRight ﻓﺘﺼﺒﺢRight اﻟﺴﻔﻠﻲ ﻟﻠﺘﺨﻄﻴﻂ اﻷب وﻋﻨﺪﻣﺎ ﻧﺮﻳﺪ اﻟﻤﺤﺎذاة ﻟﻠﻴﻤﻴـﻦ ﻧﻐﻴﺮ اﻟـﻰ
Amy " ﻛﻤﺎ ﻫﻮ اﻟﺤﺎل ﻟـtrue" ﺑﻘﻴﻤﺔ
ﻓﻲ اﻟﻤﺜﺎل أﻋﻼه ﺗﻢ اﺳﺘﺨﺪام ﻣﻴﺰة اﻻﺳﻢ اﻟﻤﻌﺮف ﻛﻤﺮﺟﻊ ﻟﻴﻜﻮن اﻟﺸﺨﺺ ﻓﻲ ﻣﺤﺎذاة اﻟﺸﺨﺺ اﻟﻤﺸﺎر
ﻓﺈﻧﻪ ﻳﻘﻊOmoju وذﻟﻚ ﻟﻠﺸﺨﺺlayout_above = "@id/jennie_text_view" إﻟﻴﻪ ﻓﻲ ﻣﻴﺰة اﻟﻤﺤﺎذاة ﻣﺜﻞ
. ﻋﻨﺪ اﺳﺘﺨﺪام ﻣﻴﺰة اﻻﺳﻢ اﻟﻤﻌﺮف ﻛﻤﺮﺟﻊ+ وﻳﻼﺣﻆ ﻛﺬﻟﻚ ﻋﺪم وﺟﻮد ﻋﻼﻣﺔJennie ﻓﻮق
7
ﺧﻄﻮات ﺗﺼﻤﻴﻢ واﺟﻬﺔ اﻟﺘﻄﺒﻴﻖ
اﻟﻤﺜﺎل ﻫﺬه اﻟﻤﺮﺣﻠﺔ ﺑﺘﻮزع
ﻧﻘﻮم ﻓﻲ ﺑﻌﻤﻞﻧﻘﻮم ﺑﺮﺳﻢ
اﻟﻤﺴﺎﺣﺔ داﺧﻞ إﻃﺎر اﻟﻌﻨﺼﺮ ﻓﻔﻲ اﻟﺘﺼﻤﻴﻢ ﻣﺮﺣﻠﺔ
اﻟﻤﻴﺰة ﻓﻲ
ﺗﻘﻮم
ﺗﺼﻤﻴﻢ
ﺗﺮﺗﻴــﺐ
اﻟﻌﻨﺎﺻﺮ ﻓﻲ ﺷﺎﺷﺔ اﻟﺘﻄﺒﻴﻖ اﻟﻔﻜﺮة وإﻋﻄﺎء ﻓﻜﺮة ﻋﺎﻣﺔ ﻋﻦ
ﺑﻤﻘﺪار
وﺗﺤﺪﻳﺪ اﻟﻤﻤﻴﺰات اﻟﺘﻲ ﺗﺨﺺ اﻟﻤﺴﺎﺣﺎة ﻹﻋﻄﺎء اﻟﺤﺸﻮ اﺳﺘﺨﺪام ﻣﻴﺰة
اﻟﺘﻄﺒﻴﻖ اﻟﺴﺎﺑﻖ ﺗﻢ
ﺳﺘﻈﻬﺮ واﺟﻬﺔ ﻛﻴﻒ
اﻟﻤﺤﺎذاة وﻣﺎ إﻟﻰ ذﻟﻚ ﺑﺈﺳﺘﺨﺪاماﻟﻌﻨﺎﺻﺮ
اﻟﻤﻴﺰات اﻟﻌﻨﺼﺮ ﻣﺎﻫﻲ
ﻟﻠﻤﺴﺘﺨﺪﻣﻴﻦ
ﺣﻮل
اﻟﺘﻲ ﺳﻨﺤﺘﺎﺟﻬﺎ ﻟﻬﺬه اﻟﻮاﺟﻬﺔ
ﻓﻲ ﻫﺬه اﻟﻤﺮﺣﻠﺔ ﻧﻘﻮم ﺑﺘﻨﺴﻴﻖ اﻟﻌﻨﺎﺻﺮ ﻣﺜﻞ ﺗﻐﻴﺮ ﻟﻮن وﺣﺠﻢ وﻧﻮع اﻟﺨﻄﻮط وأﻟﻮان اﻟﺨﻠﻔﻴﺔ
ﺗﻨﺴﻴﻖ
واﻟﻬﻮاﻣﺶ واﻟﺤﺸﻮ وﺗﻌﺪﻳﻞ اﻟﺨﺼﺎﺋﺺ ﻟﺘﺤﺠﻴﻢ اﻟﺼﻮر ﻹﻋﻄﺎء اﻟﺘﻄﺒﻴﻖ ﻣﻈﻬﺮا ﺟﺬاﺑﺎ ﻣﺎ
ﻳﺴﺎﻋﺪ ﺗﻔﻀﻴﻞ اﻟﺘﻄﺒﻴﻖ ﻣﻦ اﻟﻤﺴﺘﺨﺪﻣﻴﻦ وﺣﺼﻮﻟﻪ ﻋﻠﻰ إﻧﺘﺸﺎر ﺑﺸﻜﻞ أﻓﻀﻞ
LinearLayout
RelativeLayout اﺧﺘﺒﺮ ﻧﻔﺴﻚ ﺗﺨﻄﻴﻂ ﻧﺴﺒﻲ أم ﺧﻄﻲ ؟ LinearView
ﻗﻢ ﺑﺘﺤﺪﻳﺪ ﻧﻮع اﻟﺘﺨﻄﻴﻂ وﺣﺎول ﻣﻌﺮﻓﺔ أﻧﻮاع اﻟﻌﻨﺎﺻﺮ
LinearView
1 ImageView, 3 TextView
8
<TextView t1 t2 t3 t4 اﻟﺘﺨﻄﻴﻂ ﺧﻼل ﻣﻦ
android:layout_width="wrap_content"
android:layout_height="wrap_content" ﻓﻲ اﻟﺬي اﻟﻨﺴﺒﻲ
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true" ﺣﺪد اﻻﺳﻢ،اﻟﻮﺳﻂ
android:id="@+id/t1" /> اﻟﻤﻌﺮف ﻟﻜﻞ ﻣﺮﺑﻊ ﻧﺺ
t5 t6 t7
ﻛﻤﺎ ﻓﻲ اﻟﻤﺜﺎل
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content" ﻧﻼﺣﻆ ﻓﻲ اﻟﺘﺨﻄﻴﻂ اﻟﻨﺴﺒﻲ
android:layout_alignParentTop="true"
ﻣﻤﻴﺰات ﻟﻠﻤﺤﺎذاة ﻓﻲ اﻟﻌﻨﺎﺻﺮ
android:layout_toLeftOf="@id/t3"
/> إﻣﻜﺎﻧﻴﺔﺗﺮاﻛﺐاﻟﻌﻨﺎﺻﺮﻋﻠﻰﺑﻌﻀﻬﺎ
t8 t9 t10 t11
<TextView <TextView
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_alignParentLeft="true" android:layout_alignParentTop="true"
android:layout_centerVertical="true" android:layout_centerHorizontal="true"
/> />
<TextView <TextView
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_alignParentRight="true" android:layout_alignParentTop="true"
android:layout_centerVertical="true" android:layout_alignParentRight="true"
/> />
<TextView <TextView
android:id="@+id/t9" android:layout_width="wrap_content"
android:layout_width="wrap_content" android:layout_height="wrap_content"
android:layout_height="wrap_content" android:layout_centerVertical="true"
android:layout_alignParentBottom="true" android:layout_centerHorizontal="true"
android:layout_toRightof="@id/t8"
/>
/>
<TextView <TextView
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_alignParentTop="true" android:layout_alignParentBottom="true"
android:layout_toLeftOf="@id/t3" android:layout_alignParentLeft="true"
/> />
<TextView <TextView
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_alignParentTop="true" android:layout_alignParentBttom="true"
android:layout_alignParentRight="true" android:layout_centerHorizontal="true"
/> />
9
Constraint Layout ﻣﻨﺎﻗﺸﺔ ﺣﻮل أداة
اﻷداة اﻟﺘﻲ ﺗﺠﻌﻞ إﻧﺸﺎء واﺟﻬﺎت اﻟﻤﺴﺘﺨﺪم اﻟﻤﺴﺘﺠﻴﺒﺔ ﺳﺮﻳﻊ ﻟﻠﻐﺎﻳﺔ ﻣﻊ اﻟﻌﺪﻳﺪ ﻣﻦ أﻧﻮاع اﻟﻤﻜﻮﻧــــــﺎت اﻟﻤﺨﺘﻠﻔﺔ
ﻓﻲ اﻟﺪورة ﺑﺪﻻ ﻋﻨﻬﺎ وﻟﻤﻌﺮﻓﺔ اﻟﻔﺮق ﻧﺠﺪ اﻟﻤﻘﺎرﻧﺔ ﻓﻲ اﻷﺳﻔـﻞRelativeLayout - LinearLayout ﻟﻜﻦ ﺗﻢ اﺳﺘﺨﺪام
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
app:layout_constraintLeft_toLeftOf="@+id/activity_main"
app:layout_constraintTop_toTopOf="@+id/activity_main"
app:layout_constraintRight_toRightOf="@+id/activity_main"
app:layout_constraintBottom_toBottomOf="@+id/activity_main" />
</android.support.constraint.ConstraintLayout>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!" />
</RelativeLayout>
10
ﻛﻴﻒ ﺗﺨﺘﺎر ﺑﺮﻣﺠﺔ واﺟﻬﺔ اﻟﺘﻄﺒﻴﻘﺎت APIاﻟﻤﻨﺎﺳﺒﺔ ﻟﺘﻄﺒﻴﻘﻚ
ﻋﻨﺪ ﺑﺪء ﻣﺸﺮوع ﺟﺪﻳﺪ ﻟﻸﻧﺪروﻳﺪ ﺗﻈﻬﺮ ﺷﺎﺷﺔ إﺧﺘﻴﺎر اﺻﺪار واﺟﻬﺔ اﻟﺘﻄﺒﻴﻖ ﻛﻤﺎ ﻓﻲ اﻟﺼﻮرة ،وﻫﺬا اﻹﺧﺘﻴﺎر ﻣﻮﺟﻮد ﻟﺴﺒﺒﻴﻦ:
ﺗﻮﺿﻴﺢ ﻋﺪد اﻟﻤﺴﺘﺨﺪﻣﻴﻦ أو اﻷﺟﻬﺰة اﻟﺬﻳﻦ ﻳﺴﺘﻄﻴﻌﻮن ﺗﺜﺒﻴﺖ ﺑﺮﻧﺎﻣﺠﻚ ﺣﺴﺐ اﺻﺪار اﻟـ APIاﻟﺬى ﺳﺘﺨﺘﺎره 1
وﻛﻠﻤﺎ ﻗﻞ رﻗﻢ اﻻﺻﺪار ﻛﻠﻤﺎ اﺳﺘﻬﺪﻓﺖ اﺟﻬﺰة اﻛﺘﺮ وﻣﺴﺘﺨﺪﻣﻴﻦ اﻛﺘﺮ
ﻗﺪ ﺗﻜﻮن ﻫﻨﺎك ﻣﻤﻴﺰات ﻻ ﺗﺪﻋﻤﻬﺎ ﻧﺴﺨﺔ APIأﻗﺪم ﻓﺈذا اﺧﺘﺮت ﻣﺜﻼ آﻳﺲ ﻛﺮﻳﻢ ﺳﺎﻧﺪوﻳﺶ وﺗﻜﻮن ﻫﺬه اﻟﻤﻤﻴﺰات ﻓﻘﻂ 2
ﻟﻨﺴﺨﺔ ﻛﺖ ﻛﺎت ﻓﻤﺎ ﻓﻮق ﻓﻠﻦ ﻳﻌﻤﻞ اﻟﺘﻄﺒﻴﻖ أو ﺳﺘﻈﻬﺮ أﺧﻄﺎء ﻋﻨﺪ اﻟﺘﺸﻐﻴﻞ.
ﺗﻮﺿﻊ اﻟﺼﻮر ﻋﺎدة ﻓﻲ اﻟﻤﺠﻠﺪ drawableوﻳﺘﻢ اﻹﺷﺎرة إﻟﻴﻬﺎ ﺑﺎﻟﻜﻮد @drawable/coders.jpg 1
ﻳﺪﻋﻢ اﻷﻧﺪرﻳﻮد ﺣﺎﻟﻴﺎ اﻟﺼﻮر ﻣﻦ ﻧﻮع bmp, gif, jpg, pngوﻛﺬﻟﻚ webpﻟﻨﺴﺨﺔ Android 4.0ﻓﻤﺎ ﻓﻮق 2
1coders.jpg ﻳﺠﺐ أن ﻳﻜﻮن اﺳﻢ اﻟﺼﻮرة ﺑﺎﻟﺤﺮوف اﻹﻧﺠﻠﻴﺰﻳﺔ اﻟﺼﻐﻴﺮة ﻣﻦ دون ﻣﺴﺎﻓﺎت وﻻ ﻳﺒﺪأ ﺑﺮﻗﻢ coDers.jpg 3
Coders.jpg coders.jpg
أﺣﺠﺎم اﻟﺼﻮر ﺑﺎﺧﺘﻼف أﺣﺠﺎم ﺷﺎﺷﺎت اﻷﺟﻬﺰة ﻳﻔﻀﻞ أن ﺗﻜﻮن ﻋﻠﻰ ﻋﺪة ﻛﺜﺎﻓﺎت 4
ﻛﺜﺎﻓﺔ اﻟﺒﻜﺴﻞ dpiأﺻﻐﺮ أﺑﻌﺎد أﺑﻌﺎد اﻟﺼﻮرة
426 x 320 120 ﺻﻐﻴﺮة ldpi
470 x 320 160 ﻣﺘﻮﺳﻄﺔ mdpi
640 x 480 240 ﻛﺒﻴﺮة hdpi
960 x 720 320 ﻛﺒﻴﺮة ﺟﺪا xhdpi
1280 x 960 480 ﻛﺒﻴﺮة ﺟﺪا ﺟﺪا xxhdpi
1920 x 1440 640 xxxhdpiﻛﺒﻴﺮة ﺟﺪا ﺟﺪا ﺟﺪا
ﻳﻤﻜﻨﻚ ﻣﻦ ﺧﻼل ﻫﺬا اﻟﻤﻮﻗﻊ اﻟﺬي ﺻﻤﻤﻪ أﺣﺪ اﻷﺧﻮة ﻣﻦ ﻣﺼﺮ ﺗﺤﻮﻳﻞ اﻟﺼﻮر ﺑﺄﺣﺠﺎم ﻣﺨﺘﻠﻔﺔ ﻟﻺﺳﺘﺨﺪام ﻟﻠﺘﻄﺒﻴﻘﺎت
https://appicon.co/#image-sets
11
ﺑﻌﺾ اﻹﺧﺘﺼﺎرات اﻟﻤﻔﻴﺪة
ﻹﻋﺎدة ﺗﻨﺴﻴﻖ اﻟﻨﺺ اﻟﺒﺮﻣﺠﻲ اذﻫﺐ إﻟﻰ ﻗﺎﺋﻤﺔ Codeواﺧﺘﺮ Reformat Code 1
ﻟﺘﺮﺗﻴﺐ اﻟﻤﻤﻴﺰات ﻟﻠﻌﻨﺎﺻﺮ ﺣﺴﺐ ﺗﻌﻠﻴﻤﺎت أﻧﺪرﻳﻮد اﻟﺒﺮﻣﺠﻴﺔ اذﻫﺐ إﻟﻰ ﻗﺎﺋﻤﺔ Codeواﺧﺘﺮ RearrangeCode 2
ﺗﺴﺘﺨﺪم ﻣﻠﻔﺎت ﺟﺎﻓﺎ ﻟﻜﺘﺎﺑﺔ اﻟﻜﻮدات اﻟﺒﺮﻣﺠﻴﺔ ورﺑﻂ اﻟﻌﻨﺎﺻﺮ ﻓﻲ واﺟﻬﺔ اﻟﺘﻄﺒﻴﻖ ﺑﺄواﻣﺮ ﺑﺮﻣﺠﻴﺔ ﻟﻠﺘﺤﻜﻢ ﺑﻬﺎ اﻟﺨﺎﺻﺔ
ﺑﻬﺎ وﻳﺴﺘﺨﺪم أﻧﺪرﻳﻮد اﺳﺘﻮدﻳﻮ ﻣﻜﺘﺒﺎت ﺟﺎﻓﺎ ﺧﺎﺻﺔ ﺑﺎﻷﻧﺪرﻳﻮد ﺣﻴﺚ أن اﻟﺠﺎﻓﺎ ﺗﺪﻋﻢ أﻳﻀﺎ ﻣﻜﺘﺒﺎت ﻣﻨﺼﺎت أﺧﺮى.
ﺣﻴﻦ ﻓﺘﺢ اﻟﺘﻄﺒﻴﻖ ﻷول ﻣﺮة ﺳﻴﻜﻮن ﻫﻨﺎك ﻣﻠﻒ ﺟﺎﻓﺎ ﺑﺎﺳﻢ MainActivity.javaﻳﻀﺎف ﻣﻠﻒ اﻟﺠﺎﻓﺎ ﻫﺬا ﺗﻠﻘﺎﺋﻴﺎ ﻓﻲ اﻟﻤﺴﺎر
java>com.example.android.appname
ﻛﻞ ﻣﻠﻒ ﻣﻦ ﻳﻤﺜﻞ Classوﻳﻤﻜﻦ أن ﻳﻜﻮن اﻟﻜﻼس ﻣﻦ ﻧﻮع ﻧﺸﺎط Activityاﻟﻨﺸﺎط ﻳﻘﺪم ﺷﻴﺌﺎ واﺣﺪا ﻳﻤﻜﻦ ﻟﻠﻤﺴﺘﺨﺪم ﻓﻌﻠﻪ
وﺑﻌﺾ اﻷﺣﻴﺎن ﻳﻜﻮن ﺷﺎﺷﺔ واﺣﺪة وأﺣﻴﺎﻧﺎ ﻳﻜﻮن ﻫﻨﺎك ﻋﺪة ﺷﺎﺷﺎت ﻟﻠﻨﺸﺎط اﻟﻮاﺣﺪ ،وﺑﺎﻷﺳﺎس اﻟﻨﺸــﺎط ﻫﻮ ﻛﻴﻔﻴــﺔ
ﻋﺮﺿﻚ ﻟﻠﻤﺨﻄﻂ وﻛﻴﻔﻴﺔ ﺗﻔﺎﻋﻠﻪ ﻣﻊ اﻟﻤﺴﺘﺨﺪم
ﻫﺬا اﻟﻤﺜﺎل ﺳﻴﺮﺑﻂ أﻣﺮ اﻟﻀﻐﻂ ﻋﻠﻰ زر Buttonﻓﻲ واﺟﻬﺔ اﻟﺘﻄﺒﻴﻖ ﺛﻢ ﺳﻴﻐﻴﺮ اﻟﻜﺘﺎﺑﺔ ﻓﻲ ﻋﻨﺼﺮ ﻧﺺ TextView
وﺳﻨﺴﺘﺨﺪم اﻟﻤﻴﺰة android:onClickﻟﻬﺬا اﻟﻐﺮض واﻟﺘﻲ ﺳﻴﺘﻢ إﺿﺎﻓﺘﻬﺎ ﻟﻠﻌﻨﺼﺮ . Button
submitOrder Method
اﻟﻄﺮﻳﻘﺔ Methodﺗﻘﻮم ﺑﻤﺮاﻗﺒﺔ ﺣﺼﻮل اﻟﺤﺪث OnClickوﻫﻮ اﻟﻀﻐﻂ ﻋﻠﻰ اﻟﺰر Buttonوﺛﻢ أي أواﻣﺮ ﻧﻘﻮم ﺑﺈﺿﺎﻓﺘﻬﺎ
ﻓﻲ اﻟﻄﺮﻳﻘﺔ ﺳﻴﻘﻮم اﻟﺘﻄﺒﻴﻖ ﺑﺘﻨﻔﻴﺬه ،ﻧﻘﻮم ﺑﻌﻤﻞ اﻟﻄﺮﻳﻘﺔ ﺗﻠﻘﺎﺋﻴﺎ ﻛﻤﺎ ﻓﻲ اﻟﺼﻮرة أدﻧﺎه،
<Button
"android:layout_width="wrap_content
"android:layout_height="wrap_content
"android:text="Order
>android:OnClick="submitOrder"/
12
ﺷﺮح اﻟﻜﻮدات اﻟﺴﺎﺑﻘﺔ
ﻫﻨﺎك ﻃﺮﻳﻘﺘﺎن ,اﻟﻄﺮﻳﻘﺔ اﻷوﻟﻰ )( submitOrderﺳﺘﺸﻴﺮ إﻟﻰ اﻟﻄﺮﻳﻘﺔ اﻟﺜﺎﻧﻴﺔ ﻋﻦ ﻃﺮﻳﻖ ) display(2اﻟﻄﺮﻳﻘﺔ
اﻟﺜﺎﻧﻴﺔ ﺑﺪورﻫﺎ ﺳﺘﻘﻮم ﺑﺎﻟﺘﺤﻜﻢ ﺑﺎﻟﻨﺺ TextViewاﻟﺬي ﺗﻢ رﺑﻄﻪ ﻣﻊ ﻋﻨﺼﺮ اﻟﻌﺮض quantity_text_viewوﺳﻴﻘﻮم
ﺑﻌﺮض اﻟﺮﻗﻢ 2ﻋﻠﻴﻪ ﻋﻨﺪ اﻟﻀﻐﻂ ﻋﻠﻰ اﻟﺰر وﻛﻞ ﻫﺬا ﺣﺼﻞ ﻷﻧﻨﺎ ﻓﻲ اﻟﺒﺪاﻳﺔ أﺿﻔﻨﺎ android:OnClickإﻟﻰ اﻟﺰر
/* text */ ﻳﺠﺐ أن ﺗﺒﺪأ اﻟﻤﻼﺣﻈﺎت وﺗﻨﺘﻬﻲ ﻣﻼﺣﻈﺎت JAVA ﻣﻼﺣﻈﺎت XML
ﺑﻬﺬه اﻟﻄﺮﻳﻘﺔ ﺣﺘﻰ وإن ﻛﺎﻧﺖ ﻣﻼﺣﻈﺎت اﻟﺠﺎﻓﺎ ﻳﻤﻜﻦ ﻛﺘﺎﺑﺘﻬﺎ ><!-- Blah Blah Blah --
/** text */ اﻟﻤﻼﺣﻈﺔ ﻋﻠﻰ ﻋﺪة أﺳﻄﺮ ﺑﺜﻼث ﻃﺮق ﻣﺨﺘﻠﻔﺔ ،ﺑﻌﻀﻬﺎ اﻟﻤﻼﺣﻈﺎت
ﻟﺴﻄﺮ واﺣﺪ واﻟﺒﻌﺾ اﻵﺧﺮ ﻷﻛﺜﺮ
// text ﻫﺬه اﻟﻄﺮﻳﻘﺔ ﻟﺴﻄﺮ واﺣﺪ ﻓﻘﻂ ﻣﻦ ﺳﻄﺮ
ﻳﺠﺐ أن ﺗﺒﺪأ اﻟﻤﻼﺣﻈﺎت وﺗﻨﺘﻬﻲ
**/
<!-- ﺑﻬﺬه اﻟﻄﺮﻳﻘﺔ ﺣﺘﻰ وإن ﻛﺎﻧﺖ
* The HelloWorldApp class implements an application that
* simply displays "Hello World!" to the standard output.
ﻣﺜﺎل Blah
*/ >Blah Blah -- اﻟﻤﻼﺣﻈﺔ ﻋﻠﻰ ﻋﺪة أﺳﻄﺮ
ﻋﻨﺪ إﺿﺎﻓﺔ ﻃﺮﻳﻘﺔ Methodإﻟﻰ اﻟﻨﺸﺎط Activityﻳﺠﺐ إﺿﺎﻓﺘﻬﺎ ﺑﻴﻦ ﺑﻌﺾ اﻟﺪوال ﺗﺤﺘﺎج إﻟﻰ اﺳﺘﻴﺮاد ﻣﻜﺘﺒﺔ ﻛﻮدات
ﻗﻮﺳﻲ اﻟﻨﺸﺎط وﺧﺎرج إﻃﺎر اﻟﻄﺮق اﻷﺧﺮى ﻛﻤﺎ ﻫﻮ ﻣﻮﺿﺢ ﺧﺎﺻﺔ واﻹﺷﺎرة إﻟﻴﻬﺎداﺧﻞ اﻟﻨﺸﺎط ﻟﻜﻲ ﺗﻌﻤﻞ
{ Activity
;import java.text.NumberFormat
{ )(onCreate
{ Activity { )(
th od3
} me
{)(method
)(NumberFormat.getCurrencyInstance { )(method2 }
}
}
}
ﻟﻜﻲ ﺗﻌﻤﻞ ﻫﺬه اﻟﺪاﻟﺔ ﻳﺠﺐ اﻹﺷﺎرة إﻟﻲ
ﻫﺬه اﻟﻤﻜﺘﺒﺔ ﻓﻲ اﻷﻋﻠﻰ ﺧﺎرج اﻟﻨﺸﺎط }
13
اﻟﻤﺘﻐﻴﺮات VARIABLES
Literalﻫﻲ ﻗﻴﻢ ﺛﺎﺑﺘﺔ ﻻ ﺗﺘﻐﻴﺮ ﻣﺜﻞ 2،22،55 ﺗﻌﺮﻳﻒ اﻟﻤﺘﻐﻴﺮات Variables Declaration 1
variablesﻫﻲ ﻗﻴﻢ ﻣﺘﻐﻴﺮة ﻳﺴﺘﺨﺪم ﻟﻬﺎ اﺳﻢ وﻳﻤﻜﻦ
ﺗﻐﻴﻴﺮ ﻗﻴﻤﺘﻬﺎ ﻣﺜﻞ numberOfCoffees = 3 ;int numberOfCoffees = 2
numberOfCoffees = 5x5
Data Variable Initial
ﻳﺤﺪد ﻧﻮع اﻟﺒﻴﺎﻧﺎت ﻫﻨﺎ
ﻧﻮع ﻗﻴﻢ ﺑﻴﺎﻧﺎت اﻟﻤﺘﻐﻴﺮ
type
ﻧﻮع اﻟﺒﻴﺎﻧﺎت
name
اﺳﻢ اﻟﻤﺘﻐﻴﺮ
= value
اﻟﻘﻴﻤﺔ
;
اﻟﻤﺒﺪﺋﻴﺔ
أﻧﻮاع اﻟﺒﻴﺎﻧﺎت اﻟﺒﺪاﺋﻴﺔ اﻟﻤﺪﻋﻮﻣﺔ ﻣﻦ ﺟﺎﻓﺎ
Primitive Data Types supported by java 2
ﻣﺪى اﻟﻘﻴﻢ اﻟﻤﻤﻜﻦ ﺗﺨﺰﻳﻨﻬﺎ اﻓﺘﺮاﺿﻴﺔ اﻟﺴﻌﺔ اﻟﻮﺻﻒ ﻧﻮع اﻟﺒﻴﺎﻧﺎت
-128 127 0 1ﺑﺎﻳﺖ ﺑﺎﻳـــﺖ byte
-32,768 32,767 0 ﻋﺪد ﺻﺤﻴﺢ ﻗﺼﻴﺮ 2ﺑﺎﻳﺖ short
-231 231-1 0 4ﺑﺎﻳﺖ ﻋﺪد ﺻﺤﻴﺢ int
-263 263-1 0L ﻋﺪد ﺻﺤﻴﺢ ﻃﻮﻳﻞ 8ﺑﺎﻳﺖ long
3.4e−38 3.4e38 0.0f 4ﺑﺎﻳﺖ ﻋﺪد ﻧﺴﺒﻲ float
1.7e-38 1.7e+38 0.0d ﻋﺪد ﻧﺴﺒﻲ ﻣﻀﺎﻋﻒ 8ﺑﺎﻳﺖ double
false true false 1ﺑـﺖ ﻗﻴﻤﺔ ﻣﻨﻄﻘﻴﺔ boolean
)u0000 (0 )uffff (65,535 ''\u0000
or 0 2ﺑﺎﻳﺖ ﺣــﺮف char
ﻣﻼﺣﻈﺔ :ﻻ ﻳﻮﺟﺪ ﻧﻮع ﺑﻴﺎﻧﺎت ﻋﺪدي ﻳﻌﻄﻲ ﻟﻠﻘﻴﻢ اﻟﻤﻮﺟﺒﺔ ﻓﻘﻂ ﻟﻜﻦ ﻳﻤﻜﻦ ﺗﺤﺪﻳﺪ اﻟﻘﻴﻢ ﻋﻦ ﻃﺮﻳﻖ اﻟﻜﻮدات اﻟﺒﺮﻣﺠﻴﺔ
ﻻ ﻳﻤﻜﻦ اﺳﺘﺨﺪام اﻟﻜﻠﻤﺎت اﻟﻤﻔﺘﺎﺣﻴﺔ واﻟﻤﺤﺠﻮزة 5 اﺳﻢ اﻟﻤﺘﻐﻴﺮ ﺣﺴﺎس ﻟﺤﺎﻟﺔ اﻟﺤﺮف )ﺻﻐﻴﺮ 1
;int int = 2 ﻷواﻣﺮ ﺟﺎﻓﺎ ،ﻛﺈﺳﻢ ﻟﻤﺘﻐﻴﺮ أم ﻛﺒﻴﺮ( وﻋﻨﺪ اﻹﺷﺎرة إﻟﻴﻪ ﻓﻲ اﻟﻜﻮدات
)ﻗﺎﺋﻤﺔ اﻟﻜﻠﻤﺎت اﻟﻤﻔﺘﺎﺣﻴﺔ ﻓﻲ اﻟﺼﻔﺤﺔ اﻟﺘﺎﻟﻴﺔ(
;int void= 2 ﻳﺠﺐ أن ﻳﻜﺘﺐ ﻛﻤﺎ ﺗﻢ ﺗﻌﺮﻳﻔﻪ ﺑﺎﻟﻀﺒﻂ
إذا ﻛﺎﻧﺖ ﻗﻴﻤﺔ اﻟﻤﺘﻐﻴﺮ ﻫﻲ ﻗﻴﻤﺔ ﺛﺎﺑﺘﺔ دوﻣﺎ ﻓﺈن 7 ﻻ ﻳﻤﻜﻦ اﺳﺘﺨﺪام ﻣﺴﺎﻓﺔ ﻓﻲ اﺳﻢ اﻟﻤﺘﻐﻴﺮ 3
اﺳﻢ اﻟﻤﺘﻐﻴﺮ ﻳﺠﺐ أن ﻳﻜﻮن ﺑﺎﻷﺣﺮف اﻟﻜﺒﻴﺮة ﺑﺎﻟﻜﺎﻣﻞ ;int ordered Coffee = 2
ووﺿﻊ ﺧﻂ ﺳﻔﻠﻲ ـــ ﺑﻴﻦ ﻛﻞ ﻛﻠﻤﺔ
;NUM_COFFEE = 6 ﻳﻔﻀﻞ ﻋﺪم اﺳﺘﺨﺪام اﻟﺤﺮوف اﻟﻤﺘﻜﺮرة أو 4
ﻳﻔﻀﻞ وﺿﻊ ﺣﺮف mﺻﻐﻴﺮ ﺑﺪاﻳﺔ أﺳﻤﺎء اﻟﻤﺘﻐﻴﺮات 8 اﻟﺤﺮوف اﻟﻤﺨﺘﺼﺮة ،ﺑﻞ ﻳﻜﺘﺐ اﺳﻢ اﻟﻤﺘﻐﻴﺮ
اﻟﻤﺤﻠﻴﺔ اﻟﺘﻲ ﻳﺘﻢ اﺳﺘﺨﺪاﻣﻬﺎ داﺧﻞ اﻟﺼﻨﻒ وﺗﻌﻨﻲ ﺑﻜﻠﻤﺔ ﻛﺎﻣﻠﺔ واﺿﺤﺔ اﻟﻤﻌﻨﻰ ﻟﺘﺴﻬﻞ ﻓﻬﻢ
mTextColor ﻣﺘﻐﻴﺮ ﻋﻀﻮ )(member variable orderrrrrr ordcfe اﻟﻜﻮدات
14
ﻗﺎﺋﻤﺔ ﻣﻌﻈﻢ اﻟﻜﻠﻤﺎت اﻟﻤﻔﺘﺎﺣﻴﺔ ﻟـﺠﺎﻓﺎ KEYWORDS
ﻫﻲ ﻛﻠﻤﺎت وﻋﺒﺎرات ﻣﺤﺠﻮزة ﻷواﻣﺮ ﺟﺎﻓﺎ ﻳﻤﻜﻦ اﺳﺘﺨﺪاﻣﻬﺎ ﻟﺒﺮﻣﺠﺔ اﻷواﻣﺮ ﻟﻠﻘﻴﺎم ﺑﺄﻣﺮ ﻣﺎ ﻣﺜﻞ ﺗﻌﺮف ﻣﺘﻐﻴﺮ أو
ﺗﺤﺪﻳﺪ ﻧﻮﻋﻪ أو وﻏﻴﻬﺮﻫﺎ ﻣﻦ اﻷواﻣﺮ ،ﺑﻤﺎ أﻧﻬﺎ ﻣﺤﺠﻮزة ﻓﻼ ﻳﻤﻜﻦ اﺳﺘﺨﺪاﻣﻪ ﻷﻏﺮاض أﺧﺮى ﻣﺜﻞ ﺗﺴﻤﻴﺔ ﻣﺘﻐﻴﺮ
ﺑﺄﺣﺪﻫﺎ ،ﻓﻌﻨﺪ ذﻟﻚ ﺳﻴﻌﺘﺒﺮ ﻛﺨﻄﺄ ﺑﺮﻣﺠﻲ ﻣﻦ ﻗﺒﻞ ﻣﺼﺤﺤﺎت أﺧﻄﺎء ﺟﺎﻓﺎ اﻟﺒﺮﻣﺠﻴﺔ
abstract continue for new switch
***assert default *goto package synchronized
boolean do if private this
break double implements protected throw
byte else import public throws
case ****enum instanceof return transient
catch extends int short try
char final interface static void
class finally long **strictfp volatile
*const float native super while
Step Over
15
اﻟﺨﻮارزﻣﻴﺔ PSEUDO CODE
اﻟﺨﻮارزﻣﻴﺔ ﻫﻲ وﺻﻒ ﻣﺘﻘﺪم ﻟﺸﺮح ﺧﻄﻮات ﻋﻤﻞ اﻟﺘﻄﺒﻴﻖ وﻫﺬا ﻳﺴﺎﻋﺪﻧﺎ ﻋﻠﻰ وﺿﻊ أﻓﻜﺎرﻧﺎ ﺑﺸﻜﻞ ﺧﻄﻲ
ﻣﺘﺴﻠﺴﻞ ﻟﻤﺎ ﻧﺮﻳﺪ ﺣﺪوﺛﻪ ﺧﻄﻮة ﺗﻠﻮ اﻷﺧﺮى وﻻ ﺗﻮﺟﺪ ﺿﻮاﺑﻂ ﻟﺒﻨﺎء اﻟﺨﻮارزﻣﻴﺔ ﻓﻘﻂ ﻋﻠﻴﻨﺎ ﺗﻀﻤﻴﻦ اﻟﺘﻔﺎﺻﻴﻞ اﻟﺘﻲ
ﺳﺘﻔﻴﺪﻧﺎ ﻓﻲ ﻛﺘﺎﺑﺔ اﻟﻨﺺ اﻟﺒﺮﻣﺠﻲ.
ﻣﺜﺎل :ﺗﺤﺪﻳﺚ ﻗﻴﻤﺔ ﻣﺘﻐﻴﺮ إﻟﻰ ﻗﻴﻤﺔ اﻟﻤﻌﺎدﻟﺔ4 + 2*12 - 8:
اﻟﺨــﻮارزﻣﻴﺔ اﻵﻛﻮاد اﻟﺒﺮﻣﺠﻴﺔ
Create quantity variable, set it to 2 ;int quantity = 2 ﻃﺒــﻖ ﻫﺬا اﻟﻜـﻮد ﻓﻲ
اﻟﺒﺮﻧﺎﻣﺞ وﺣﺎول ﻣﻌﺮﻓﺔ
Multiply 12 by quantity variable ;quantity = quantity * 12
ﻧﺎﺗﺞ اﻟﻤﻌﺎدﻟﺔ
Add 4 to quantity variable ;quantity = quantity + 4 ? = quantity
Subtract 8 to quantity variable ;quantity = quantity - 8
{ )(onCreate
;int quantity = 2 اﻟﻤﺪى اﻟﻌﺎﻟﻤﻲ Globalوﻳﺘﻢ ﻓﻴﻪ ﺗﻌﺮﻳﻒ اﻟﻤﺘﻐﻴﺮ ﺧﺎرج ﺟﻤﻴﻊ اﻟﻄﺮق Methodوﻟﻜﻦ داﺧﻞ 1
;)display(score ﻣﺪى اﻟﻜﻼس وﻳﺸﺎر إﻟﻴﻪ ﻓﻲ أي ﻃﺮﻳﻘﺔ ﻣﻮﺟﻮدة ﻓﻲ اﻟﻜﻼس اﻟﺤﺎﻟﻲ
}
{ )(method
;)display(score
;) display(quantity
اﻟﻤﺪى اﻟﻤﺤﻠﻲ Localeوﻳﺘﻢ ﻓﻴﻪ ﺗﻌﺮﻳﻒ اﻟﻤﺘﻐﻴﺮ داﺧﻞ اﻟﻄﺮﻳﻘﺔ ﻓﻘﻂ Methodوﻟﻦ ﻧﺴﺘﻄﻴﻊ 2
} اﻹﺷﺎرة إﻟﻴﻪ ﻓﻲ ﻃﺮق أو أﻧﺸﻄﺔ أﺧﺮى Other Methods or Classes
}
TextView LinearLayout
16
ﻗﻮاﻋﺪ اﻟﻨﺼﻮص اﻟﻤﺘﺴﻠﺴﺔ STRINGS CONCATENATION ROLES
ﺗﻌﺘﺒﺮ اﻟﻨﺼﻮص اﻟﻤﺘﺴﻠﺴﻠﺔ ﻣﻦ أﻧﻮاع اﻟﺒﻴﺎﻧﺎت اﻟﻜﺎﺋﻦ ) (Objectوﻫﻲ ﺗﺨﺘﻠﻒ ﻓﻲ ﻗﻮاﻋﺪﻫﺎ ﻋﻦ أﻧﻮاع اﻟﺒﻴﺎﻧﺎت اﻟﺒﺪاﺋﻴﺔ
) ،(Primitiveوﻋﻨﺪ ﻛﺘﺎﺑﺔ اﻟﻨﺼﻮص ﻓﻲ ﻣﻠﻔﺎت اﻟﺠﺎﻓﺎ ﻳﺠﺐ إﺗﺒﺎع ﻫﺬه اﻟﻘﻮاﻋﺪ ﻟﺘﺠﻨﺐ ﺣﺼﻮل اﻷﺧﻄﺎء ﻓﻲ اﻟﺘﻄﺒﻴﻖ
اﻟﺤﺮف اﻷول ﻛﺒﻴﺮ ﻷن ﺗﻌﺮﻳﻒ اﻟﻤﺘﻐﻴﺮ ﻣﻦ
ﺗﺠﺎﻫﻞ اﻟﺤﺮوف اﻟﺨﺎﺻــﺔ ﻧﻮع ﺑﻴﺎﻧﺎت ﻛﺎﺋﻦ Object 1
3 ﻧﻮع ﻧﺼﻮص String
ِEscape Special Characters
;””\String textToDisplay = “Welcom to \n\”1 Million Coders
ﻟﻮ أردﻧﺎ ﻛﺘﺎﺑﺔ اﻟﺤﺮف )”( ﺿﻤﻦ ﻗﻴﻤﺔ
ﻗﻴﻤﺔ اﻟﻤﺘﻐﻴﺮ اﻟﻔﻌﻠﻴﺔ
اﻟﻤﺘﻐﻴﺮ اﻟﻨﺺ ﻓﺴﻴﺤﺪث ﺧﻄﺄ ﻷن ﺳﻴﻌﺘﺒﺮ ﻳﺠﺐ أن ﻳﺒﺪأ وﻳﻨﺘﻬﻲ
ﻗﻮس اﻏﻼق ﻟﻠﻨﺺ ،واﻟﻨﺺ اﻟﺒﺎﻗﻲ ﻳﻌﺘﺒﺮ
Welcom to
اﻟﻨﺺ ﺑﻌﻼﻣﺔ اﻗﺘﺒﺎس
2
””1 Million Coders
ﺧﻄﺄ ;””“Welcom to ”1 Million Coder\n ﻳﺴﺘﺨﺪم اﻟﺮﻣﺰ \nﻹدﺧﺎل ﺳﻄﺮ ﺟﺪﻳﺪ ﻓﻲ
error 4
ﻓﻠﻔﺘﺎدي ﻫﺬه اﻟﻤﺸﻜﻠﺔ ﻳﺠﺐ وﺿﻊ ﻋﻼﻣﺔ ﻗﻴﻤﺔ اﻟﻤﺘﻐﻴﺮ ﻓﻤﺎ ﻳﻜﺘﺐ ﺑﻌﺪه ﺳﻴﻜﻮن ﻓﻲ
) (/ﻗﺒﻞ اﻟﻘﻮس ﻓﺴﻴﻔﻬﻢ اﻟﺒﺮﻧﺎﻣﺞ أن ﻫﺬا اﻟﺴﻄﺮ اﻟﺠﺪﻳﺪ ،ﻛﻤﺎ ﻓﻲ اﻟﻤﺜﺎل أﻋﻼه
اﻟﻘﻮس ﻳﺠﺐ ﺗﺠﺎﻫﻠﻪ
اﻟﻨﺼﻮص ﻣﻤﻜﻦ أن ﺗﺤﺘﻮي ﻋﻠﻰ ﺣﺮوف،
5
أرﻗﺎم أو رﻣﻮز ﻣﺜﻞ # $
;”String textToDisplay = “Welcom” + “ ” + “Hello 6ﻟﺪﻣﺞ ﻧﺼﻮص ﻣﻊ أرﻗﺎم أو ﻧﺼﻮص ﻳﺴﺘﺨﺪم اﻟﺮﻣﺰ +
;String textToDisplay = “Welcom” + 1 ﻫﻨﺎك ﻋﺪة ﻃﺮق ﻛﺬﻟﻚ ﻟﺪﻣﺞ اﻟﻨﺼﻮص أو اﻷرﻗﺎم 7
;String textToDisplay = 2 + 1 litteral ﻣﻨﻬﺎ ;x = x + n; = x += n
;String textToDisplay = “” + 123 ﺗﺴﺘﺨﺪم ﻧﻔﺲ اﻟﻄﺮﻳﻘﺔ ﻟﻠﻤﺘﻐﻴﺮات ﻣﻦ ﻧﻮع int 8
;)String textToDisplay = String.valueOf(123 وﻳﻤﻜﻦ اﺳﺘﺨﺪام ;r = r + 1; = r++
;)String textToDisplay = Integer.toString(123 ﺗﻘﻮم ﺑﺰﻳﺎدة رﻗﻢ ﻟﻠﻌﺪد وﻟﻠﻄﺮح ﻧﻔﺲ اﻟﻄﺮﻳﻘﺔ أﻳﻀﺎ
17
اﺳﺘﺪﻋﺎء اﻟﻄﺮﻳﻘﺔ CALLING A METHOD
**/
* Calculates the price of the order. ﻳﻔﻀﻞ داﺋﻤﺎ وﺿﻊ ﺷﺮح ﻟﻠﻄﺮﻳﻘﺔ ﻋﻠﻰ ﻃﺮﻳﻘﺔ
* @param addWhippedCream will check if whipped cream is clicked
* @param addChocolate will check if chocolate is clicked ﻣﻼﺣﻈﺎت وذﻛﺮ وﻇﻴﻔﺔ اﻟﻌﻮاﻣﻞ داﺧﻠﻬﺎ
* @return the total price in returned . Parametersوﻣﺎﻫﻲ اﻟﻘﻴﻤﺔ اﻟﺘﻲ ﺳﺘﺮﺟﻌﻬﺎ
*/ ﻳﺘﻢ وﺿﻊ ﻋﻼﻣﺔ @paramﻗﺒﻞ ﺷﺮح اﻟﻌﺎﻣﻞ
{ )private int calculatePrice(boolean addWhippedCream, boolean addChocolate
;int basePrice = 5 ﻟﻌﻤﻞ رﺑﻂ ﻟﻠﻤﻼﺣﻈﺔ ﺑﺎﻟﻌﺎﻣﻞ ﻓﻲ اﻟﻄﺮﻳﻘﺔ
;if (addWhippedCream) basePrice++ ﻟﻴﺲ ﻫﻨﺎك داع ﻹرﺳﺎل ﺑﻴﺎﻧﺎت إﺿﺎﻓﻴﺔ ﻟﻦ
;if (addChocolate) basePrice += 2 أﺳﺘﺨﺪﻣﻬﺎ داﺧﻞ اﻟﻄﺮﻳﻘﺔ
; return 3* basePrice ﻫﻨﺎ ﺗﻢ اﺳﺘﺪﻋﺎء اﻟﻄﺮﻳﻘﺔ ووﺿﻊ ﻗﻴﻤﺘﻬﺎ ﻓﻲ
} ﻣﺘﻐﻴﺮ ﻣﻦ ﻧﻔﺲ ﻧﻮع اﻟﺒﻴﺎﻧﺎت اﻟﻤﺮﺟﻌﺔ ﻣﻦ
@Override
{ )protected void onCreate(Bundle savedInstanceState
اﻟﻄﺮﻳﻘﺔ int = int
;)super.onCreate(savedInstanceState
;)setContentView(R.layout.activity_main إذا ﺗﻢ ﺗﻌﺮﻳﻒ ﻋﻮاﻣﻞ إدﺧﺎل Parametersﺑﺈﺳﻢ
ﻣﺸﺎﺑﻪ ﻟﻤﺘﻐﻴﺮات ﻋﺎﻣﺔ Global Variablesﻓﺈن
;)int price = calculatePrice(true, true
} اﻷﻓﻀﻠﻴﺔ ﺗﻜﻮن ﻟﻠﻌﻮاﻣﻞ اﻟﻤﺪﺧﻠﺔ
ﺗﻢ ﺗﻨﻔﻴﺬ اﻷﻣﺮ return 2 ﺗﻢ ﺗﻨﻔﻴﺬ ﺟﻤﻴﻊ اﻷﺳﻄﺮ اﻟﺒﺮﻣﺠﻴﺔ 1 ﻳﻨﺘﻬﻲ اﻟﺘﻌــــﺎﻣﻞ ﻣــﻊ
أﻳﻬﻤﺎ ﻳﺤﺪث ﻗﺒﻞ اﻟﻄﺮﻳﻘﺔ اﻟﻤﺴﺘﺪﻋﺎة إذا
ﺣﺪث ﺧﻄﺄ ﻣﺎ ﻓﻲ داﺧﻞ اﻟﻄﺮﻳﻘﺔ Throw an excption 3
ﻛﻠﻤﺔ voidﺗﻌﻨﻲ ﻋﺪم إرﺟﺎع ﻗﻴﻤﺔ ﻣﻦ اﻟﻄﺮﻳﻘﺔ اﻷﻣﺮ ; returnﻏﻴﺮ ﺿﺮوري ﻷﻧﻪ ﻻ ﻳﺮﺟﻊ أي ﻗﻴﻤﺔ ﻣﻔﻴﺪة
ﺑﺎﻟﺘﻌﺎون ﻣﻊ اﻷﺳﺘﺎذ :ﺣﺴﻦ ﻳﻮﺳﻒ ﺷﺮح ﻣﻠﻔﺎت و ﻣﺠﻠﺪات اﻧﺪروﻳﺪ اﺳﺘﺪﻳﻮ Android Studio folder structure
@Hassan_Youssef_Tutor
وﻫﻮ ﻳﺤﺘﻮي ﻋﻠﻰ ﻣﻠﻒ ﺗﺴﺘﻄﻴﻊ أي ﻣﺠﻠﺪ Resourcesوﻫﻮ ﻋﺒﺎرة وﻫﻮ ﻋﺒﺎرة ﻋﻦ ﻣﺠﻠﺪ اﻟﺘﻄﺒﻴﻖ
ﻣﻦ ﺧﻼﻟﻪ ﺗﺤﺪﻳﺪ ﺻﻼﺣﻴﺎت ﻋﻦ ﻣﺠﻠﺪ اﻟﻤﺼﺎدر أو اﻟﻤﻮارد اﻟﺨﺎص ﺑﻚ و ﻫﻮ ﻳﺤﺘﻮي ﻋﻠﻰ
اﻟﺘﻄﺒﻴﻖ ﻛﻤﺎ ﺗﺴﺘﻄﻴﻊ ﺗﺤﺪﻳﺪ اول اﻟﺨﺎﺻﺔ ﺑﺎﻟﺘﻄﺒﻴﻖ و ﺑﺎﺧﺘﺼﺎر اﻟﻜﺜﻴﺮ ﻣﻦ اﻟﻤﻠﻔﺎت و اﻟﻤﺠﻠﺪات
ﻧﺎﻓﺬة ﺳﺘﻈﻬﺮ ﻟﻚ ﻋﻨﺪ ﻓﺘﺢ ﻳﺘﻀﻤﻦ ﺟﻤﻴﻊ اﻟﺼﻮر و اﻟﺨﺎﺻﺔ ﺑﺘﻄﺒﻴﻘﻚ ،ﺣﻴﺚ ﻫﻨﺎ
اﻟﺘﻄﺒﻴﻖ اﻫﻢ ﺷﻲء ﻋﻠﻴﻚ ﺗﺬﻛﺮه اﻟﺼﻮﺗﻴﺎت و اﻟﻨﺼﻮص و اﻟﺜﻴﻢ و ﺳﺘﺠﺪ ﺟﻤﻴﻊ اﻻﻛﻮاد و اﻟﻤﺼﺎدر
ﻫﻨﺎ ﻫﻮ اﻧﻪ ﻓﻲ ﺣﺎل إﺿﺎﻓﺔ اﻟﺘﻲ ﺳﺘﻈﻬﺮ ﻓﻲ واﺟﻬﺔ
أﻛﺘﻔﺘﻲ ﺟﺪﻳﺪ ﻓﻲ ﻣﺸﺮوﻋﻚ اﻟﺘﻄﺒﻴﻖ ،و ﻳﺘﺄﻟﻒ ﻫﺬا اﻟﻤﺠﻠﺪ وﻫﻮ ﻳﺤﺘﻮي ﻋﻠﻰ ﻣﻠﻒ اﻟﺠﺎﻓﺎ
ﻋﻠﻴﻚ إﺿﺎﻓﺘﻪ ﻓﻲ ﻣﻠﻒ Manifest ﻣﻦ ﻋﺪة ﻣﺠﻠﺪات ﻓﺮﻋﻴﺔ اﻟﺮﺋﻴﺴﻲ MainActivity.javaوﻫﻮ
وﻫﻮ ﻳﺤﺘﻮي ﻋﻠﻰ اﻟﺼﻮر وﻫﻮ ﻳﺤﺘﻮي ﻋﻠﻰ اﻟﻤﺆﺛﺮات وﻫﺬا اﻟﻤﻠﻒ ﻳﺤﺘﻮي ﻋﻠﻰ اﻟﻜﻮد
اﻟﺘﻲ ﺳﻴﺘﻢ اﺳﺘﺨﺪاﻣﻬﺎ ﻓﻲ ﺳﻴﺘﻢ اﻟﺘﻲ اﻟﺤﺮﻛﻴﺔ اﻟﺒﺮﻣﺠﻲ و ﻛﻼس اﻻﻛﺘﻔﺘﻲ و اﻟﺘﻲ
اﻟﺘﻄﺒﻴﻖ ﺑﺎﻹﺿﺎﻓﺔ اﻟﻰ اﺳﺘﺨﺪاﻣﻬﺎ ﻓﻲ اﻟﺘﻄﺒﻴﻖ ﺳﻨﻜﺘﺐ ﺑﺪاﺧﻠﻬﺎ اﻷﻛﻮاد و اﻷواﻣﺮ
اﻟﺼﻮر و ﺧﻠﻔﻴﺔ اﻟﺘﻄﺒﻴﻖ… اﻟﺒﺮﻣﺠﻴﺔ ﺑﻠﻐﺔ اﻟﺠﺎﻓﺎ ﻟﻠﻌﻨﺎﺻﺮ
وﻫﻮ ﻳﺤﺘﻮي ﻋﻠﻰ اﻟﻘﻮاﺋﻢ اﻟﻤﻮﺟﻮدة ﻓﻲ ﻣﻠﻒ activity_main.xml
اﻟﺨﺎﺻﺔ ﺑﻤﻠﻒ اﻟـ XML اﻟﺘﻲ ﺳﻴﺘﻢ اﺳﺘﺨﺪاﻣﻬﺎ ﻓﻲ
ﻣﻠﻒ واﺟﻬﺔ اﻟﺘﻄﺒﻴﻖ وﻫﺬا اﻟﺘﻄﺒﻴﻖ ﻟﻠﺘﻨﻘﻞ ﺑﻴﻦ ﺷﺎﺷﺎت وﻫﻮ ﻳﺤﺘﻮي ﻋﻠﻰ اﻟﻌﺪﻳﺪ ﻣﻦ:
اﻟﻤﻠﻒ ﻳﻌﺘﻤﺪ ﻋﻠﻰ XMLو اﻟﺘﻄﺒﻴﻖ وﺧﻴﺎراﺗﻪ اﻷﺧﺮى اﻟﻤﻠﻔﺎت و ﻟﻌﻞ ﻣـﻦ اﻫﻤﻬﺎ ﻣﻠﻒ
وﺗﺴﺘﺨﺪم ﻣﻠﻔﺎت XML و اﻟﺬي اﻟـ
)Build.gradle(module:app
أﻳﻘﻮﻧﺎت ﻣﻠﻒ وﻫﻮ وﻫﻮ ﻳﺤﺘﻮي ﻋﻠﻰ ﻣﻠﻒ ﻳﺘﻀﻤﻦ أﻗﻞ إﺻﺪار ﺳﻴﻌﻤﻞ ﻋﻠﻴﻪ
اﻟﺘﻄﺒﻴﻖ ﻛﻤﺎ ﻳﻈﻬﺮ ﻓﻲ اﻟﻘﻴﻢ و اﻟﻨﺼﻮص ﻣﻠﻒ اﻟﺜﻴﻢ ﺗﻄﺒﻴﻘﻚ و رﻗﻢ اﻹﺻﺪار و إﺳﻢ
ﻣﺘﺠﺮ اﻟﺘﻄﺒﻴﻘﺎت أو ﻋﻨﺪ اﻟﺨﺎﺻﺔ ﺑﺎﻟﺘﻄﺒﻴﻖ ﺑﺎﻹﺿﺎﻓﺔ اﻹﺻﺪار اﻟﺨﺎص ﺑﺘﻄﺒﻴﻘﻚ
ﺗﻨﺰﻳﻞ اﻟﺘﻄﺒﻴﻖ ﻓﻲ اﻟﺠﻬﺎز اﻟﻰ ﻣﻠﻒ ﻗﻴﻢ اﻻﻟﻮان
18
ﻓﺎﺋﺪة ﻓﺼﻞ اﻟﻜﻮدات javaﻋﻦ Resأﻧﻪ ﻳﻤﻜﻨﻨﺎ ﺗﻮﻓﻴﺮ ﻣﻮارد ﺑﺪﻳﻠﺔ ﻟﺠﻌﻞ اﻟﺘﻄﺒﻴﻖ ﻳﺒﺪو أﻓﻀﻞ ﺑﺈﺧﺘﻼف اﻷﺟﻬﺰة ،ﻓﻠﻮ أردﻧﺎ
ﺻﻮر وأﻳﻘﻮﻧﺎت ﻟﺸﺎﺷﺎت أﻛﺒﺮ ،ﻳﻤﻜﻨﻨﺎ ﺗﻮﻓﻴﺮﻫﺎ ﻓﻲ ﻣﺠﻠﺪ اﻟﺮﺳﻮﻣﻴﺎت drawableوﺳﻴﺘﺨﺎر اﻟﺘﻄﺒﻴﻖ اﻷﺣﺠﺎم اﻟﻤﻨﺎﺳﺒﺔ.
ﻟﻮ أردﻧﺎ ﺗﺮﺟﻤﺔ اﻟﻨﺼﻮص إﻟﻰ ﻟﻐﺔ أﺧﺮى ﻓﺄﻧﻪ ﺳﻴﻜﻮن ﺳﻬﻼ إذا ﻣﺎ ﺗﻢ وﺿﻊ اﻟﻨﺼﻮص ﻓﻲ ﻣﻠﻒ strings.xmlوﻣﻦ ﺛﻢ
ﺗﺮﺟﻤﺘﻬﺎ واﻟﺘﻄﺒﻴﻖ ﻳﺨﺘﺎر اﻟﻠﻐﺔ اﻟﻤﻨﺎﺳﺒﺔ ﺑﺤﺴﺐ ﻟﻐﺔ ﺟﻬﺎز اﻟﻤﺴﺘﺨﺪم.
ﻋﻨﺪﻣﺎ ﻳﺘﻢ ﺑﻨﺎء اﻟﺘﻄﺒﻴﻖ داﺧﻞ اﻷﻧﺪرﻳﻮد اﺳﺘﻮدﻳﻮ ﻓﺈن ﻫﻨﺎك أداة ﺗﺴﻤﻰ AAPTﺗﻘﻮم ﺑﺘﻮﻟﻴﺪ ﺻﻨﻒ اﺳﻤﻪ R.java
ﻳﺤﺘﻮي ﻫﺬا اﻟﺼﻨﻒ ﻋﻠﻰ أرﻗﺎم ﻣﻌﺮﻓﺔ ﻟﻜﻞ اﻟﻤﻮارد اﻟﻤﺤﺘﻮاه ﻓﻲ ﻣﺠﻠﺪ Resﺗﺘﻢ أرﺷﻔﺘﻬﺎ ﻓﻲ ﻫﺬا اﻟﻤﻠﻒ ﻟﻴﺴﻬﻞ
اﻹﺷﺎرة إﻟﻰ اﻟﻤﻮارد ﻋﻦ ﻃﺮﻳﻖ رﻗﻢ ﺗﻌﺮﻳﻔﻬﺎ
ﺗﺮﺗﻜﺰ ﺻﻴﻐﺔ اﺳﺘﺨﺪام اﻟﻤﻌﺮف ﻓﻲ اﻟﻜﻮدات اﻟﺒﺮﻣﺠﻴﺔ ﻋﻠﻰ ﻧﻮع اﻟﻤﻮرد ،ﻣﺜﻼ ﻟﻜﻞ اﻟﻤﻮارد اﻟﺮﺳﻮﻣﻴﺔ ﻧﺴﺘﺨﺪم ﻫﺬا
اﻟﻨﻤﻂ اﺳﻢ اﻟﺼﻮرة R.drawable.ﻣﺜﺎل R.drawable.coder :واﺳﻢ اﻟﺼﻮرة ﻫﻨﺎ ﻳﻜﺘﺐ ﻣﻦ دون ﻛﺘﺎﺑﺔ إﻣﺘﺪاد اﻟﺼﻮرة
وﻟﻜﻞ اﻟﻨﺼﻮص اﻟﻤﻜﺘﻮﺑﺔ ﻓﻲ ﻣﻠﻒ strings.xmlﻳﺘﻢ اﻹﺷﺎرة إﻟﻴﻬﺎ ﻫﻜﺬا اﺳﻢ اﻟﻮﺳﻢ R.string.
)داﺧﻞ اﻟﻤﻠﻒ (strings.xml )داﺧﻞ ﻣﻠﻒ اﻟﺠﺎﻓﺎ( ﻣﺜﺎل:
><string name="title">welcome</string R.string.title
ﻳﻤﻜﻦ اﻹﺷﺎرة إﻟﻰ اﻟﻤﻮارد ﻛﺬﻟﻚ ﻓﻲ ﻣﻠﻔﺎت واﺟﻬﺔ اﻟﺘﻄﺒﻴﻖ XMLﻓﺄداة ﺑﻨﺎء ﻣﻠﻔﺎت XMLCواﺳﻤﻬﺎ ﺗﺴﺘﺨﺪم ﻫﺬه
اﻟﻄﺮﻳﻘﺔ ﻓﻲ اﻹﺷﺎرة إﻟﻰ اﻟﻤﻮارد اﺳﻢ اﻟﺼﻮرة @drawable/ﻣﺜﺎل@drawable/coder :
@string/title اﺳﻢ اﻟﻮﺳﻢ @string/ﻣﺜﺎل:
XMLC - Extensible Markup Language Compiler
19
؟JAVA إﻟﻰXML ﻣﺎ اﻟﺬي ﻳﺤﺼﻞ ﻣﻦ
<LinearLayout
..
android:layout_width="match_parent" OnCreate() {
android:layout_height="match_parent">
...
<TextView setContentView(R.layout.activity_main);
android:layout_width="wrap_content"
android:layout_height="wrap_content" ...
android:text="Hello World!" /> MainActivity
<LinearLayout }
android:layout_width="match_parent"
android:layout_height="match_parent"> ﻳﺸﻴﺮ ﻫﺬا اﻟﺴﻄﺮ إﻟﻰ ﻣﻠﻒ 4 ﻳﻨﻔــــﺬ اﻟﺘﻄﺒﻴــــﻖ أواﻣــــﺮ 3 Initialized
<TextView
android:layout_width="wrap_content" اﻟﻤﻮارد ﻟﻌﺮض ﻋﻨﺎﺻﺮه ﻓﻲ ﺑﺎﻟﺘﺮﺗﺘﺐOnCreate() اﻟﻄﺮﻳﻘﺔ
android:layout_height="wrap_content"
android:text="Hello World!" /> ﺷﺎﺷﺔ اﻟﻨﺸـﺎط ﻣـﻦ اﻷﻋﻠﻰ إﻟــﻰ اﻷﺳﻔـــﻞ
<Button
android:layout_width="wrap_content" 1
android:layout_height="wrap_content"
android:text="Price"/>
2
<Button ﻳﺒﺪأ اﻟﺘﻄﺒﻴﻖ اﻟﻨﺸـــﺎط ﻳﻀﻐﻂ اﻟﻤﺴﺘـــﺨﺪم
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Order" اﻟﺮﺋﻴﺴﻲ ﻓﻲ اﻟﻮاﺟﻬﺔ ﻋﻠﻰ أﻳﻘﻮﻧﺔ اﻟﺘﻄﺒﻴﻖ
android:OnClick="submitOrder"/>
</LinearLayout> Parsing
MainActivity
LinearLayout اﻷوﺳﻤﺔ إﻟﻰInflate ﻳﺘﻢ ﺗﺤﻮﻳﻞ 6 lorem ipsum dolor sit amet consectetur adipiscing elit
curabitur eget pretium tortor eget accumsan diam
ﻳﻌﺮﺿﻪ اﻟﻤﺴﺘﺨﺪم
TextView Button Button
Constructor ﻫﻨﺎك ﻃﺮﻳﻘﺔ ﻣﻀﻤﻨﺔ داﺧﻞ أﺻﻨﺎف اﻟﻜﺎﺋﻨﺎت ﺗﺴﺘﺨﺪم ﻟﻌﻤﻞ ﻧﺴﺦ ﻟﻠﺼﻨﻒ اﻟﺮﺋﻴﺴﻲ اﻟﻘﺎﻟﺐ وﺗﺴﻤﻰ
20
ﺗﺎﺑﻊ ﻛﺎﺋﻨﺎت ﺟﺎﻓﺎ JAVA OBJECTS
ﻛﻤﺎ ﺗﻢ اﻟﺘﻮﺿﻴﺢ ﻓﺈن اﻟـ constructorﻫﻲ ﻃﺮﻳﻘﺔ أﺳﺎﺳﻴﺔ ﻣﻮﺟﻮدة ﻓﻲ ﺻﻨﻒ اﻟﻜﺎﺋﻦ وﻳﻌﺘﻤﺪ ﻧﻮع ﺑﻴﺎﻧﺎت ﻣﻌﺎﻣﻼت
اﻹدﺧﺎل ) input Arguments (argsﻋﻠﻰ ﻧﻮع اﻟﺒﻴﺎﻧﺎت ﻓﻲ اﻟﻄﺮﻳﻘﺔ اﻷﺳﺎﺳﻴﺔ
اﻟﻤﺘﻐﻴﺮ ﻟﻤﻌﺎﻣﻼت اﻹدﺧﺎل اﻟﻤﺴﺘﺨﺪم ﻓﻲ اﻷﻣﺜﻠﺔ اﻟﺴﺎﺑﻘﺔ ﻫﻮ ﻣﻦ ﻧﻮع contextوﻫﻮ ﻳﺤﺪد ﻟﻠـ constructorاﻟﻨﺸﺎط أو
اﻹﻃﺎر اﻟﺬي ﺳﻴﺘﻢ إﻧﺸﺎء instanceﻣﻦ اﻟﻜﺎﺋﻦ ﻓﻴﻪ
2ﻋﻤﻞ ﻛﺎﺋﻦ ﺟﺪﻳﺪ ﺑﺈﺳﺘﺨﺪام ﻃﺮﻳﻘﺔ اﻟﻤﺼﻨﻊ factory method
Initial Value اﻟﻘﻴﻤﺔ اﻟﻤﺒﺪﺋﻴﺔ
Object Data type Variable Name
ﻧﻮع اﻟﺒﻴﺎﻧﺎت اﻟﻜﺎﺋﻦ اﺳﻢ اﻟﻤﺘﻐﻴﺮ = Object Data type
ﻧﻮع اﻟﺒﻴﺎﻧﺎت اﻟﻜﺎﺋﻦ . Factory Method Name
اﺳﻢ ﻃﺮﻳﻘﺔ اﻟﻤﺼﻨﻊ )(input args ;
Factory Method Name
ﺗﺴﺘﺨﺪم ﻟﺘﺤﺪﻳﺪ أن اﻟﻄﺮﻳﻘﺔ اﻟﻤﺴﺘﺨﺪﻣﺔ ﻟﻦ ﻳﺘﻢ ﺗﻮرﻳﺜﻬﺎ ﻣﻦ اﻟﺼﻨﻒ Classاﻷﺳﺎﺳﻲ ﺑﻞ ﺳﻴﺘﻢ ﺗﻌﺮﻳﻒ ﻃﺮﻳﻘﺔ
@override
ﺟﺪﻳﺪة ﺑﻨﻔﺲ اﻹﺳﻢ ﻣﻊ إﺿﺎﻓﺔ ﻣﺤﺘﻮﻳﺎت أﺧﺮى ﻏﻴﺮ اﻷﺳﺎﺳﻴﺔ
21
اﻟﺨﻄﻮط اﻟﺤﻤﺮاء ﻓﻲ اﻟﺘﺼﻤﻴﻢ RED LINES
ﻳﺘﻢ اﺳﺘﺨﺪام ﺑﻴﺎﻧﺎت اﻟﺨﻄﻮط اﻟﺤﻤﺮاء ﻣﻦ ﻗﺒﻞ ﻣﻄﻮري اﻷﻧﺪرﻳﻮد ﻟﺘﻨﺴﻴﻖ واﺟﻬﺔ اﻟﺘﻄﺒﻴﻖ
اﺳﺘﻨﺎدا ﻋﻠﻴﻬﺎ ،ﻓﻴﺘﻢ ﺗﺤﺪﻳﺪ ﺣﺠﻢ اﻟﺨﻂ ،اﻷﻟﻮان ،اﻟﻬﻮاﻣﺶ ،واﻟﺴﺘﺎﻳﻞ وﻛﻞ اﻟﺒﻴﺎﻧﺎت اﻟﺨﺎﺻﺔ
اﻟﺘﻲ ﺗﺘﺤﻜﻢ ﻓﻲ ﻣﻈﻬﺮ اﻟﺘﻄﺒﻴﻖ
ﻳﻤﻜﻦ ﺗﻔﻌﻴﻞ ﺧﺎﺻﻴﺔ Red Linesﻹﻇﻬﺎر اﻟﺨﻄﻮط اﻟﺤﻤﺮاء ﻓﻲ ﺟﻬﺎز اﻷﻧﺪرﻳﻮد اﻟﺨﺎص ﺑﻚ
ﺑﺘﻔﻌﻴﻞ ﺧﻴﺎر إﻇﻬﺎر ﺣﺪود اﻟﺘﺨﻄﻴﻂ Show layout boundriesواﻟﻤﻮﺟﻮدة ﻓﻲ ﺧﻴﺎرات اﻟﻤﻄﻮر
ﻛﻤﺎ ﻓﻲ اﻟﺼﻮرة
></ScrollView
ﻧﺘﺤﺪث ﻋﻦ ﻣﻮﺿﻮع أﻧﻮاع ﺑﻴﺎﻧﺎت اﻟﻤﺘﻐﻴﺮات ﻣﻦ ﻧﻮع رﻗﻢ int, float, long, ....ﻧﻨﺒﻪ أﻧﻪ ﻻ ﻳﻮﺟﺪ ﻧﻮع ﺑﻴﺎﻧـــﺎت ﺟﺎﻓـﺎ
اﻋﺘﻴﺎدي primitiveﻳﻘﺒﻞ ﻓﻘﻂ أرﻗﺎم ﻣﻮﺟﺒﺔ ،ﺑﻞ ﺟﻤﻴﻌﻬﺎ ﺗﻘﺒﻞ اﻟﻤﻮﺟﺐ واﻟﺴﺎﻟﺐ ،ﻟﻜﻦ إذا اﺣﺘﺠﻨﺎ ﻓﻘﻂ إﻟﻰ أرﻗﺎم
ﻣﻮﺟﺒﺔ ﻓﻴﻤﻜﻨﻨﺎ اﻟﺘﺤﻜﻢ ﻓﻲ ﺗﺪﻓﻖ اﻟﺒﻴﺎﻧﺎت Control Flowﻋﻦ ﻃﺮﻳﻖ اﻟﺠﻤﻠﺔ اﻟﺸﺮﻃﻴﺔ If / else Statment
{ )if (quantity == 1 ﺳﻴﺘﻜﻔﻞ ﻫﺬا اﻟﺴﻄﺮ ﺑﻌﺪم
اﻟﻮﺻﻮل إﻟﻰ اﻷﺳﻄﺮ أﺳﻔﻠﻪ
ﻓﺮﺿﺎ ﻛﺎن ﻟﺪﻳﻨﺎ ﻣﺘﻐﻴﺮ اﺳﻤﻪ quantityوأردﻧﺎ إﻧﻘﺎص ﻗﻴﻤﺘﻪ
;return
وﺑﺎﻟﺘﺎﻟﻲ ﺗﺒﻘﻰ ﻗﻴﻤﺔ اﻟﻤﺘﻐﻴﺮ ﺑﻤﻘﺪار واﺣﺪ ﻓﺴﻨﺴﺘﺨﺪم اﻟﺴﻄﺮ ; quantity--ﺑﻌﺪ ذﻟﻚ
} أﻛﺒﺮ ﻣﻦ ﺻﻔﺮ
;quantity-- ﻟﻜﻲ ﻧﺘﺠﻨﺐ اﻟﺤﺼﻮل ﻋﻠﻰ ﻗﻴﻤﺔ ﺳﺎﻟﺒﺔ ﻧﺴﺘﺨﺪم ﻫﺬه
22
أﺳﻠﻮب اﻟﻤﻘﺼﺪ أو اﻟﻮﺟﻬﺔ INTENT
اﻟـ Intentﻫﻮ أﺣﺪ اﻻﻣﻮر اﻷﺳﺎﺳﻴﺔ ﻷي ﺗﻄﺒﻴﻖ أﻧﺪروﻳﺪ ،وﻻ
ﻳﻜــﺎد ﻳﺨﻠﻮ أي ﺗﻄﺒﻴﻖ اﻧـﺪروﻳﺪ ﻣــﻦ اﺳﺘﺨــﺪاﻣﻪ
وﻳﺴﺘﺨﺪم ﻻرﺳﺎل اﻟﺒﻴﺎﻧﺎت وﻟﻼﻧﺘﻘﺎل ﺑﻴﻦ ﻣﻜﻮﻧﺎت اﻟﺘﻄﺒﻴﻖ
وﻓﻲ ﻫﺬا اﻟﻨﻮع ﻳﺘﻢ ﻣﻌﺮﻓﺔ اﻟﻤﻜﻮن اﻟﺬي ﺳﻴﻘﻮم وﻓﻲ ﻫﺬا اﻟﻨﻮع ﻻ ﻳﺘﻢ ﺗﺤﺪﻳﺪ اﻟﻤﻜﻮن اﻟﺬي ﺳﻴﺴﺘﻘﺒﻞ
ﺑﺎﺳﺘﻘﺒﺎل ﻫﺬا اﻟـ Intentﻛﻤﺜﺎل :ﻋﻨﺪﻣﺎ ﻳﺤﺘﻮي اﻟﺘﻄﺒﻴﻖ ﻫﺬا اﻟـ Intentﻛﻤﺜﺎل ﻋﻨﺪﻣﺎ ﻧﺮﻳﺪ أن ﻧﺮﺳﻞ إﻳﻤﻴﻞ
ﻋﻠﻰ ﺷﺎﺷﺘﻴﻦ وﻧﺮﻳﺪ اﻻﻧﺘﻘﺎل ﻣﻦ اﻟﺸﺎﺷﺔ اﻻوﻟﻰ إﻟﻰ ﺑﺎﺳﺘﺨﺪام Intentﻓﺈﻧﻨﺎ ﺳﻨﻘﻮم ﺑﺈﺿﺎﻓﺔ ﺑﻴﺎﻧﺎت إﺿﺎﻓﻴﺔ
اﻟﺸﺎﺷﺔ اﻟﺜﺎﻧﻴﺔ ﻓﺈﻧﻨﺎ ﻧﻘﻮم ﺑﺈﻋﻄﺎء اﺳﻢ اﻟﺸﺎﺷﺔ وﻳﻘﻮم ﻧﻈﺎم اﻟﺘﺸﻐﻴﻞ ﺑﺘﺤﺪﻳﺪ اﻟﻤﻜﻮﻧﺎت اﻟﺘﻲ
اﻟﺜﺎﻧﻴﺔ ﻟﻠـ Intentﻟﻴﻘﻮم ﺑﺎﻻﻧﺘﻘﺎل اﻟﻴﻬﺎ ﺑﺈﻣﻜﺎﻧﻬﺎ اﺳﺘﻘﺒﺎل ﻫﺬا اﻟـ Intentوإرﺳﺎل إﻳﻤﻴﻞ
ﻛﻤﺎ ذﻛﺮﻧﺎ أن ﻓﻲ Intentﻻ ﻳﺘﻢ ﺗﺤﺪﻳﺪ أﺳﻢ اﻟﻤﻜﻮن
اﻟﺬي ﻧﺮﻳﺪ اﻟﻮﺻﻮل اﻟﻴﻪ
ﺳﺆال ﻳﻀﻊ ﻧﻔﺴﻪ ..ﻛﻴﻒ ﻳﺘﻢ اﻟﻮﺻﻮل اﻟﻴﻪ أذن؟؟
ﻳﺘﻢ اﻟﻮﺻﻮل اﻟﻴﻪ ﻣﻦ ﺧﻼل ﺗﺤﺪﻳﺪ واﺣﺪ ﻋﻠﻰ اﻻﻗﻞ ﻣﻦ
أرﺑﻌﺔ ﻣﻜﻮﻧﺎت ﻟـ Intentوﻣﻦ ﺗﻠﻚ اﻟﻤﻜﻮﻧﺎت ﻳﺘﻢ ﺗﺤﺪﻳﺪ
اﻟﻮﻇﻴﻔﺔ اﻟﺘﻲ ﺳﻴﻘﻮم ﺑﻬﺎ اﻟـ Intent
وﻫـــﻮ اﻟﻌﻤـــﻞ اﻟﻤﻄﻠــﻮب ﻣــﻦ ﻫــﺬا
اﻟـ Intentﻛـﻤﺜﺎل :ﻋﻤﻞ اﺗﺼﺎل,إرﺳﺎل اﻳﻤﻴﻞ، ACTION
ﻋﺮض ﺻﻔﺤﺔ وﻳﺐ إﻟﻰ آﺧﺮه
Explicit Intent ﻣﺜﺎل :اﻹﻧﺘﻘﺎل إﻟﻰ اﻟﻨﺸﺎط اﻟﺜﺎﻧﻲ ﻋﺒﺮ اﺳﺘﺨﺪام
1 2 3
ﻧﻮع اﻟﺒﻴﺎﻧﺎت اﻟﻤﻄﻠﻮب اﻟﺘﻌﺎﻣﻞ ﻣﻌﻬﺎ
;)Intent i = new Intent(getApplicationContext(), ActivityTwo.class ﻛﻤﺜﺎل ﻋﻨﺪﻣﺎ ﻧﺮﻳﺪ ﻓﺘﺢ ﺻﻔﺤﺔ وﻳﺐ DATA
;)startActivity(i 4 ﻓﻨﺤﺪد ﻧﻮع اﻟﺒﻴﺎﻧﺎت ﻛـ URLﻛﻌﻨﻮان ﺻﻔﺤﺔ
ﺗﺤﺪﻳﺪ ﻧﻮع ﺑﻴﺎﻧﺎت اﻟﻜﺎﺋﻦ 1 اﻟﻮﻳﺐ اﻟﺘﻲ ﻧﺮﻳﺪ ﻓﺘﺤﻬﺎ
وﻫﻲ ﺑﻴﺎﻧﺎت إﺿﺎﻓﻴﺔ ﻳﺘﻢ إﺳﻨﺎدﻫﺎ ﻟﻬـﺬا
اﻟﻤﻌﺎﻣﻞ اﻷول ﻓﻲ Constructorاﻟـ intentوﻫﻮ ﻣﻦ 2 اﻟـ Intentﻛـ ) (Key/Valueﻣﺜﻼ ﻋﻨﺪﻣﺎ ﻧﻘﻮم
ﻧﻮع contextوﻫﻨﺎ ﺗﻢ اﺳﺘﺨﺪام contextاﻟﺘﻄﺒﻴﻖ
EXTRASﺑﺈﻧﺸﺎء Intentﻳﻔﺘﺢ ﺻﻔﺤﺔ وﻳﺐ ﻓﻨﺤﺪد
اﻟﻤﻌﺎﻣﻞ اﻟﺜﺎﻧﻲ ﻓﻲ Constructorاﻟـ intentوﻫﻮ ﻣﻦ 3 ﻋﻨﻮان اﻟﺼﻔﺤﺔ اﻟﺘﻲ ﻧﺮﻳﺪ ﻓﺘﺤﻬﺎ ،ﻳﺘﻢ
ﻧﻮع java classوﻫﻨﺎ ﺗﻢ اﺳﺘﺨﺪام ﺻﻨﻒ اﻟﻨﺸﺎط إﺳﻨﺎد ﻋﻨﻮان ﺗﻠﻚ اﻟﺼﻔﺤﺔ ﻫﻨﺎ
اﻟﺜﺎﻧﻲ ﻟﻺﻧﺘﻘﺎل إﻟﻴﻪ وﻫﻲ اﻟﻔﺌﺎت واﻟﻐﺮض ﻣﻨﻬﺎ ﺗﺤﺪﻳﺪ
ﻫـــﺬه اﻟﻄﺮﻳﻘـﺔ methodﺗﺴﺘﺨـﺪم ﻟﺒــﺪأ ﻋﻤﻠﻴـــﺔ 4 CATEGORYوﺗﻨﻈﻴﻢ ﻣﻜﻮﻧﺎت ،ﻛﻤﺜــﺎل :ﺗﺤﺪﻳــﺪ اﻟـ،
اﻟـ intentواﻹﻧﺘﻘﺎل إﻟﻰ اﻟﻨﺸﺎط اﻟﺜﺎﻧﻲ ﻓﻲ ﻫﺬه ﺗﺼﻨﻴﻒ اﻟﻤﻜﻮﻧﺎت ﻋﻠﻰ ﺣﺴﺐ اﻟﻮﻇﻴﻔﺔ
اﻟﺤﺎﻟﺔ وﻏﻴﺮﻫﺎ
23
IMPLICIT INTENT أﻣﺜﻠﺔ ﻋﻠﻰ
4 3 2 1
24
اﻟﺘﻨﺴﻴﻘﺎت STYLES
ﺗﺴﺘﺨﺪم ﻣﻮارد اﻟﺘﻨﺴﻴﻘﺎت Stylesﻟﺤﻔﻆ ﺗﻨﺴﻴﻖ اﻟﻌﻨﺎﺻﺮ ﻓﻲ ﻣﻜﺎن واﺣﺪ ﻣﻤﺎ ﻳﺴﺎﻋﺪ ﻓﻲ ﺣﺎل أردﻧﺎ ﺗﻌﺪﻳﻞ اﻟﺘﻨﺴﻴﻖ
اﻟﺮﺟﻮع إﻟﻰ ﻣﻜﺎن واﺣﺪ وﺗﻐﻴﻴﺮه ﻓﻴﺘﻐﻴﺮ اﻟﺘﻨﺴﻴﻖ ﻓﻲ ﻛﻞ اﻟﺘﻄﺒﻴﻖ وﻫﻲ ﺗﺸﻤﻞ اﻷﻃﻮال ،اﻟﻬﻮاﻣﺶ ،اﻟﺤﺸﻮ ،اﻷﻟﻮان،
أﺣﺠﺎم وأﻟﻮان اﻟﺨﻄﻮط وﻏﻴﺮﻫﺎ
>?"<?xml version="1.0" encoding="utf-8
><resources ﻣﺜﺎل :ﻧﻌﺮف ﻫﻨﺎ ﻟﻮن اﻟﺨﻂ ﻓﻲ اﻟﻤﻠﻒ styles.xml
>"<style name="GreenText" parent="TextAppearance.AppCompat اﻟﻤﻮﺟﻮد ﻓﻲ اﻟﻤﻮارد
><item name="android:textColor">#00FF00</item
ﺛﻢ ﻧﺤﺬف ﻣﻴﺰة ﻟﻮن اﻟﺨﻂ ﻓﻲ ﻋﻨﺼﺮ اﻟﻌﺮض
></style
ﻧﻀﻊ اﻟﻤﻴﺰة styleﻣﻜﺎﻧﻬﺎ ،ﻓﺒﻬﺬه اﻟﻄﺮﻳﻘﺔ
></resources
أﺻﺒﺤﺎ ﻫﻨﺎك ارﺗﺒﺎط ﺑﻴﻦ ﻋﻨﺼﺮ وﻣﻠﻒ اﻟﺘﻨﺴﻴﻖ
<TextView ﺑﺎﻟﻨﺴﺒﺔ ﻟﻠﻮن اﻟﺨﻂ
"style="@style/GreenText
Theme
>... /
25
ﻣﻠﻒ اﻟﻮاﺟﻬﺔ MAINFEST.XML
وﻫﻮ أول ﻣﻠﻒ ﻳﺘﻢ ﺗﺸﻐﻴﻠﻪ ﻋﻨﺪ ﻓﺘﺢ اﻟﺘﻄﺒﻴﻖ وﻳﻌﺘﺒﺮ ﺟﺪول ﻣﺤﺘﻮﻳﺎت ﻟﻌﻨﺎﺻﺮ اﻟﺘﻄﺒﻴﻖ ﺑﺤﻴﺚ ﻳﻌﺮف ﻓﻴﻪ اﻟﺸﺎﺷﺎت
اﻟﻤﻮﺟﻮدة واﻷذوﻧﺎت ﻹﺳﺘﺨﺪام ﻣﻮارد اﻟﺠﻬﺎز اﻷﻧﺪرﻳﻮد واﻟﺘﻲ ﺳﻴﺤﺘﺎﺟﻬﺎ اﻟﺘﻄﺒﻴﻖ ﻣﺜﻼ اﻟﺴﻤﺎح ﻟﻠﺘﻄﺒﻴﻖ ﺑﻌﻤﻞ اﺗﺼﺎل
أو اﻟﺪﺧﻮل إﻟﻰ اﻹﻧﺘﺮﻧﺖ
ﻓﻲ اﻟﺼﻔﺤﺔ اﻟﺴﺎﺑﻘﺔ ﺗﻢ ﺗﺤﺪﻳﺪ اﻟﺴﻤﺔ Themeﻟﺘﻨﺴﻴﻖ ﻋﻨﺎﺻﺮ اﻟﺘﻄﺒﻴﻖ وﻳﺘﻢ ﻫﺬا داﺧﻞ اﻟﻤﻠﻒ اﻟـ Mainfest.xml
ﺷﺮح أﻫﻢ اﻷوﺳﻤﺔ ﻓﻲ ﻣﻠﻒ Mainfest.xml
>?" <?xml version="1.0" encoding="utf-8رﻗﻢ إﺻﺪار اﻟﻜﻮد اﻟﻤﺼﺪر وﻫﺬه اﻟﺨﺎﺻﻴﺔ ﺧﺎﺻﺔ ﻓﻘﻂ
" <manifest xmlns:android="http://schemas.android.com/apk/res/androidﺑﺎﻟﻤﺒﺮﻣﺞ أو ﺑﻜﻮد اﻟﺒﺮﻧﺎﻣﺞ ،ﻳﻔﻀﻞ ﻋﻨﺪ ﺗﻌﺪﻳﻞ أى ﺳﻄﺮ
" android:versionCode="1ﻓﻰ اﻟﻜﻮد ان ﻳﺘﻢ ﺗﺤﺪﻳﺚ ﻫﺬه اﻟﺨﺎﺻﻴﺔ ﺣﺘﻰ ﻳﻤﻴﺰ
" android:versionName="1.0اﻟﻤﺒﺮﻣﺞ ﺑﻴﻦ اﻻﺻﺪارات اﻟﻤﺨﺘﻠﻔﺔ ﻣﻦ اﻟﻜﻮد اﺳﻢ ﺣﺰﻣﺔ اﻟﺘﻄﺒﻴﻖ
رﻗﻢ اﻹﺻﺪار اﻟﺨﺎص ﺑﺎﻟﻤﺴﺘﺨﺪم أو اﻟﺬي ﺳﻴﻈﻬﺮ ﻓﻰ >"package="com.example.myapp
ﻣﺘﺠﺮ ﺟﻮﺟﻞ ﺑﻼى وﻟﻴﺲ ﺿﺮورى ﺗﻐﻴﻴﺮه ﻛﻞ ﻣﺮة وﻟﻜﻦ
ﻫﺬا ﺣﺴﺐ إذا ﻛﺎن اﻟﺘﻐﻴﻴﺮ ﺟﻮﻫﺮي أو ﺛﺎﻧﻮي
> <uses-sdk android:minSdkVersion="15" android:targetSdkVersion="26" /رﻗﻢ ﻧﺴﺦ ﺣﺰم اﻷﻧﺪرﻳﻮد اﻟﺘﻲ ﺳﻴﺪﻋﻤﻬﺎ اﻟﺘﻄﺒﻴﻖ،
أﻗﻞ ﻧﺴﺨﺔ واﻟﻨﺴﺨﺔ اﻟﺤﺎﻟﻴﺔ ﻟﻠﺘﻄﺒﻴﻖ
> <uses-permission android:name="android.permission.INTERNET" /إﻋﻄﺎء اﻷذوﻧﺎت ﻟﻠﺘﻄﺒﻴﻖ ﻹﺳﺘﺨﺪام ﻣﻮادر اﻟﺠﻬﺎز،
<applicationﻣﺜﻞ اﻟﺴﻤﺎح ﻟﻠﺘﻄﺒﻴﻖ ﺑﺎﺳﺘﺨﺪام اﻹﻧﺘﺮﻧﺖ
اﻟﺴﻤﺎح ﺑﻌﻤﻞ ﻧﺴﺨﺔ اﺣﺘﻴﺎﻃﻴﺔ ﻣﻦ اﻟﺘﻄﺒﻴﻖ "android:allowBackup="true
ﻋﻨﺪ اﺧﺘﻴﺎر Backupﻣﻦ ﺧﻴﺎرات ﻟﻠﺠﻬﺎز
ﺗﺤﺪﻳﺪ أﻳﻘﻮﻧﺔ اﻟﺘﻄﺒﻴﻖ ﻣﻦ ﻣﻠﻒ اﻟﻤﻮارد mipmap "android:icon="@mipmap/ic_launcher
ﺗﺤﺪﻳﺪ أﻳﻘﻮﻧﺔ اﻟﺘﻄﺒﻴﻖ ﻣﻦ اﻟﻨﻮع اﻟﺪاﺋﺮي "android:roundIcon="@mipmap/ic_launcher_round
اﺳﻢ اﻟﺘﻄﺒﻴﻖ اﻟﺬي ﻳﻈﻬﺮ ﻟﻠﻤﺴﺘﺨﺪم "android:label="@string/app_name
ﺗﻔﻌﻴﻞ ﻣﺤﺎذاة اﻟﻴﻤﻴﻦ إﻟﻰ اﻟﻴﺴﺎر ﻓﻲ اﻟﺘﻄﺒﻴﻖ "android:supportsRtl="true
اﺳﻢ اﻟﺴﺘﺎﻳﻞ اﻟﺬي ﺳﻴﺴﺘﺨﺪم ﻟﺘﻨﺴﻴﻖ اﻟﺘﻄﺒﻴﻖ >"android:theme="@style/AppTheme
------------------------------------------------------ﻗﺴﻢ ﻣﻌﻠﻮﻣﺎت اﻟﺸﺎﺷﺎت ---------- Activities
ﺗﺤﺪﻳﺪ ﻣﺴﺎر واﺳﻢ اﻟﺸﺎﺷﺔ >"<activity android:name=".MainActivity
><intent-filter
اﺳﺘﺨﺪام اﻟـ Intentﻟﻠﺘﺼﺮﻳﺢ أن ﻫﺬه ﻫﻲ اﻟﺸﺎﺷﺔ ><action android:name="android.intent.action.MAIN" /
اﻟﺮﺋﻴﺴﻴﺔ وﻳﻼﺣﻆ اﺳﺘﺨﺪام actionو category ><category android:name="android.intent.category.LAUNCHER" /
></intent-filter
></activity
></application
></manifest
26
اﻟﻤﻮارد اﻟﺒﺪﻳﻠﺔ ALTERNATIVE RESOURCES
ﻟﺠﻌﻞ اﻟﺘﻄﺒﻴﻖ ﻳﻌﻤﻞ ﺑﺸﻜﻞ ﺟﻴﺪ أﻧﻮع اﻷﺟﻬﺰة
اﻟﻤﺴﺘﺨﺪﻣﺔ ﻣﺜﻞ ﻫﺎﺗﻒ ،اﻟﺠﻬﺎز اﻟﻠﻮﺣﺔ ،اﻟﺤﺎﺳﺐ اﻵﻟﻲ
وﻏﻴﺮﻫﺎ ،أﺣﺪ اﻟﻨﻘﺎط اﻟﻤﻬﻤﺔ اﻟﺘﻲ ﻳﺠﺐ ﻣﺮاﻋﺎﺗﻬﺎ ﻫﻮ
ﺗﺮﺟﻤﺔ اﻟﺘﻄﺒﻴﻖ
ﺗﻜﻤﻦ ﻓﺎﺋﺪة ﻓﺼﻞ اﻟﻤﻮارد ﻋﻦ ﻛﻮدات ﺟﺎﻓﺎ ﺑﺄﻧﻪ ﺳﻴﻜﻮن
ﻣﻦ اﻟﺴﻬﻞ ﺗﺤﺪﻳﺪ ﻣﻮارد ﺑﺪﻳﻠﺔ ﻟﻠﻐﺎت ﻣﺨﺘﻠﻔﺔ وﻛﺬﻟﻚ
ﻷﺣﺠﺎم ﺷﺎﺷﺎت وأﻧﻈﻤﺔ أﻧﺪرﻳﻮد ﻣﺨﺘﻠﻔﺔ ﻋﻨﺪ اﻟﺤﺎﺟﺔ
27
ﺗﺎﺑــﻊ اﻟﻤﻮارد اﻟﺒﺪﻳﻠﺔ ALTERNATIVE RESOURCES
ﻟﻠﺘﺬﻛﻴﺮ ﺑﺄن ﻣﻠﻒ اﻟﻨﺼﻮص strings.xmlﻳﺴﺘﺨﺪم ﻟﻮﺿﻊ اﻟﻨﺼﻮص ﻓﻴﻪ ﺑﺪل وﺿﻌﻬﺎ ﻓﻲ ﻛﻮدات ﺟﺎﻓﺎت أو ﻓﻲ واﺟﻬﺔ
اﻟﺘﻄﺒﻴﻖ XML
ﻫﺬه اﻟﻤﻴﺰة ﺗﺤﻤﻞ ﺧﺎﺻﻴﺔ اﻟﻨﺺ وﻗﺪﻛﺘﺒﺖ ﻣﺒﺎﺷﺮ ،وﻳﺴﻤﻰ ﻫﺬا اﻟﻨﻮع hardcoded
وﻳﺼﻌﺐ ﺗﻌﺪﻳﻠﻬﺎ ﻓﻲ اﻟﻤﺴﺘﻘﺒﻞ وﺧﺎﺻﺔ إذا ﻛﺜﺮت اﻟﻨﺼﻮص
ﻫﻨﺎ ﻛﺘﺒﺖ اﻟﻤﻴﺰة ﻧﻔﺴﻬﺎ ﺑﻌﻤﻞ ﻣﺮﺟﻊ ﻟﻬﺎ ﻣﻦ ﻣﻠﻒ strings.xmlﻓﺒﺎﻟﺘﺎﻟﻲ
ﺳﻴﺴﻬﻞ ﺗﺮﺟﻤﺘﻬﺎ أو ﺗﻌﺪﻳﻠﻬﺎ
ﺑﻌﺾ اﻷﺣﻴﺎن ﻧﺤﺘﺎج إﻟﻰ ﻋﺪم ﺗﺮﺟﻤﺔ ﻗﺴﻢ ﻣﻌﻴﻦ ﻣﻦ اﻟﻨﺼﻮص أو ﻋﺪة ﻛﻠﻤﺎت ﻓﻠﻌﻤﻞ ﻫﺬا ﻧﺴﺘﺨﺪم ﻫﺬه اﻟﻮﺳﻮم ﻓﻲ
ﻣﻠﻒ strings.xml
"xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2
وﻫﺬا اﻟﺴﻄﺮ ﻳﺤﺪد أﻧﻨﺎ ﺳﻨﺴﺘﺨﺪم ﻣﺴﺎﺣﺔ اﻹﺳﻢ namespaceاﻟﺨﺎﺻﺔ ﺑـ xliff
><string name="order_summary_name">Name: <xliff:g id="name" example="Amy">%s</xliff:g></string
وﻫﻨﺎ ﺳﻮف ﻳﻈﻬﺮ اﻟﻨﺺ Name:وﺑﻌﺪه اﺳﺘﺨﺪﻣﻨﺎ ﻣﻴﺰة xliffﻓﻤﺎ ﺳﻨﻜﺘﺒﻪ ﻫﻨﺎ ﻟﻦ ﻳﺘﻢ ﺗﺮﺟﻤﺘﻪ
ﻓﻲ اﻟﻤﺜﺎل ﻫﻨﺎك ﻋﺪة أﺻﻨﺎف ﻣﻦ اﻟﻜﻠﻤﺎت ﻳﺠﺐ وﺿﻌﻬﺎ ﻓﻲ ﻗﺎﺋﻤﺔ ﺑﺎﻟﻠﻐﺔ اﻹﻧﺠﻠﻴﺰﻳﺔ وﺑﺎﻟﻠﻐﺔ Miwok
ﻋﺮض ﺻﻮر ﻓﻲ اﻟﻘﺎﺋﻤﺔ 4 ﻋﺮض زر ﺗﺸﻐﻴﻞ اﻟﺼﻮت 3 ﻋﺮض ﻗﺎﺋﻤﺔ ﻛﻠﻤﺎت 2 ﻋﺮض ﻋﺪة ﺷﺎﺷﺎت 1
3
ﻗﺎﺋﻤﺔ اﻟﺠُ ﻤﻞ ﻗﺎﺋﻤﺔ اﻷﻟﻮان ﻗﺎﺋﻤﺔ اﻟﻌﺎﺋﻠﺔ ﻗﺎﺋﻤﺔ اﻷرﻗﺎم اﻟﺸﺎﺷﺔ اﻟﺮﺋﻴﺴﻴﺔ
28
CLASS TYPES أﻧﻮاع اﻷﺻﻨﺎف
ﻓﺈﻧﻬﺎ ﺗﻌﻄﻲ اﻟﻤﺠﺎل ﻟﻠﻤﺒﺮﻣﺞ ﺑﻜﺘﺎﺑﺔ ﻛﻮداتobject oriented language ﻟﻜﻮن اﻟﺠﺎﻓﺎ ﻟﻐﺔ ﺑﺮﻣﺠﺔ ﻣﻮﺟﻬﺔ ﻟﻠﻜﺎﺋﻨﺎت
Interface, Abstract and Concrete وﺗﻨﻘﺴﻢ اﻷﺻﻨﺎف إﻟﻰreusability أﺻﻨﺎف ﺗﺼﻠﺢ ﻹﻋﺎدة اﻹﺳﺘﺨﺪام
public class Rocket{ (Fully implemented ) Concrete Class ﺻﻨﻒ ﻛﺎﻣﻞ أو ﻣﺘﻤﺎﺳﻚ 3
public static final int astronauts = 4;
String turn( String direction ){ ﻫﻮConcrete اﻟﺼﻨﻒ،وﻫﻮ اﻟﺼﻨﻒ اﻟﺬي ﻳﻌﺮﻓﻪ أﻏﻠﺐ اﻟﻤﺒﺮﻣﺠﻴﻦ
System.out.println( "Turning" + direction ); أو اﻻﻣﺘﺪاد ﻣﻨﻪextend ﺻﻨﻒ ﻛﺎﻣﻞ ﺑﺤﺪ ذاﺗﻪ وﻳﻤﻜﻦ اﻣﺘﺪاده
} Methods إﻟﻰ أﺻﻨﺎف أﺧﺮى واﺳﺘﺨﺪام ﻃﺮﻗﻪ
public abstract void start( String sound ){
System.out.println( "Engines on ");
}
public abstract void shutdown( ){
System.out.println( "Ignitions off !!" );
}
}
29
EVENTS LISTENER ﻣﺴﺘﻤﻊ اﻷﺣﺪاث
ﻟﻺﺳﺘﻤﺎع إﻟﻰ اﻷﺣﺪاث اﻟﺘﻲ ﺗﺤﺼﻞ ﻓﻲ اﻟﺘﻄﺒﻴﻖ ﻣﻦEvents Listenerﺗﺴﺘﺨﺪم
أو اﻟﻀﻐﻂ ﺑﺸﻜﻞ ﻣﺴﺘﻤﺮ وﻏﻴﺮﻫﺎ، ﻣﺜﻞ اﻟﻀﻐﻂ ﻣﺮة أو ﻣﺮﺗﻴﻦ،اﻟﻤﺴﺘﺨﺪم
ﻋﺮض ﻟﻺﺳﺘﻤﺎع إﻟﻰView ﻳﺠﺐ إﺳﻨﺎده إﻟﻰ ﻋﻨﺼﺮ Listener ﺑﻌﺪ ﺗﺤﺪﻳﺪ اﻟـ
اﻷﺣﺪاث ﻋﻠﻴﻪ
ﻛﻤﺎ ﻫﻮ واﺿﺢView ﻓﻬﻮ ﻣﻮرث ﻣﻦ اﻟﺼﻨﻒView ﻳﻤﻜﻦ اﺳﺘﺨﺪاﻣﻪ ﻣﻊ أي ﻋﻨﺼﺮ ﻋﺮضView.OnClickListenerاﻟﻜﺎﺋﻦ
onClick() واﺣﺪة وﻫﻲMethod وﻳﺤﺘﻮي ﻃﺮﻳﻘﺔ
Events Listener ﺗﻌﺮﻳﻒ ﺻﻨﻒ ﻳﺤﻮي 1
public class NumbersClickListener implements OnClickListener {
@Override
public void onClick(View view) {
Toast.makeText(view.getContext(), “Open the list of number”, Toast.LENGTH_SHORT).show();
}
}
buttonView.setOnClickListener(new OnClickListener() {
اﻟـــﺪاﻟﺔ اﻟﺜﺎﻟﺜـﺔ
@Override
public void onClick(View v) { ()اﻟﻤﺨﺘﺼﺮة
startActivity(new Intent(MainActivity.this, PhrasesActivity.class)); ﺑﺪل اﻟﺨﻄﻮة
} ٢ و١
});
30
ﺗﺴﺎؤل؟
ﺗﺴﺘﺨﺪم اﻟﻤﺼﻔﻮﻓﺎت ﻋﻨﺪﻣﺎ ﻳﻜﻮن ﻟﺪﻳﻨﺎ ﻋﺪة ﻣﺘﻐﻴﺮات ﻣﻦ ﻧﻔﺲ اﻟﻨﻮع وﻧﺤﺘﺎج إﻟﻰ ﺗﺨﺰﻳﻨﻬﺎ ﺑﺸﻜﻞ ﻣﺘﺘﺎﻟﻲ ﻓﻲ ﻣﺘﻐﻴﺮ
ﻳﺤﻤﻞ ﻧﻔﺲ اﻹﺳﻢ ؤاﺳﺘﺨﺪام ﻗﻴﻤﺘﻬﺎ ﻓﻲ وﻗﺖ ﻻﺣﻖ ،واﻟﻤﺼﻔﻮﻓﺔ ﻫﻲ ﻣﻦ ﻧﻮع ﻛﺎﺋﻦ Object
اﻟﻤﺜﺎل ﺳﻴﻌﺮف ﻣﺼﻔﻮﻓﺔ
ﻓﻴﻬﺎ ﺛﻼث ﻋﻨﺎﺻﺮ ﻣﻦ
ﺗﻌﺮﻳﻒ ﻣﺼﻔﻮﻓﺔ ﺟﺪﻳﺪة ;]int[] shoeSizes = new int[3
ﻧﻮع int
Array Data type Array Array Length
0 1 2 ﻧﻮع ﺑﻴﺎﻧﺎت
اﻟﻤﺼﻔﻮﻓﺔ
][ name
اﺳﻢ
= new ﻃــﻮل ﺑﻴﺎﻧـﺎت
اﻟﻤﺼﻔــــﻮﻓﺔ ; ][3
اﻟﻤﺼﻔﻮﻓﺔ
إﻋﻄﺎء ﻗﻴﻢ ﻣﺒﺪأﻳﺔ ﻟﻌﻨﺎﺻﺮ اﻟﻤﺼﻔﻮﻓﺔ وﻧﻼﺣﻆ أﻧﻨﺎ ﺑﺪأﻧﺎ ﻋﻨﺎﺻﺮ اﻟﻤﺼﻔﻮﻓﺔ ﻣﻦ
اﻟﺮﻗﻢ ﺻﻔﺮ وﻫﻮ أول ﺧﺎﻧﺔ ﻓﻲ ﻫﺬه اﻟﻤﺼﻔﻮﻓﺔ
0 1 2 ;shoeSizes[0] = 5
5 7 10 ;shoeSizes[1] = 7
;shoeSizes[2] = 10
ﻳﺠﺐ أن ﻳﺮاﻋﻰ أن ﻧﻮع ﺑﻴﺎﻧﺎت اﻟﻤﺼﻔﻮﻓﺔ ﻳﺴﺎوي ﻧﻮع اﻟﺒﻴﺎﻧﺎت ﻟﻠﻘﻴﻢ اﻟﻤﺒﺪأﻳﺔ
0 1 ;]String[] namesToStore = new String[2
“Ali” 33 ;”namesToStore[0] = “Ali
;namesToStore[1] = 33
ﻟﻦ ﺗﻜﻮن ﻫﻨﺎ ﻣﺸﻜﻠﺔ إذا ﻟﻢ ﻳﺘﻢ إﻋﻄﺎء ﻗﻴﻤﺔ إﺑﺘﺪاﺋﻴﺔ ﻟﻌﻨﺼﺮ ﻣﺎ ﻓﻲ اﻟﻤﺼﻔﻮﻓﺔ
ﻟﻜﻦ اﻟﻤﺸﻜﻠﺔ ﺳﺘﺤﺼﻞ ﻋﻨﺪﻣﺎ ﻳﺘﻢ اﺳﺘﺪﻋﺎء ﻗﻴﻤﺔ ﻋﻨﺼﺮ ﻓﺎرغ ﻓﻲ اﻟﻤﺼﻔﻮﻓﺔ
0 1 2 3 ; ]int[] numbersToStore = new int[4
5 9 ?? 10 ;numbersToStore [0] = 5
;numbersToStore [1] = 9
;numbersToStore [3] = 10
31
ﺗـﺎﺑــﻊ اﻟﻤﺼﻔﻮﻓﺎت ARRAY, ARRAYLIST
ﻧﺴﺘﺨﺪم ﻗﺎﺋﻤﺔ اﻟﻤﺼﻔﻮﻓﺎت ArrayListﻋﻨﺪﻣﺎ ﻻ ﻧﻌﺮف ﻃﻮل اﻟﺒﻴﺎﻧﺎت اﻟﺘﻲ ﺳﻨﻀﻌﻬﺎ ﻓﻲ اﻟﻤﺼﻔﻮﻓﺔ وﻫﺬا ﻳﺴﺎﻋﺪ
ﻋﻠﻰ ﺗﻐﻴﺮ ﺣﺠﻢ اﻟﻤﺼﻔﻮﻓﺔ ﺑﺎﻟﺰﻳﺎدة أو اﻟﻨﻘﺼﺎن ﺣﺴﺐ ﻃﻮل اﻟﺒﻴﺎﻧﺎت ،أﻣﺎ ﻓﻲ اﻟﻤﺼﻮﻓﺎت اﻟﻌﺎدﻳﺔ ﻓﻨﺤﻦ ﻣﻠﺰوﻣﻮن
ﺑﺎﻟﻄﻮل اﻟﺬي ﻧﺤﺪده ﻣﺜﻞ ] int[] number = new int[10ﻣﺎذا ﻟﻮ زاد ﻃﻮل اﻟﺒﻴﺎﻧﺎت ﻋﻦ 10؟
ﻳﻤﺘﺪ extendsﺗﻌﺮﻳﻒ ﻗﺎﺋﻤﺔ اﻟﻤﺼﻔﻮﻓﺎت ArrayListﻣﻦ ﺻﻨﻒ AbstractListوﻳﻘﻮم ﻫﺬا اﻟﺼﻨﻒ ﻛﺬﻟﻚ ﺑﺎﻹﻣﺘﺪاد إﻟﻰ
ﺻﻨﻒ اﻟﻮاﺟﻬﺔ interfaceواﺳﻤﻪ > List<Eوﺣﺮف Eﻫﻨﺎ ﻳﺪل ﻋﻠﻰ ﻛﻠﻤﺔ Elementوﻳﻌﻨﻲ أن اﻟﺒﻴﺎﻧﺎت اﻟﺘﻲ ﻳﻤﻜﻦ
وﺿﻌﻬﺎ ﻫﻨﺎ ﻣﻤﻜﻦ ﺗﻜﻮن ﻣﻦ أي ﻧﻮع ﺑﻴﺎﻧﺎت ﻛﺎﺋﻦ وﺑﺪون وﺿﻊ ﻧﻮع ﺑﻴﺎﻧﺎت ﺗﻌﺘﺒﺮ genericوﻋﻨﺪ ﺗﻌﺮﻳﻒ ﻧﻮع ﺑﻴﺎﻧﺎت
ﻣﻌﻴﻦ ﻓﺈن اﻟﻜﺎﺋﻦ ﻳﻘﻮم ﺑﺎﺳﺘﺒﺪال ﺣﺮف Eﺑﻨﻮع ﺑﻴﺎﻧﺎﺗﺎ اﻟﻌﻨﺎﺻﺮ اﻟﻤﺴﻨﺪة إﻟﻴﻬﺎ
Arraylist Array
ﻫﻞ ﻳﻤﻜﻦ ﺗﻐﻴﻴﺮ ﻃﻮل اﻟﺒﻴﺎﻧﺎت
ﻧﻌﻢ ﻻ ﻓﻴﻬﺎ ﺑﻌﺪﻣﺎ ﻳﺘﻢ إﻧﺸﺎءﻫﺎ؟
32
ﺗـﺎﺑــﻊ اﻟﻤﺼﻔﻮﻓﺎت ARRAY, ARRAYLIST
33
ﺗـﺎﺑــﻊ اﻟﺤﻠﻘﺎت اﻟﻤﺴﺘﻤﺮة WHILE, FOR LOOPS
اﺳﺘﺨﺪام ListVIewﻳﻘﻠﻞ ﻣﻦ اﺳﺘﺨﺪام ﻣﻮارد اﻟﺬاﻛﺮة إذا ﻣﺎ ﻗﺎرﻧﺎه ﻟﻮ ﻛﺮرﻧﺎ ﻫﺬه اﻟﻌﻨﺎﺻﺮ ﻓﻲ ﻣﻠﻒ واﺟﻬﺔ اﻟﺘﻄﺒﻴﻖ XML
34
A NEED FOR VIEW RECYCLING? ﻫﻞ ﺗﺤﺘﺎج إﻟﻰ ﻋﻨﺼﺮ ﻋﺮض إﻋﺎدة اﻟﺘﺪوﻳﺮ؟
Setting Activity
LISTVIEW + ARRAYADAPTER
ﺑﺎﺳﺘﺨﺪام اﻟﻨﻤﻂ اﻟﻄﺒﻴﻌﻲ ﻟﻠﻘﺎﺋﻤﺔ ﺳﻨﺴﺘﺨﺪم ﻫﺬه اﻟﺨﻄﻮاتArrayAdapter ﻣﻊListView ﻹﻧﺸﺎء ﻗﺎﺋﻤﺔ
word_list.xml اﻟﺨﺎص ﺑﺎﻟﻘﺎﺋﻤﺔXML إﺿﺎﻓﺔ ﻣﻠﻒ 1
<?xml version="1.0" encoding="utf-8"?>
<ListView xmlns:android="http://schemas.android.com/apk/res/android"
اﺳﺘﺨﺪام ﻋﻨﺼﺮListView ﺑﻄﺒﻴﻌﺔ اﻟﻘﺎﺋﻤﺔ
xmlns:tools="http://schemas.android.com/tools"
وﻳﻤﺜﻞTextView ﻋﺮض واﺣﺪ ﻓﻘﻂ ﻣﻦ ﻧﻮع
android:id="@+id/list"
اﻟﻌﻨﺎﺻﺮ اﻟﺘﻲ ﺳﻴﺘﻢ ﻋﺮﺿﻬﺎ واﻟﺘﻲ ﻓﻲ
android:orientation="vertical"
words ﻣﺜﺎﻟﻨﺎ ﻫﺬا ﻫﻲ ﻋﻨﺎﺻﺮ اﻟﻤﺼﻔﻮﻓﺔ
android:layout_width="match_parent"
android.R.layout.simple_list_item_1 و
android:layout_height="match_parent"
ﻫﻮ ﻋﻨﺼﺮ اﻟﺘﺨﻄﻴﻂ اﻟﺬي ﺑﺪاﺧﻠﻪ ﻋﻨﺼﺮ
/>
TextView ﻋﺮض واﺣﺪ ﻓﻘﻂ
Activity إﺿﺎﻓﺔ أﻛﻮاد ﺟﺎﻓﺎ إﻟﻰ اﻟﻤﻠﻒ 2
Constructor
ArrayAdapter<String> itemsAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, words);
ListView listView = (ListView) findViewById(R.id.list);
listView ﻟﻠﻘﺎﺋﻤﺔArrayAdapter ﻳﺘﻢ ﻫﻨﺎ ﺗﻌﺮﻳﻒ
listView.setAdapter(itemsAdapter);
XML ﻣﻠﻒ ﻳﺠﺐ أن ﻧﻌﻤﻞ،ﻟﻌﻤﻞ ﺗﺨﻄﻴﻂ ﻣﺨﺼﺺ ﻟﻌﺮض اﻟﻤﺼﻔﻮﻓﺔ ﻣﺜﻼ ﻛﻤﺎ ﻓﻲ اﻟﺸﻜﻞ أدﻧﺎه
وﻻ ﻧﻨﺴﻰ إﻋﻄﺎء،وﻧﻀﻊ ﻓﻴﻪ اﻟﻌﻨﺎﺻﺮ اﻟﺘﻲ ﻧﺮﻳﺪﻫﺎ أن ﺗُﻈﻬﺮ اﻟﻤﺼﻔﻮﻓﺔ ﺑﺎﻟﺸﻜﻞ اﻟﺬي ﻧﺮﻳﺪه
اﺳﻢ ﻣﻌﺮف ﻟﻜﻞ ﻣﺮﺑﻊ ﻧﺺ ﻟﻠﺮﺟﻮع إﻟﻴﻪ ﻓﻲ ﻛﻮدات ﺟﺎﻓﺎ
35
CUSTOM CLASS ﺻﻨﻒ ﻣﺨﺼﺺ
وﻟﺘﻤﺮﻳﺮ ﻣﺼﻔﻮﻓﺘﻴﻦ ﻣﻦ اﻟﻜﻠﻤﺎتMiwokﻛﻠﻤﺎت ﺑﺎﻟﻠﻐﺔ اﻹﻧﺠﻠﻴﺰﻳﺔ وﻛﻠﻤﺎت ﺑﺎﻟﻠﻐﺔ، ﻟﺪﻳﻨﺎ ﻗﺎﺋﻤﺘﻴﻦMiwok ﻓﻲ اﻟﻤﺸﺮوع
ﻣﺨﺼﺺ ﺣﺘﻰClass ﻣﺨﺼﺺ ﻟﻜﻦ ﻗﺒﻞ ذﻟﻚ ﻧﺤﺘﺎج أن ﻧﻌﻤﻞ ﺻﻨﻒArrayAdapter ﺳﻨﺤﺘﺎج إﻟﻰListView إﻟﻰ
وﻣﺘﻐﻴﺮات ﺗﻤﻜﻨﻨﺎ ﻣﻦ ﺗﻀﻤﻴﻦ اﻟﻤﻌﻠﻮﻣﺎت وﺗﺠﻤﻴﻌﻬﺎ ﻓﻲ ﺻﻨﻒ واﺣﺪ ﻣﺤﺪدMethods ﻧﺘﺤﻔﻆ ﻓﻴﻪ ﺑﻄﺮق
WordsAdapter.java وWords.java إﻧﺸﺎء ﻣﻠﻔﺎت ﺟﺪﻳﺪة ﺑﺎﺳﻢ 1
36
ﺗﺎﺑــﻊ CUSTOM CLASS ﺻﻨﻒ ﻣﺨﺼﺺ
ﻛﻠﻤﺎت ﺑﺎﻟﻠﻐﺔ، ﻟﺪﻳﻨﺎ ﻗﺎﺋﻤﺘﻴﻦMiwok ﻓﻲ اﻟﻤﺸﺮوع list_item.xml إﻧﺸﺎء ﻣﻠﻒ ﺟﺪﻳﺪﺑﺎﺳﻢ 4
وﻟﺘﻤﺮﻳﺮ ﻣﺼﻔﻮﻓﺘﻴﻦMiwok اﻹﻧﺠﻠﻴﺰﻳﺔ وﻛﻠﻤﺎت ﺑﺎﻟﻠﻐﺔ <?xml version="1.0" encoding="utf-8"?>
ﻣﺨﺼﺺArrayAdapter ﻣﻦ اﻟﻜﻠﻤﺎت إﻟﻰ ﺳﻨﺤﺘﺎج إﻟﻰ <LinearLayout
ﻣﺨﺼﺺClass ﻟﻜﻦ ﻗﺒﻞ ذﻟﻚ ﻧﺤﺘﺎج أن ﻧﻌﻤﻞ ﺻﻨﻒ xmlns:android="http://schemas.android.com/apk/res/android"
وﻣﺘﻐﻴﺮات ﺗﻤﻜﻨﻨﺎMethods ﺣﺘﻰ ﻧﺘﺤﻔﻆ ﻓﻴﻪ ﺑﻄﺮق xmlns:tools="http://schemas.android.com/tools"
ﻣﻦ ﺗﻀﻤﻴﻦ اﻟﻤﻌﻠﻮﻣﺎت وﺗﺠﻤﻴﻌﻬﺎ ﻓﻲ ﺻﻨﻒ واﺣﺪ android:layout_width="match_parent"
ﻣﺤﺪد android:orientation="vertical"
android:layout_height="match_parent">
ﺑﺪلListView ﺳﻴﺘﻢ اﺳﺘﺨﺪام ﻫﺬا اﻟﻜﻮد ﻟﻌﻨﺎﺻﺮ اﻟﻘﺎﺋﻤﺔ
ﻣﺮﺑﻊ اﻟﻨﺺ اﻹﻓﺘﺮاﺿﻲ اﻟﺬي ﻳﻈﻬﺮ ﻓﻴﻬﺎ ﺳﻴﻜﻮن ﻫﺬا <TextView
اﻟﺘﺼﻤﻴﻢ ﻣﺨﺼﺺ android:id="@+id/miwok_text_view"
android:layout_width="match_parent"
android:layout_height="44dp"
ﺗﺴﺘﺨﺪم ﻫﺬه اﻟﻤﻴﺰة ﻟﺘﺒﺪﻳﻞ اﻟﻨﺺ اﻟﻈﺎﻫﺮ ﻓﻲ ﺷﺎﺷﺔ android:textAppearance="?android:textAppearanceMedium"
وﻫﺬا،اﻟﻤﻌﺎﻳﻨﺔ اﻟﺘﻲ ﺗﻈﻬﺮ ﻓﻲ اﻷﻧﺪرﻳﻮد اﺳﺘﻮدﻳﻮ tools:text="lutti" />
ﻳﻌﻄﻲ ﻳﺴﻬﻞ اﻟﻌﻤﻞ ﻋﻠﻰ ﺗﺼﻤﻴﻢ اﻟﻮاﺟﻬﺔ
Placeholder وﻳﺠﻌﻠﻬﺎ أﻛﺜﺮ واﻗﻌﻴﺔ وﻳﺴﻤﻰ <TextView
android:id="@+id/default_text_view"
android:layout_width="match_parent"
android:layout_height="44dp"
android:textAppearance="?android:textAppearanceMedium"
tools:text="one" />
</LinearLayout>
ﺳﻴﺘﻢMethod ﻓﻲ ﻛﻮدات اﻟﻨﺸﺎط داﺧﻞ اﻟﻄﺮﻳﻘﺔ اﻟﻤﺨﺼﺺArrayAdapter إﺿﺎﻓﺔ أﻛﻮاد اﻟـ 5
إﺿﺎﻓﺔ ﻫﺬه اﻷﻛﻮاد أوﻻ ﺳﻴﺘﻢ إﻧﺸﺎء ﻗﺎﺋﻤﺔ اﻟﻜﻠﻤﺎت
وﺛﻢ إﺿﺎﻓﺔ وﺗﻌﺮﻳﻒ ﻣﺼﻔﻮﻓﺔArrayList ﺑﺎﺳﺘﺨﺪام /*** إﻧﺸﺎء ﻗﺎﺋﻤﺔ ﺑﺎﻟﻜﻠﻤﺎت/
ArrayList<Word> words = new ArrayList<Word>();
وﻻﺑﺪ ﻛﺬﻟﻚ ﻣﻦ ﺗﺤﺪﻳﺪ،ﺟﺪﻳﺪة ﻣﻦ اﻟﺼﻨﻒ اﻟﻤﺨﺼﺺ
words.add(new Word("one", "lutti"));
اﻟﻘﺎﺋﻤﺔ اﻟﺘﻲ ﺳﻴﻌﻤﻞ ﻋﻠﻴﻬﺎ اﻷدﺑﺘﻮر اﻟﺨﺎص ﺣﺘﻰ
words.add(new Word("two", "otiiko"));
ﻧﺴﻨﺪ اﻷدﺑﺘﻮر اﻟﺬي ﺟﻬﺰﻧﺎه إﻟﻲ أدﺑﺘﻮر اﻟﻘﺎﺋﻤﺔ words.add(new Word("three", "tolookosu"));
37
STEPS TO MODIFY AN APP ﺧﻄﻮات اﻟﺘﻌﺪﻳﻞ ﻋﻠﻰ ﺗﻄﺒﻴﻖ
،ﻓﻲ أﻏﻠﺐ اﻟﺤﺎﻻت ﺳﺘﺄﺗﻴﻚ ﺗﻄﺒﻴﻘﺎت ﻳﻄﻠﺐ ﻣﻨﻚ ﺗﻄﻮﻳﺮﻫﺎ ﻓﻬﻨﺎك ﻋﺪة ﺧﻄﻮات ﻟﺬﻟﻚ ﺳﺘﺴﻬﻞ ﻋﻠﻴﻚ اﻟﻤﻬﻤﺔ
اﻟﻤﻄﻠﻮب ﻫﻮ إﺿﺎﻓﺔ اﻟﺼﻮر إﻟﻲ اﻟﺘﻄﺒﻴﻖ وﻋﺮض ﻟﻜﻞ ﻧﻮع ﻣﻦ اﻟﻜﻠﻤﺎت ﻓﻲ اﻟﻘﺎﺋﻤﺔMiwok ﻓﻲ اﻟﻤﺸﺮوع
<TextView
android:id="@+id/miwok_text_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
tools:text="lutti" />
وإذا ﻣﺎ ﻛﺎن ﻟﺪﻳﻨﺎ ﻧﺴﺨﺔ واﺣﺪة ﻣﻦ اﻟﺼﻮرة ﻓﻨﺤﺘﺎج أن ﺗﻜﻮن
ﻋﻠﻰ ﺣﺠﻢ ﻣﺘﺴﺎو ﺑﻐﺾ اﻟﻨﻈﺮ ﻋﻦ ﻋﺪد ﺑﻴﻜﺴﻼت اﻟﺠﻬﺎز <TextView
android:id="@+id/default_text_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
tools:text="one" />
</LinearLayout>
</LinearLayout>
38
ﺗﺎﺑــﻊ ﺧﻄﻮات اﻟﺘﻌﺪﻳﻞ ﻋﻠﻰ ﺗﻄﺒﻴﻖ STEPS TO MODIFY AN APP
ﺣﺴﺐ ﻧﺴﺒﺔ اﻟﺘﺤﻮﻳﻞ ﻟﻮ ﻛﺎﻧﺖ ﻟﺪﻳﻨﺎ ﺻﻮرة ﺑﺤﺠﻢ 48ﺑﻴﻜﺴﻞ ﻓﻴﺠﺐ أن ﻳﻜﻮن xxxhdpi =
ﺣﺠﻤﻬﺎ ﻟﻸﺟﻬﺰة اﻟﻌﺎﻟﻴﺔ اﻟﻜﺜﺎﻓﺔ xxxhdpi = 4 x 48 ------> xxxhdpi = 192 px +
+
ﻳﺘﻢ إدراج اﻟﻤﺠﻠﺪات ﻟﻠﺼﻮر ﺟﻤﻴﻌﻬﺎ إﻟﻰ ﻣﺠﻠﺪات drawableﻓﻲ res +
ﻳﺮﺟﻰ اﻟﺮﺟﻮع ﻟﻠﺼﻔﺤﺔ 11ﻟﻤﻌﻠﻮﻣﺎت أﻛﺜﺮ ﺣﻮل إﺿﺎﻓﺔ اﻟﺼﻮر ﻓﻲ اﻷﻧﺪرﻳﻮد اﺳﺘﻮدﻳﻮ
39
ﺗﺎﺑــﻊ ﺧﻄﻮات اﻟﺘﻌﺪﻳﻞ ﻋﻠﻰ ﺗﻄﺒﻴﻖ STEPS TO MODIFY AN APP
ﻫﺬه اﻟﻄﺮﻳﻘﺔ Methodﻛﺬﻟﻚ ﺳﻨﺴﺘﺨﺪﻣﻬﺎ ﻟﻠﺘﺄﻛﺪ ﻣﺎ إذا ﻛﺎن ﻟﻠﻌﻨﺼﺮ { )(public boolean hasImage
ﺻﻮرة ﻣﻀﺎﻓﺔ أم ﻻ وﻣﻌﻨﺎﻫﺎ إرﺟﺎع ﻗﻴﻤﺔ اﻟﻤﺘﻐﻴﺮ إذا ﻛﺎن ﻻ ﻳﺴﺎوي ;return mImageResourceId != NO_IMAGE_PROVIDED
ﻗﻴﻤﺔ اﻟﺜﺎﺑﺖ وﻫﻲ -1أي أن ﻫﻨﺎك ﺻﻮرة ﻣﻀﺎﻓﺔ }
ﻟﻜﻞ ﻗﺎﺋﻤﺔ ﻣﻦ ﻗﻮاﺋﻢ اﻟﻜﻠﻤﺎت ﻟﻮن ﺧﻠﻔﻴﺔ ﻣﺨﺘﻠﻔﺔ وﻟﺬﻟﻚ ﻗﻤﻨﺎ ﺑﺈﺿﺎﻓﺔ ﻛﻮدات اﻟﺘﺤﻜﻢ ﺑﺄﻟﻮان اﻟﺨﻠﻔﻴﺔ ﻓﻲ ArrayAdapter
وﻟﻢ ﻧﻀﻌﻬﺎ ﻓﻲ اﻟﺼﻨﻒ Word.javaوذﻟﻚ أﻧﻨﺎ ﻟﻦ ﻧﺤﺘﺎج إﻟﻰ ﺗﻐﻴﻴﺮ اﻟﻠﻮن ﻟﻜﻞ ﻋﻨﺼﺮ ﻓﻲ اﻟﻘﺎﺋﻤﺔ ﻧﻔﺴﻬﺎ ﺑﻞ ﻛﻞ ﻗﺎﺋﻤﺔ
ﻛﻠﻤﺎت ﻟﻬﺎ ﻟﻮن واﺣﺪ ﻓﺎﻷﻓﻀﻞ ﻫﻮ اﻟﺘﻌﺪﻳﻞ ﻋﻠﻰ WordAdapter
; private int mColorResourceIdأوﻻ ﻧﻌﺮف ﻣﺘﻐﻴﺮ ﻋﺎم داﺧﻞ اﻷدﺑﺘﻮر ﻟﺤﻔﻆ رﻗﻢ
ﻣﻮرد اﻷﻟﻮان
{ ) public WordAdapter(Context context, ArrayList<Word> words, int colorResourceIdﻳﺴﻤﻰ ﻫﺬا Constructorوﻳﺴﺘﺨﺪم ﻟﺮﺑﻂ
اﻟﻤﺘﻐﻴﺮات اﻟﺪاﺧﻠﻴﺔ ﺑﺎﻟﻤﺘﻐﻴﺮات اﻟﺘﻲ ﺗﺄﺗﻲ ﻣﻦ ;)super(context, 0, words
;mColorResourceId = colorResourceId
ﺧﺎرج اﻟﺼﻨﻒ ﻋﺒﺮ اﻟـ Constructor
ﻣﺘﻐﻴﺮ داﺧﻠﻲ وﺣﺮف اﻟـ mﻳﻌﻨﻲ member }
ﺑﻌﺪ ﻫﺬه اﻟﺘﻌﺪﻳﻼت ﻧﻌﻮد ﻟﻜﻮدات اﻟﻨﺸﺎط وﻧﻐﻴﺮ ﺗﻌﺮﻳﻒ اﻷدﺑﺘﻮر ﺑﺰﻳﺎدة إﺿﺎﻓﺔ اﻟﻠﻮن اﻟﻤﻄﻠﻮب ﻟﻠﺨﻠﻔﻴﺔ واﻟﺬي ﺳﻴﻜﻮن
;)WordAdapter adapter = new WordAdapter(this, words, R.color.category_numbers ﻣﺮﺟﻊ رﻗﻤﻪ اﻟﻤﻌﺮف ﻣﻦ ﻣﻮارد اﻷﻟﻮان
40
ﻣﺸﻐﻞ اﻟﻮﺳﺎﺋﻂ MEDIAPLAYER
اﻟﺼﻨﻒ MediaPlayerﻳﻌﺘﺒﺮ ﺻﻨﻒ ﻣﺮﻛﺐ ﻷن ﻳﻤﻜﻨﻪ ﺗﺸﻐﻴﻞ اﻟﺼﻮﺗﻴﺎت واﻟﻤﺮﺋﻴﺎت ﻓﻲ ﺗﻄﺒﻴﻘﺎت اﻷﻧﺪرﻳﻮد وﻫﺬه
اﻟﺼﻮﺗﻴﺎت أو اﻟﻤﺮﺋﻴﺎت ﻳﻤﻜﻦ ﺿﻤﻴﻨﻬﺎ ﻓﻲ ﻣﻠﻒ اﻟﻤﻮارد أو ﺗﺸﻐﻴﻠﻬﺎ ﻋﻦ ﻃﺮﻳﻖ اﻹﻧﺘﺮﻧﺖ
ﻗﺎﺋﻤﺔ ﺑﺒﻌﺾ أﻧﻮاع اﻟﺼﻮﺗﻴﺎت واﻟﻤﺮﺋﻴﺎت اﻟﺘﻲ ﻳﺸﻐﻠﻬﺎ اﻷﻧﺪرﻳﻮد
اﻟﺼــــــــﻮر اﻟﻔﻴﺪﻳــﻮﻫﺎت اﻟﺼﻮﺗﻴـــﺎت
BMP GIF JPEG PNG اﻟﻔﻴﺪﻳﻮﻫﺎت MP4 MKV 3GPP WEBM MP3 WAV OGG MID
ﻟﻤﻌﻠﻮﻣﺎت أﻛﺜﺮ ﻋﻦ أﻧﻮع ﻣﻠﻔﺎت اﻟﻮﺳﺎﺋﻂ اﻟﻤﺪﻋﻮﻣﺔ ﻳﺮﺟﻰ زﻳﺎرة ﻫﺬا اﻟﻤﻮﻗﻊ
https://developer.android.com/guide/topics/media/media-formats.html
ﻳﺘﻢ اﻟﺘﺤﻜﻢ ﺑﻤﺸﻐﻞ اﻟﻮﺳﺎﺋﻂ ﻋﻦ ﻃﺮﻳﻖ ﺗﺴﻠﺴﻞ اﻟﺤﺎﻻت State Machineوﻫﺬا ﻳﻌﻨﻲ أن ﻫﻨﺎك ﺣﺎﻻت ﻣﺨﺘﻠﻔﺔ ﻳﺘﻢ
اﻟﺘﻨﻘﻞ ﺑﻴﻨﻬﺎ ،وﺑﺎﻟﺘﺎﻟﻲ ﻳﻤﻜﻨﻨﺎ رﺳﻢ ﻣﺨﻄﻂ ﻳﻌﺮف ﺑﺎﺳﻢ اﻟﺮﺳﻢ اﻟﺒﻴﺎﻧﻲ ﻟﺘﺴﻠﺴﻞ اﻟﺤﺎﻻت State Machine Diagram
ﻟﻠﻤﺴﺎﻋﺪة ﻓﻲ ﺗﺼﻮر اﻟﺤﺎﻻت اﻟﻤﺨﺘﻠﻔﺔ ﻋﻨﺪ ﺗﺸﻐﻴﻞ ﻣﺸﻐﻞ اﻟﻮﺳﺎﺋﻂ
Paused Started Prepared Idle
اﻹﻳﻘﺎف اﻟﻤﺆﻗﺖ ﺣﺎﻟﺔ اﻟﺘﺸﻐﻴﻞ ﺣﺎﻟﺔ اﻟﺠﺎﻫﺰﻳﺔ ﺣﺎﻟﺔ اﻟﺨﻤﻮل
إﻳﻘﺎف ﻣﺆﻗﺖ ﻣﺸﻐﻞ اﻟﻮﺳﺎﺋﻂ ﻣﺸﻐﻞ اﻟﻮﺳﺎﺋﻂ ﻣﺸﻐﻞ اﻟﻮﺳﺎﺋﻂ
ﻟﻤﻠﻒ اﻟﻮﺳﺎﺋﻂ ﻣﻠﻒ ﻳﺸﻐﻞ ﻳﺴﺘﻌﺪ ﻟﺘﺸﻐﻴﻞ ﻣﻮﺟﻮد ﻟﻜﻦ ﻻ
اﻟﺬي ﺗﻢ ﺗﺸﻐﻴﻠﻪ وﺳﺎﺋﻂ ﻣﻠﻒ وﺳﺎﺋﻂ ﻳﺼﺪر ﺻﻮﺗﺎ
Stopped
اﻹﻳﻘﺎف اﻟﻜﻠﻲ
ﻛﻠﻲ إﻳﻘﺎف
ﻟﻤﻠﻒ اﻟﻮﺳﺎﺋﻂ
اﻟﺬي ﺗﻢ ﺗﺸﻐﻴﻠﻪ
ﻟﻤﻌﻠﻮﻣﺎت أﻛﺜﺮ ﻋﻦ ﺣﺎﻻت أﺧﺮى ﻟﻤﺸﻐﻞ اﻟﻮﺳﺎﺋﻂ ﻳﺮﺟﻰ زﻳﺎرة ﻫﺬا اﻟﻤﻮﻗﻊ
https://developer.android.com/reference/android/media/MediaPlayer.html
ﻳﺘﻢ ﺗﻌﺮﻳﻒ ﻣﺸﻐﻞ اﻟﻮﺳﺎﺋﻂ ﺑﺈﺳﺘﺨﺪام ﻃﺮﻳﻘﺔ اﻟﻤﺼﻨﻊ Factory Methodﻓﻲ ﺗﻌﺮﻳﻒ اﻟﻜﺎﺋﻨﺎت
ﺧﻄﻮات إﺿﺎﻓﺔ ﻣﺸﻐﻞ اﻟﺼﻮﺗﻴﺎت إﻟﻰ اﻟﺘﻄﺒﻴﻖ
1إﺿﺎﻓﺔ ﻣﺴﻤﺘﻊ اﻷﺣﺪاث ﻟﻌﻨﺎﺻﺮ ﻗﺎﺋﻤﺔ listViewﺑﺈﺳﺘﺨﺪام )(setOnItemClickListener
ﺗﻌﺮﻳﻒ ﻣﺘﻐﻴﺮ ﺟﺪﻳﺪ ﻟﻜﺎﺋﻦ ﻣﺸﻐﻞ اﻟﻮﺳﺎﺋﻂ//
;private MediaPlayer mMediaPlayer
{ )(listView.setOnItemClickListener(new AdapterView.OnItemClickListener
@Override
{ )public void onItemClick(AdapterView<?> adapterView, View view, int position, long l
ﺗﺤﺪﻳﺪ ﻣﻜﺎن ورﻗﻢ ﻣﻌﺮف اﻟﻌﻨﺼﺮ اﻟﺬي ﺗﻢ اﻟﻀﻐﻂ ﻋﻠﻴﻪ ﻓﻲ اﻟﻘﺎﺋﻤﺔ //
;)Word word = words.get(position
إﻋﻄﺎء ﻗﻴﻤﺔ ﻟﻤﺘﻐﻴﺮ ﻣﺸﻐﻞ اﻟﻮﺳﺎﺋﻂ وإﻋﻄﺎءه أﻣﺮ ﺑﺘﺠﻬﻴﺰ ﻣﻠﻒ اﻟﻤﻮارد اﻟﺼﻮﺗﻲ//
;))(mMediaPlayer = MediaPlayer.create(NumbersActivity.this, word.getAudioResourceId
ﺗﺸﻐﻴﻞ ﻣﻠﻒ اﻟﻤﻮارد اﻟﺼﻮﺗﻲ//
;)(mMediaPlayer.start ﻫﺬا ﻣﺮﺟﻊ ﻟﻤﻠﻒ اﻟﻮﺳﺎﺋﻂ
;)} } ﻫﺬا ﻣﺮﺟﻊ ﻟﻠﻨﺸﺎط اﻟﺬي ﺳﻴﻌﻤﻞ ﻋﻠﻴﻪ ﻣﺸﻐﻞ اﻟﻮﺳﺎﺋﻂ
41
ﺗﺎﺑــﻊ MEDIAPLAYER ﻣﺸﻐﻞ اﻟﻮﺳﺎﺋﻂ
وﺑﻬﺬه اﻟﻄﺮﻳﻘﺔ ﻳﻤﻜﻦ اﻟﺮﺟﻮع إﻟﻰ ﻗﺎﺋﻤﺔ اﻟﻤﺼﻔﻮﻓﺔArrayList ﻗﺒﻞ ﺗﻌﺮﻳﻒ اﻟﻤﺼﻔﻮﻓﺔfinal ﻳﺠﺐ أن ﻧﻀﻊ اﻟﻜﻠﻤﺔ
final ArrayList<Word> words = new ArrayList<Word>(); onItemClick ﺿﻤﻦ وﻇﻴﻔﺔ
words.add(new Word("father", "әpә", R.drawable.family_father, R.raw.family_father));
words.add(new Word("mother", "ә a", R.drawable.family_mother, R.raw.family_mother));
words.add(new Word("daughter", "tune", R.drawable.family_daughter, R.raw.family_daughter));
ﻓﻲ اﻟﺼﻨﻒ اﻟﻮاﺣﺪ ﻣﺎدام أن ﻛﻞ ﻣﻨﻬﻤﺎ ﻳﺤﺘﻮي ﻋﻮام إدﺧﺎل ﻣﺨﺘﻠﻔﺔ ﻋﻦ اﻵﺧﺮConstructorﻳﻤﻜﻦ اﺳﺘﺨﺪام أﻛﺜﺮ ﻣﻦ
toString() اﻷﺳﻠــﻮب
ﻳﺘﻤﺜﻞtoString() أﺳﻬﻞ وﺳﻴﻠﺔ ﻟﻄﺒﺎﻋﺔ ﻣﺤﺘﻮﻳﺎت ﻛﺎﺋﻦ ﺟﺎﻓﺎ ﻫﻲ ﺗﻮﻓﻴﺮ ﻃﺮﻳﻘﺔ ﺗﻨﻔﻴﺬ أﺳﻠﻮب
ﻋﺎدة ﻷﻏﺮاض ﺗﺼﺤﻴﺢ اﻷﺧﻄﺎء،اﻟﻐﺮض ﻣﻦ ﻫﺬا اﻷﺳﻠﻮب ﻓﻲ ﻋﺮض اﻟﻜﺎﺋﻦ ﺑﺎﻟﻜﺎﻣﻞ ﻛﺴﻠﺴﻠﺔ
اﺿﻐﻂ ﻋﻠﻰ اﻟﺰر 1 ﺿﻊ اﻟﻤﺆﺷﺮ ﻓﻲ ﻣﺴﺎﺣﺔ ﻓﺎرﻏﺔ ﻓﻲ اﻟﻤﻠﻒ ﺧﺎرج 1
ALT + Insert Methods ﺣﺪود اﻟﻄﺮق
CMD + N
42
اﻹﺳﺘﺪﻋﺎءات اﻟﻐﻴﺮ ﻣﺘﺰاﻣﻨﺔ ASYNC CALLBACKS
ﻛﻞ اﻹﺳﺘﺪﻋﺎءات CallBacksاﻟﺘﻲ ﺗﻢ اﺳﺘﺨﺪاﻣﻬﺎ ﻛﺎﻧﺖ ﻣﻦ ﻧﻮع ﻣﺘﺰاﻣﻦ أي ﺗﻢ ﺗﻄﺒﻴﻖ اﻟﻜﻮد واﺣﺪا ﺗﻠﻮ اﻵﺧﺮ دون
اﻧﺘﻈﺎر وﻋﻠﻴﻚ اﻧﺘﻈﺎر اﻻﻧﺘﻬﺎء ﻣﻦ ﺗﻨﻔﻴﺬ ﻛﻞ ﺳﻄﺮ ﻗﺒﻞ اﻟﺬﻫﺎب إﻟﻰ اﻟﺴﻄﺮ اﻟﺘﺎﻟﻲ .ﻟﻜﻦ اﻻﺳﺘﺪﻋﺎء اﻟﻐﻴﺮ ﻣﺘﺰاﻣﻦ ﻳﺘﻢ
اﺳﺘﺨﺪاﻣﻪ ﻓﻘﻂ ﻋﻨﺪﻣﺎ ﻳﺘﻢ ﻃﻠﺒﻪ وﻳﻤﻜﻦ ﻟﻠﻤﺴﺘﺨﺪم اﻟﻌﻤﻞ ﻋﻠﻰ اﻟﺘﻄﺒﻴﻖ ﺑﻴﻨﻤﺎ ﻳﺘﻢ ﻫﺬا اﻹﺳﺘﺪﻋﺎء ﻓﻲ اﻟﺨﻠﻔﻴﺔ
ﻓﻤﺜﺎل ذﻟﻚ ﻓﻲ ﻣﺸﻐﻞ اﻟﻮﺳﺎﺋﻂ ﺳﻨﺴﺘﺨﺪم اﺳﺘﺪﻋﺎء ﻏﻴﺮ ﻣﺘﺰاﻣﻦ ﻟﻺﺧﺒﺎر ﺑﺈﻧﺘﻬﺎء ﺗﺸﻐﻴﻞ اﻟﻤﻠﻒ اﻟﺼﻮﺗﻲ وﻟﻜﻦ
ﺳﻴﻜﻮن ﻫﺬا اﻹﺧﺒﺎر ﺑﻌﺪ ﺗﺸﻐﻴﻞ ﻣﻠﻒ اﻟﻮﺳﺎﺋﻂ وﻟﺬﻟﻚ ﻧﺴﺘﺨﺪم )(setOnCompletionListener
{ )(private MediaPlayer.OnCompletionListener mCompletionListener = new MediaPlayer.OnCompletionListener
@Override
ﻋﻨﺪ اﻧﺘﻬﺎء اﻟﻤﻠﻒ اﻟﺼﻮﺗﻲ
{ )public void onCompletion(MediaPlayer mediaPlayer
ﺗﻠﻘﺎﺋﻴﺎ ﺳﻴﻨﺘﻘﻞ اﻟﻜﻮد إﻟﻰ ﻃﺮﻳﻘﺔ
;)(releaseMediaPlayer
ﺣﺬف ﻣﻮارد ﻣﺸﻐﻞ اﻟﻮﺳﺎﺋﻂ
}
ﺑﺸﻜـــﻞ ﻏﻴــﺮ ﻣﺘﺰاﻣــﻦ ASYNC
;}
ﻋﻨﺪ ﺗﺸﻐﻴﻞ ﻣﻠﻔﺎت اﻟﻮﺳﺎﺋﻂ ﻣﻦ اﻟﻤﻌﺮوف أن ﻫﺬا ﻳﺴﺘﻬﻠﻚ اﻟﻜﺜﻴﺮ ﻣﻦ اﻟﺬاﻛﺮة ﻓﻜﻴﻒ ﻧﺤﺪد أﻧﻨﺎ ﻻ ﻧﺤﺘﺎج ﻣﻮارد
ﻣﻌﻴﻨﺔ وﻛﻴﻒ ﻧﻘﻮم ﺑﺈﻓﺮاﻏﻬﺎ
ﻧﺴﺘﺨﺪم اﻟﻄﺮﻳﻘﺔ ;)( releaseﻹﺧﻼء ﻣﻮارد ﻣﺸﻐﻞ اﻟﻮﺳﺎﺋﻂ
ﺳﻨﺴﺘﺨﺪم ﻫﺬه اﻟﻄﺮﻳﻘﺔ ﻹﻓﺮاغ ﻣﻮارد ﻣﺸﻐﻞ اﻟﻮﺳﺎﺋﻂ //
{ )(private void releaseMediaPlayer
أوﻻ ﻧﺘﺄﻛﺪ ﻣﻦ وﺟﻮد ﻛﺎﺋﻦ ﻣﺸﻐﻞ اﻟﻮﺳﺎﺋﻂ وأﻧﻪ ﻻ ﻳﻘﻮم ﺑﺘﺸﻐﻴﻞ ﻣﻠﻒ وﺳﺎﺋﻂ ﺣﺎﻟﻴﺎ //
{ )if (mMediaPlayer != null
ﺑﻐﺾ اﻟﻨﻈﺮ ﻋﻦ ﺣﺎﻟﺔ ﻣﺸﻐﻞ اﻟﻮﺳﺎﺋﻂ ﺳﻴﺘﻢ إﻓﺮاغ ﻣﻮارده //
;)(mMediaPlayer.release
إﻋﺎﻃﺎء اﻟﻘﻴﻤﺔ )ﻓﺎرغ( ﻟﻤﺸﻐﻞ اﻟﻮﺳﺎﺋﻂ ﻟﺘﺤﺪﻳﺪ أﻧﻪ ﻏﻴﺮ ﺟﺎﻫﺰ ﻟﺘﺸﻐﻴﻞ وﺳﺎﺋﻂ ﺣﺎﻟﻴﺎ //
;mMediaPlayer = null
}
}
ﻳﺠﺐ إدراج ﻣﺴﺘﻤﻊ اﻷﺣﺪاث إﻟﻤﺴﺆول ﻋﻦ إﻓﺎرغ ﻣﻮارد ﻣﺸﻐﻞ اﻟﻮﺳﺎﺋﻂ
;)mMediaPlayer.setOnCompletionListener(mCompletionListener
أﻫﻢ اﻷﻣﻮر اﻟﺘﻲ ﻳﺠﺐ أن ﻳﻌﻤﻠﻬﺎ اﻟﻤﺒﺮﻣﺞ ﻫﻮ اﻟﺘﺨﻠﺺ ﻣﻦ اﻟﻤﻮارد اﻟﺘﻲ ﺗﺸﻐﻞ اﻟﺬاﻛﺮة ﻋﻨﺪﻣﺎ ﻟﻢ ﺗﻌﺪ ﺣﺎﺟﺔ إﻟﻴﻬﺎ
ﻓﺘﺴﺘﻄﻴﻊ ﺗﻄﺒﻴﻘﺎت اﻟﺠﻬﺎز اﻷﺧﺮى اﺳﺘﺨﺪام ﻫﺬه اﻟﺬاﻛﺮة
43
دورة ﺣﻴﺎة اﻟﻨﺸﺎط ACTIVITY CYCLE
ﻓﻲ أﻏﻠﺐ اﻷوﻗﺎت ﺳﻴﻜﻮن اﻟﻤﺴﺘﺨﺪم داﺧﻞ ﺗﻄﺒﻴﻘﻚ ﻓﻲ ﻧﺸﺎط Activityﻣﻌﻴﻦ ،ﻟﻜﻦ ﻣﺎذا ﻟﻮ ﻗﺮر اﻟﻤﺴﺘﺨﺪم اﻟﺨﺮوج
ﻣﻦ اﻟﺘﻄﺒﻴﻖ واﺳﺘﺨﺪام ﺗﻄﺒﻴﻖ آﺧﺮ أو أﺗﺘﻪ ﻣﻜﺎﻟﻤﺔ ،ﻫﻨﺎ ﻗﺪ ﻳﺘﻮﺟﺐ ﻋﻠﻴﻨﺎ اﻧﻬﺎء اﻟﺘﻄﺒﻴﻖ وإﻓﺮاغ ﻣﻮارد أو اﻟﺬاﻛﺮة ،أو
ﺳﻴﻔﻀﻞ ﺣﻔﻆ ﺣﺎﻟﺔ اﻟﺘﻄﺒﻴﻖ اﻟﺘﻲ ﺗﺮﻛﻬﺎ اﻟﻤﺴﺘﺨﺪم ﻟﻠﻌﻮدة إﻟﻴﻬﺎ وإﺗﻤﺎم ﻋﻤﻠﻪ ،ﻣﺜﻞ ﻛﺘﺎب رﺳﺎل ﺑﺮﻳﺪ إﻟﻜﺘﺮوﻧﻲ ،ﻓﺈن
اﻟﻤﺴﺘﺨﺪم ﻟﻮ ﺧﺮج ﻣﻦ اﻟﺘﻄﺒﻴﻖ ﻟﺴﺒﺐ ﻣﺎ ورﺟﻊ إﻟﻴﻪ وﻟﻢ ﻳﺠﺪ ﻣﺎ ﻛﺘﺒﻪ أﻧﻪ ﻗﺪ ﺣﻔﻆ ﻛﻤﺴﻮدة ﺳﻴﻜﻮن أﻣﺮا ﺑﺎﻟﻨﺴﺒﺔ ﻟﻪ
ﻟﺘﻮﻓﻴﺮ ﻫﻴﻜﻞ ﻟﺠﻤﻴﻊ اﻟﺤﺎﻻت ﻋﺪم اﻛﺘﻤﺎل اﻟﻌﻤﻞ ﻋﻠﻰ اﻟﺘﻄﺒﻴﻖ ،أﻧﺪرﻳﻮد ﻟﺪﻳﻪ دورة ﺣﻴﺎة Life Cycleﻳﻤﻜﻦ ﻣﻦ ﺧﻼﻟﻬﺎ
ﺗﺘﺒﻊ أﺣﺪاث ﺟﻤﻴﻊ اﻷﻧﺸﻄﺔ ﻓﻲ اﻟﺘﻄﺒﻴﻘﺎت
إذا ﻋﺎد اﻟﻤﺴﺘﺨﺪم إﻟﻰ اﻟﻨﺸﺎط واﻟﻌﻤﻞ ﻋﻠﻴﻪ ﻣﺮة أﺧﺮى
ﻋﻨﺪ اﻏﻼق اﻟﻨﺸﺎط ﻋﻨﺪ اﻧﺘﻘﺎل اﻟﻤﺴﺘﺨﺪم إﻟﻰ ﻧﺸﺎط أو ﺗﻄﺒﻴﻖ ﻫﻨﺎ ﻳﺼﺒﺢ اﻟﻨﺸﺎط ﻫﻨﺎ ﻳﻜﻮن اﻟﻨﺸﺎط ﻓﻌﺎل
أو ﺣﺪد اﻟﻨﻈﺎم أن ﻣﺨﺘﻠﻒ وﺑﺈﻣﻜﺎن اﻟﻤﺴﺘﺨﺪم ﻣﺮﺋﻲ ﻟﻠﻤﺴﺘﺨﺪم
اﻟﻤﺴﺘﺨﺪم ﻻ ﻳﺤﺘﺎج اﻟﺘﻔﺎﻋﻞ ﻣﻌﻪ
اﻟﻨﺸﺎط
)(OnDestroy )(OnStop )(OnPause )(OnResume )(OnStart )(OnCreate
ﻟﻤﻌﻠﻮﻣﺎت أﻛﺜﺮ ﺣﻮل دورة ﺣﻴﺎة اﻟﻨﺸﺎط ﻳﻤﻜﻨﻚ زﻳﺎرة ﻫﺬا اﻟﻤﻮﻗﻊ
https://developer.android.com/reference/android/app/Activity.html
ﻧﻤﻮذج ﻧﺸﺎط ﻳﻮﺿﺢ دورة ﺣﻴﺎة اﻟﻨﺸﺎط
@Override @Override
{ )protected void onCreate(Bundle savedInstanceState { )(protected void onPause
;)super.onCreate(savedInstanceState ;)(super.onPause
;)setContentView(R.layout.activity_main ;)"Log.v("MainActivity", "onPause
;)"Log.v("MainActivity", "onCreate }
}
@Override @Override
{ )(protected void onStart { )(protected void onStop
;)(super.onStart ;)(super.onStop
;)"Log.v("MainActivity", "onStart ;)"Log.v("MainActivity", "onStop
} }
@Override @Override
{ )(protected void onResume { )(protected void onDestroy
;)(super.onResume ;)(super.onDestroy
;)"Log.v("MainActivity", "onResume ;)"Log.v("MainActivity", "onDestroy
} }
ﻋﻨﺪ ﺗﺠﺮﺑﺔ ﻫﺬا اﻟﻤﺜﺎل ﻓﻲ اﻷﻧﺪرﻳﻮد اﺳﺘﻮدﻳﻮ ﺳﻴﺘﻢ ﻃﺒﺎﻋﺔ ﺳﻄﺮ ﻋﻨﺪ ﻛﻞ ﺣﻠﻘﺔ ﻓﻲ دورة ﺣﻴﺎة اﻟﻨﺸﺎط وﺳﺘﻈﻬﺮ
اﻟﻜﺘﺎﺑﺔ ﻓﻲ ﺷﺎﺷﺔ اﻟﺮﺳﺎﺋﻞ ﻓﻲ اﻷﺳﻔﻞ ،ﺟﺮب اﻏﻼق اﻟﺘﻄﺒﻴﻖ أو وﺿﻌﻪ ﻓﻲ ﺷﺎﺷﺔ اﻟﺘﻄﺒﻴﻘﺎت اﻟﻤﺨﻔﻴﺔ واﻟﻌﻮدة إﻟﻴﻪ
44
ﺗﺎﺑــﻊ دورة ﺣﻴﺎة اﻟﻨﺸﺎط ACTIVITY CYCLE
ﻟﻠﺤﺼﻮل ﻋﻠﻰ اﻟﻘﺎﺋﻤﺔ اﻟﻜﺎﻣﻠﺔ ﻟﻠﻄﺮق اﻟﺘﻲ
ﻳﻤﻜﻦ اﺳﺘﺨﺪاﻣﻬﺎ ﻟﺪورة ﺣﻴﺎة اﻟﻨﺸﺎط ﻧﻀﻐﻂ
Code>Override Methods ﻣﻦ اﻟﻘﺎﺋﻤﺔ
إذا ﻛﻨﺎ ﻧﺴﺘﺨﺪم ﻣﺸﻐﻞ وﺳﺎﺋﻂ MediaPlayerوﻗﺎم
اﻟﻤﺴﺘﺨﺪم ﺑﺘﺮك اﻟﻨﺸﺎط ﻓﻴﺠﺐ ﺣﺬف ﻣﻮارد
@Override
ﻣﺸﻐﻞ اﻟﻮﺳﺎﺋﻂ releaseﺧﻼل )( OnStopﻷﻧﻬﺎ
{ )(protected void onStop
اﻟﻄﺮﻳﻘﺔ اﻟﺘﻲ ﺳﺘﻜﻮن ﻣﻔﻌﻠﺔ ﺣﺎل ﺗﺮﻛﻨﺎ اﻟﺘﻄﺒﻴﻖ
;)(super.onStop
واﻟﺼﻮت ﺑﺬﻟﻚ ﺳﻴﺘﻮﻗﻒ ،وإذا ﻟﻢ ﻧﻘﻢ ﺑﻬﺬه
;)(releaseMediaPlayer
اﻟﺨﻄﻮة ﻓﺈن اﻟﻮﺳﺎﺋﻂ ﺳﺘﻈﻞ ﺗﻌﻤﻞ ﻋﻨﺪﻣﺎ ﻧﺘﺮك
}
اﻟﻨﺸﺎط إﻟﻰ أن ﻳﻨﺘﻬﻰ ﻃﻮل ﻣﻠﻒ اﻟﻮﺳﺎﺋﻂ
أﻳﻨﻤﺎ ﺗﺮى اﻟﺴﻄﺮ ;)(ــــــــ super.ﻓﺎاﻟﻔﺎﺋﺪة ﻣﻨﻬﺎ ﻫﻮ أن اﻟﻨﺸﺎط ﻳﻌﺮف ﻛﻴﻒ ﻳﻘﻮم ﺑﻬﺬه ﻋﻤﻠﻴﺔ اﺳﻠﻮب ﻻ ﻳﺮاه
اﻟﻤﺴﺘﺨﺪم وﺗﻘﻮم ﺑﺄﻋﻤﺎل ﺗﻨﻈﻴﻒ اﻟﻤﻮارد اﻟﺘﻲ ﻻﺣﺎﺟﺔ ﻟﻠﻤﻄﻮرﻳﻦ ﺑﻬﺎ وﻟﺬﻟﻚ ﻟﻮ ﺣﺎوﻟﺖ إزاﻟﺔ ﻫﺬا اﻟﺴﻄﺮ ﺳﺘﻈﻬﺮ
ﻟﻚ أﺧﻄﺎء واﻟﺘﻄﺒﻴﻖ ﻟﻦ ﻳﻌﻤﻞ
45
ﺗﺎﺑــﻊ AUDIO MANAGER ﺗﺮﻛﻴﺰ اﻟﺼﻮت و
// إﻳﻘﺎف ﻣﺆﻗﺖ ﻟﻠﺼﻮت
mMediaPlayer.pause();
// إﻋﺎدة ﻣﻠﻒ اﻟﺼﻮت إﻟﻰ اﻟﺒﺪاﻳﺔ ﻷن ﻓﻲ ﺣﺎﻟﺘﻨﺎ ﻫﺬه ﻧﺮﻳﺪ ﺳﻤﺎع اﻟﻜﻠﻤﺎت ﻣﻦ اﻟﺒﺪاﻳﺔ ﺑﻌﺪ ﺗﻐﻴﺮ ﺗﺮﻛﻴﺰ اﻟﺼﻮت
mMediaPlayer.seekTo(0);
// AUDIOFOCUS_GAIN ﻳﻘﺼﺪ ﺑﻪ أﻧﻨﺎ ﺣﺼﻠﻨﺎ ﻋﻠﻰ ﺗﺮﻛﻴﺰ اﻟﺼﻮت ﻣﺮة أﺧﺮى وﻧﺴﺘﻄﻴﻊ ﺗﺸﻐﻴﻞ اﻟﺼﻮت اﻵن
} else if (focusChange == AudioManager.AUDIOFOCUS_GAIN) {
mMediaPlayer.start();
// AUDIOFOCUS_LOSS ﻳﻘﺼﺪ ﺑﻪ أﻧﻨﺎ ﻓﻘﺪﻧﺎ ﺗﺮﻛﻴﺰ اﻟﺼﻮت وﻧﻘﻮم ﺑﺈﻳﻘﺎف اﻟﺘﺸﻐﻴﻞ وﻧﺤﺬف ﻣﻮارد ﻣﺸﻐﻞ اﻟﻮﺳﺎﺋﻂ
} else if (focusChange == AudioManager.AUDIOFOCUS_LOSS) {
// اﻹﻧﺘﻘﺎل إﻟﻰ اﻟﻄﺮﻳﻘﺔ اﻟﺘﻲ ﻓﻴﻬﺎ ﺣﺬف ﻣﻮارد ﻣﺸﻐﻞ اﻟﻮﺳﺎﺋﻂ وﻛﺬﻟﻚ إﻳﻘﺎف ﺗﺴﺠﻴﻞ ﻣﺪﻳﺮ اﻟﺼﻮت
releaseMediaPlayer();
}}
};
// AUDIOFOCUS_GAIN_TRANSIENT. ﻃﻠﺐ ﺗﺮﻛﻴﺰ اﻟﺼﻮت ﻟﺘﺸﻐﻴﻞ اﻟﻤﻠﻒ اﻟﺼﻮﺗﻲ ﻟﻔﺘﺮة ﺑﺴﻴﻄﺔ
int result = mAudioManager.requestAudioFocus(mOnAudioFocusChangeListener,
AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN_TRANSIENT);
// اﻟﺘﺄﻛﺪ ﻣﻦ اﻟﺤﺼﻮل ﻋﻠﻰ ﺗﺮﻛﻴﺰ اﻟﺼﻮت
if (result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
// ﺣﺼﻠﻨﺎ ﻋﻠﻰ ﺗﺮﻛﻴﺰ اﻟﺼﻮت
// ﺗﺸﻐﻴﻞ اﻟﺼﻮت
mMediaPlayer.start();
// ﺗﺠﻬﻴﺰ ﻣﺴﺘﻤﻊ أﺣﺪاث ﻟﻤﺸﻐﻞ اﻟﻮﺳﺎﺋﻂ ﻟﻠﺘﻤﻜﻦ ﻣﻦ إﻳﻘﺎف اﻟﺼﻮت وﺣﺬف اﻟﻤﻮارد إذا اﻧﺘﻬﻰ اﻟﻤﻠﻒ اﻟﺼﻮﺗﻲ
mMediaPlayer.setOnCompletionListener(mCompletionListener);
}
// ﻋﻨﺪﻣﺎ ﻧﻘﻮم ﺑﺈزاﻟﺔ ﺟﻤﻴﻊ ﻣﻮارد ﻣﺸﻐﻞ اﻟﻮﺳﺎﺋﻂ ﻓﻜﺬﻟﻚ ﻧﻘﻮم ﺑﺈﻳﻘﺎف وﻇﺎﺋﻒ ﻣﺪﻳﺮ اﻟﺼﻮت ﺑﻐﺾ اﻟﻨﻈﺮ ﻛﺎن ﻫﻨﺎ ﺗﺮﻛﻴﺰ ﻟﻠﺼﻮت أم ﻻ
private void releaseMediaPlayer() {
// If the media player is not null, then it may be currently playing a sound.
if (mMediaPlayer != null) {
// Regardless of the current state of the media player, release its resources
mMediaPlayer.release();
mMediaPlayer = null;
mAudioManager.abandonAudioFocus(mOnAudioFocusChangeListener);
}
}
46
ﺗﺎﺑــﻊ ﺗﺮﻛﻴﺰ اﻟﺼﻮت و AUDIO MANAGER
47
APPENDIX: ATTRIBUTES ILLUSTRATION اﻟﻤﻠﺤﻘﺎت :ﺗﻮﺿﻴﺢ اﻟﻤﻤﻴﺰات