<?xml version="1.0"?>
<rss version="2.0"><channel><title>&#x627;&#x644;&#x628;&#x631;&#x645;&#x62C;&#x629;: &#x628;&#x631;&#x645;&#x62C;&#x629; &#x623;&#x646;&#x62F;&#x631;&#x648;&#x64A;&#x62F;</title><link>https://academy.hsoub.com/programming/android/?d=2</link><description>&#x627;&#x644;&#x628;&#x631;&#x645;&#x62C;&#x629;: &#x628;&#x631;&#x645;&#x62C;&#x629; &#x623;&#x646;&#x62F;&#x631;&#x648;&#x64A;&#x62F;</description><language>ar</language><item><title>&#x637;&#x644;&#x628; &#x627;&#x644;&#x623;&#x630;&#x648;&#x646;&#x627;&#x62A; &#x645;&#x646; &#x627;&#x644;&#x645;&#x633;&#x62A;&#x62E;&#x62F;&#x645; &#x648;&#x627;&#x633;&#x62A;&#x62E;&#x62F;&#x627;&#x645; &#x645;&#x648;&#x627;&#x631;&#x62F; &#x627;&#x644;&#x647;&#x627;&#x62A;&#x641; &#x641;&#x64A; &#x62A;&#x637;&#x628;&#x64A;&#x642;&#x627;&#x62A; &#x623;&#x646;&#x62F;&#x631;&#x648;&#x64A;&#x62F;</title><link>https://academy.hsoub.com/programming/android/%D8%B7%D9%84%D8%A8-%D8%A7%D9%84%D8%A3%D8%B0%D9%88%D9%86%D8%A7%D8%AA-%D9%85%D9%86-%D8%A7%D9%84%D9%85%D8%B3%D8%AA%D8%AE%D8%AF%D9%85-%D9%88%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D9%85%D9%88%D8%A7%D8%B1%D8%AF-%D8%A7%D9%84%D9%87%D8%A7%D8%AA%D9%81-%D9%81%D9%8A-%D8%AA%D8%B7%D8%A8%D9%8A%D9%82%D8%A7%D8%AA-%D8%A3%D9%86%D8%AF%D8%B1%D9%88%D9%8A%D8%AF-r418/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2017_02/android-11.png.fcad2094178f676f9c260a3de64985dc.png" /></p>

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

<p style="text-align: center;">
	<img alt="android-11.png" class="ipsImage ipsImage_thumbnailed" data-fileid="21413" data-unique="2orp9lfbt" src="https://academy.hsoub.com/uploads/monthly_2017_02/android-11.png.f84126486ad35db14fc1e828e230810a.png"></p>

<p>
	فعند تنصيب التطبيق من متجر Play يطلب من المستخدم الموافقة على أذونات محددة يحتاجها التطبيق كي يعمل وبعد الموافقة عليها يبدأ التطبيق في التحميل والتنصيب، لذا يُنصح دائمًا بقراءة هذه الأذونات بعناية والتأكد من احتياج التطبيق لها ليؤدي وظيفته المطلوبة دون الخوف من الوصول لأشياء لا يحتاجها وذلك لكثرة وجود البرمجيات الخبيثة التي تستغل موافقتك على الأذونات للعبث بموارد ومعلومات هاتفك.
</p>

<h2 id="تطبيق-1">
	تطبيق 1
</h2>

<p>
	في هذا المثال سنتعرف على كيفية صنع تطبيق يطلب الوصول إلى أذونات معينة من المستخدم كي يؤدي وظيفته، يقوم هذا التطبيق بدور المصباح اليدوي حيث يُضيء الضوء الخاص بالكاميرا (Flashlight) بشكل برمجي عند الضغط على زر بداخله.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="21408" href="https://academy.hsoub.com/uploads/monthly_2017_02/001.png.b85ef5e5c4274f07d24bcaf435486954.png" rel=""><img alt="001.png" class="ipsImage ipsImage_thumbnailed" data-fileid="21408" data-unique="i9k1oca4x" src="https://academy.hsoub.com/uploads/monthly_2017_02/001.thumb.png.8c653bb67ea03ab5e91941f64de70d05.png" style=""></a>
</p>

<p>
	كما نفعل دومًا نبدأ بصنع واجهة المستخدم الخاصة بالتطبيق، وتتكون من زر من النوع <code>ImageButton</code> -وهو زر يستطيع أن يحتوي على صورة -لتصبح الشيفرة الخاصة بملف <code>activity_main.xml</code>
</p>

<pre class="ipsCode prettyprint lang-xml prettyprinted" id="ips_uid_4622_7">
<span class="pun">&lt;?</span><span class="pln">xml version</span><span class="pun">=</span><span class="str">"1.0"</span><span class="pln"> encoding</span><span class="pun">=</span><span class="str">"utf-8"</span><span class="pun">?&gt;</span><span class="pln">
</span><span class="tag">&lt;LinearLayout</span><span class="pln"> </span><span class="atn">xmlns:android</span><span class="pun">=</span><span class="atv">"http://schemas.android.com/apk/res/android"</span><span class="pln">
    </span><span class="atn">android:layout_width</span><span class="pun">=</span><span class="atv">"match_parent"</span><span class="pln">
    </span><span class="atn">android:layout_height</span><span class="pun">=</span><span class="atv">"match_parent"</span><span class="pln">
    </span><span class="atn">android:gravity</span><span class="pun">=</span><span class="atv">"center"</span><span class="pln">
</span><span class="tag">&gt;</span><span class="pln">

    </span><span class="tag">&lt;ImageButton</span><span class="pln">
        </span><span class="atn">android:layout_width</span><span class="pun">=</span><span class="atv">"wrap_content"</span><span class="pln">
        </span><span class="atn">android:layout_height</span><span class="pun">=</span><span class="atv">"wrap_content"</span><span class="pln">
        </span><span class="atn">android:src</span><span class="pun">=</span><span class="atv">"@drawable/power_on"</span><span class="pln">
        </span><span class="atn">android:id</span><span class="pun">=</span><span class="atv">"@+id/btn"</span><span class="pln">
        </span><span class="atn">android:background</span><span class="pun">=</span><span class="atv">"@null"</span><span class="tag">/&gt;</span><span class="pln">
</span><span class="tag">&lt;/LinearLayout&gt;</span></pre>

<p>
	بعد ذلك نقوم بالتعديل في ملف <code>AndroidManifest.xml</code> وإضافة الأذونات المطلوبة لكي نستطيع التحكم في ضوء الكاميرا.
</p>

<pre class="ipsCode prettyprint lang-xml prettyprinted" id="ips_uid_4622_9">
<span class="tag">&lt;uses-permission</span><span class="pln"> </span><span class="atn">android:name</span><span class="pun">=</span><span class="atv">"android.permission.CAMERA"</span><span class="tag">/&gt;</span><span class="pln">
</span><span class="tag">&lt;uses-feature</span><span class="pln"> </span><span class="atn">android:name</span><span class="pun">=</span><span class="atv">"android.hardware.Camera"</span><span class="tag">/&gt;</span></pre>

<p>
	باستخدام الوسم الخاص بالأذونات <code>&lt;uses-permissions&gt;</code> وتحديد الاسم الخاص به في الخاصية <code>android:name</code>، وأيضًا إضافة الوسم <code>&lt;uses-feature&gt;</code> لإعلام الهاتف أن التطبيق يحتاج إلى وجود كاميرا كي يعمل.<br>
	ويوجد العديد من الأذونات التي تمكنك من القيام بالعديد من المهام من داخل التطبيق كالاتصال بالإنترنت أو القراءة والكتابة في الذاكرة ويمكنك التعرف عليها من هنا ويتم تعريفها داخل الملف <code>AndroidManifest.xml</code> كما سبق.<br>
	إذا لم يتم تعريف الأذونات المستخدمة في التطبيق داخل ملف AndroidManifest.xml فإن التطبيق لن يعمل.
</p>

<pre class="ipsCode prettyprint lang-xml prettyprinted" id="ips_uid_4622_11">
<span class="pun">&lt;?</span><span class="pln">xml version</span><span class="pun">=</span><span class="str">"1.0"</span><span class="pln"> encoding</span><span class="pun">=</span><span class="str">"utf-8"</span><span class="pun">?&gt;</span><span class="pln">
</span><span class="tag">&lt;manifest</span><span class="pln"> </span><span class="atn">xmlns:android</span><span class="pun">=</span><span class="atv">"http://schemas.android.com/apk/res/android"</span><span class="pln">
    </span><span class="atn">package</span><span class="pun">=</span><span class="atv">"apps.noby.flashlight"</span><span class="tag">&gt;</span><span class="pln">

    </span><span class="tag">&lt;uses-permission</span><span class="pln"> </span><span class="atn">android:name</span><span class="pun">=</span><span class="atv">"android.permission.CAMERA"</span><span class="tag">/&gt;</span><span class="pln">
</span><span class="tag">&lt;uses-feature</span><span class="pln"> </span><span class="atn">android:name</span><span class="pun">=</span><span class="atv">"android.hardware.Camera"</span><span class="tag">/&gt;</span><span class="pln">
    </span><span class="tag">&lt;application</span><span class="pln">
        </span><span class="atn">android:allowBackup</span><span class="pun">=</span><span class="atv">"true"</span><span class="pln">
        </span><span class="atn">android:icon</span><span class="pun">=</span><span class="atv">"@mipmap/ic_launcher"</span><span class="pln">
        </span><span class="atn">android:label</span><span class="pun">=</span><span class="atv">"@string/app_name"</span><span class="pln">
        </span><span class="atn">android:supportsRtl</span><span class="pun">=</span><span class="atv">"true"</span><span class="pln">
        </span><span class="atn">android:theme</span><span class="pun">=</span><span class="atv">"@style/AppTheme"</span><span class="tag">&gt;</span><span class="pln">
        </span><span class="tag">&lt;activity</span><span class="pln"> </span><span class="atn">android:name</span><span class="pun">=</span><span class="atv">".MainActivity"</span><span class="tag">&gt;</span><span class="pln">
            </span><span class="tag">&lt;intent-filter&gt;</span><span class="pln">
                </span><span class="tag">&lt;action</span><span class="pln"> </span><span class="atn">android:name</span><span class="pun">=</span><span class="atv">"android.intent.action.MAIN"</span><span class="pln"> </span><span class="tag">/&gt;</span><span class="pln">

                </span><span class="tag">&lt;category</span><span class="pln"> </span><span class="atn">android:name</span><span class="pun">=</span><span class="atv">"android.intent.category.LAUNCHER"</span><span class="pln"> </span><span class="tag">/&gt;</span><span class="pln">
            </span><span class="tag">&lt;/intent-filter&gt;</span><span class="pln">
        </span><span class="tag">&lt;/activity&gt;</span><span class="pln">
    </span><span class="tag">&lt;/application&gt;</span><span class="pln">

</span><span class="tag">&lt;/manifest&gt;</span></pre>

<p>
	ننتقل الآن إلى كتابة شيفرة التحكم الخاصة بالتطبيق في ملف <code>MainActivity.java</code> وتنقسم إلى<br>
	1-التأكد من توفر ضوء للكاميرا في الهاتف أولًا.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4622_13">
<span class="kwd">if</span><span class="pun">(!</span><span class="pln">getApplicationContext</span><span class="pun">().</span><span class="pln">getPackageManager</span><span class="pun">().</span><span class="pln">hasSystemFeature</span><span class="pun">(</span><span class="typ">PackageManager</span><span class="pun">.</span><span class="pln">FEATURE_CAMERA_FLASH</span><span class="pun">))</span><span class="pln">
    finish</span><span class="pun">();</span></pre>

<p>
	وإذا لم يتواجد ضوء الكاميرا في الهاتف فسيتم غلق التطبيق في الحال.<br>
	2-الحصول على كائن يُمكننا من التحكم في ضوء الكاميرا وذلك عن طريق فتح الكاميرا ثم الحصول على الخصائص والمعاملات الخاصة بها وتغيير المتغير الخاص بضوء الكاميرا.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4622_15">
<span class="pln">camera </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Camera</span><span class="pun">.</span><span class="pln">open</span><span class="pun">();</span><span class="pln">
param </span><span class="pun">=</span><span class="pln"> camera</span><span class="pun">.</span><span class="pln">getParameters</span><span class="pun">();</span></pre>

<p>
	3-برمجة الزر المتواجد في الواجهة الرئيسية لكي يُضيء ضوء الكاميرا عند الضغط عليه ويغلقه عن الضغط مرة أخرى.<code class="language-android hljs java"><span class="pln"> </span></code>
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4622_17">
<span class="pln"> btn </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="typ">ImageButton</span><span class="pun">)</span><span class="pln"> findViewById</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">id</span><span class="pun">.</span><span class="pln">btn</span><span class="pun">);</span><span class="pln">

        btn</span><span class="pun">.</span><span class="pln">setOnClickListener</span><span class="pun">(</span><span class="kwd">new</span><span class="pln"> </span><span class="typ">View</span><span class="pun">.</span><span class="typ">OnClickListener</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
            </span><span class="lit">@Override</span><span class="pln">
            </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> onClick</span><span class="pun">(</span><span class="typ">View</span><span class="pln"> v</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
                </span><span class="kwd">if</span><span class="pun">(!</span><span class="pln">isTorchON</span><span class="pun">){</span><span class="pln">
                    turnONTorch</span><span class="pun">();</span><span class="pln">
                </span><span class="pun">}</span><span class="kwd">else</span><span class="pln">
                    turnOFFTorch</span><span class="pun">();</span><span class="pln">
            </span><span class="pun">}</span><span class="pln">
        </span><span class="pun">});</span></pre>

<p>
	لتُصبح شيفرة التحكم الرئيسية هي
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4622_19">
<span class="pln">package apps</span><span class="pun">.</span><span class="pln">noby</span><span class="pun">.</span><span class="pln">flashlight</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">hardware</span><span class="pun">.</span><span class="typ">Camera</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">hardware</span><span class="pun">.</span><span class="typ">Camera</span><span class="pun">.</span><span class="typ">Parameters</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">app</span><span class="pun">.</span><span class="typ">Activity</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">os</span><span class="pun">.</span><span class="typ">Bundle</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">view</span><span class="pun">.</span><span class="typ">View</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">widget</span><span class="pun">.</span><span class="typ">ImageButton</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">MainActivity</span><span class="pln"> extends </span><span class="typ">Activity</span><span class="pln"> </span><span class="pun">{</span><span class="pln">


    </span><span class="typ">ImageButton</span><span class="pln"> btn</span><span class="pun">;</span><span class="pln">
    boolean isTorchON</span><span class="pun">;</span><span class="pln">
    </span><span class="typ">Camera</span><span class="pln"> camera</span><span class="pun">;</span><span class="pln">
    </span><span class="kwd">private</span><span class="pln"> </span><span class="typ">Parameters</span><span class="pln"> param</span><span class="pun">;</span><span class="pln">

    </span><span class="lit">@Override</span><span class="pln">
    </span><span class="kwd">protected</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> onCreate</span><span class="pun">(</span><span class="typ">Bundle</span><span class="pln"> savedInstanceState</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        super</span><span class="pun">.</span><span class="pln">onCreate</span><span class="pun">(</span><span class="pln">savedInstanceState</span><span class="pun">);</span><span class="pln">
        setContentView</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">layout</span><span class="pun">.</span><span class="pln">activity_main</span><span class="pun">);</span><span class="pln">


        btn </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="typ">ImageButton</span><span class="pun">)</span><span class="pln"> findViewById</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">id</span><span class="pun">.</span><span class="pln">btn</span><span class="pun">);</span><span class="pln">

        btn</span><span class="pun">.</span><span class="pln">setOnClickListener</span><span class="pun">(</span><span class="kwd">new</span><span class="pln"> </span><span class="typ">View</span><span class="pun">.</span><span class="typ">OnClickListener</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
            </span><span class="lit">@Override</span><span class="pln">
            </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> onClick</span><span class="pun">(</span><span class="typ">View</span><span class="pln"> v</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
                </span><span class="kwd">if</span><span class="pun">(!</span><span class="pln">isTorchON</span><span class="pun">){</span><span class="pln">
                    turnONTorch</span><span class="pun">();</span><span class="pln">
                </span><span class="pun">}</span><span class="kwd">else</span><span class="pln">
                    turnOFFTorch</span><span class="pun">();</span><span class="pln">
            </span><span class="pun">}</span><span class="pln">
        </span><span class="pun">});</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">


    </span><span class="lit">@Override</span><span class="pln">
</span><span class="kwd">protected</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> onStart</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    super</span><span class="pun">.</span><span class="pln"> onStart</span><span class="pun">();</span><span class="pln">

    </span><span class="kwd">if</span><span class="pun">(!</span><span class="pln">getApplicationContext</span><span class="pun">().</span><span class="pln">getPackageManager</span><span class="pun">().</span><span class="pln">hasSystemFeature</span><span class="pun">(</span><span class="typ">PackageManager</span><span class="pun">.</span><span class="pln">FEATURE_CAMERA_FLASH</span><span class="pun">))</span><span class="pln">
        finish</span><span class="pun">();</span><span class="pln">

    </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">camera </span><span class="pun">==</span><span class="pln"> </span><span class="kwd">null</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        isTorchON </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">;</span><span class="pln">
        camera </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Camera</span><span class="pun">.</span><span class="pln">open</span><span class="pun">();</span><span class="pln">
        param </span><span class="pun">=</span><span class="pln"> camera</span><span class="pun">.</span><span class="pln">getParameters</span><span class="pun">();</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">


    </span><span class="lit">@Override</span><span class="pln">
    </span><span class="kwd">protected</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> onPause</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        super</span><span class="pun">.</span><span class="pln">onPause</span><span class="pun">();</span><span class="pln">
        </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">camera </span><span class="pun">!=</span><span class="pln"> </span><span class="kwd">null</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
            camera</span><span class="pun">.</span><span class="pln">release</span><span class="pun">();</span><span class="pln">
            camera </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">null</span><span class="pun">;</span><span class="pln">
        </span><span class="pun">}</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	يتبقى تعريف ما هي الوظيفة الخاصة بالدالة <code>turnONTorch()</code> و<code>TurnOFFTorch()</code>.<br>
	تقوم الدالة <code>turnONTorch()</code> بتشغيل الضوء وذلك عن طريق تمرير المعامل <code>FLASH_MODE_TORCH</code> كإحدى معاملات الكاميرا ثم تفعيل الكاميرا بالمعاملات الجديدة عند استدعاء <code>startPreview()</code>.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4622_21">
<span class="pln">    </span><span class="kwd">private</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> turnONTorch</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">

        param</span><span class="pun">.</span><span class="pln">setFlashMode</span><span class="pun">(</span><span class="typ">Parameters</span><span class="pun">.</span><span class="pln">FLASH_MODE_TORCH</span><span class="pun">);</span><span class="pln">
        camera</span><span class="pun">.</span><span class="pln">setParameters</span><span class="pun">(</span><span class="pln">param</span><span class="pun">);</span><span class="pln">
        camera</span><span class="pun">.</span><span class="pln">startPreview</span><span class="pun">();</span><span class="pln">
        isTorchON </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">;</span><span class="pln">
        btn</span><span class="pun">.</span><span class="pln">setImageResource</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">drawable</span><span class="pun">.</span><span class="pln">power_off</span><span class="pun">);</span><span class="pln">

    </span><span class="pun">}</span></pre>

<p>
	وبالمثل نبني <code>turnOFFTorch()</code> كي يتم إطفاء الضوء.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4622_23">
<span class="pln">    </span><span class="kwd">private</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> turnOFFTorch</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">

        param</span><span class="pun">.</span><span class="pln">setFlashMode</span><span class="pun">(</span><span class="typ">Parameters</span><span class="pun">.</span><span class="pln">FLASH_MODE_OFF</span><span class="pun">);</span><span class="pln">
        camera</span><span class="pun">.</span><span class="pln">setParameters</span><span class="pun">(</span><span class="pln">param</span><span class="pun">);</span><span class="pln">
        camera</span><span class="pun">.</span><span class="pln">stopPreview</span><span class="pun">();</span><span class="pln">
        isTorchON </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">;</span><span class="pln">
        btn</span><span class="pun">.</span><span class="pln">setImageResource</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">drawable</span><span class="pun">.</span><span class="pln">power_on</span><span class="pun">);</span><span class="pln">

    </span><span class="pun">}</span></pre>

<p>
	لتُصبح الشيفرة النهائية لملف <code>MainActivity.java</code>
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4622_25">
<span class="pln">package apps</span><span class="pun">.</span><span class="pln">noby</span><span class="pun">.</span><span class="pln">flashlight</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">content</span><span class="pun">.</span><span class="pln">pm</span><span class="pun">.</span><span class="typ">PackageManager</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">hardware</span><span class="pun">.</span><span class="typ">Camera</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">hardware</span><span class="pun">.</span><span class="typ">Camera</span><span class="pun">.</span><span class="typ">Parameters</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">app</span><span class="pun">.</span><span class="typ">Activity</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">os</span><span class="pun">.</span><span class="typ">Bundle</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">view</span><span class="pun">.</span><span class="typ">View</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">widget</span><span class="pun">.</span><span class="typ">ImageButton</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">MainActivity</span><span class="pln"> extends </span><span class="typ">Activity</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="typ">ImageButton</span><span class="pln"> btn</span><span class="pun">;</span><span class="pln">
boolean isTorchON</span><span class="pun">;</span><span class="pln">
</span><span class="typ">Camera</span><span class="pln"> camera</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">private</span><span class="pln"> </span><span class="typ">Parameters</span><span class="pln"> param</span><span class="pun">;</span><span class="pln">

</span><span class="lit">@Override</span><span class="pln">
</span><span class="kwd">protected</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> onCreate</span><span class="pun">(</span><span class="typ">Bundle</span><span class="pln"> savedInstanceState</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    super</span><span class="pun">.</span><span class="pln">onCreate</span><span class="pun">(</span><span class="pln">savedInstanceState</span><span class="pun">);</span><span class="pln">
    setContentView</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">layout</span><span class="pun">.</span><span class="pln">activity_main</span><span class="pun">);</span><span class="pln">


    btn </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="typ">ImageButton</span><span class="pun">)</span><span class="pln"> findViewById</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">id</span><span class="pun">.</span><span class="pln">btn</span><span class="pun">);</span><span class="pln">

    btn</span><span class="pun">.</span><span class="pln">setOnClickListener</span><span class="pun">(</span><span class="kwd">new</span><span class="pln"> </span><span class="typ">View</span><span class="pun">.</span><span class="typ">OnClickListener</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        </span><span class="lit">@Override</span><span class="pln">
        </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> onClick</span><span class="pun">(</span><span class="typ">View</span><span class="pln"> v</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
            </span><span class="kwd">if</span><span class="pun">(!</span><span class="pln">isTorchON</span><span class="pun">){</span><span class="pln">
                turnONTorch</span><span class="pun">();</span><span class="pln">
            </span><span class="pun">}</span><span class="kwd">else</span><span class="pln">
                turnOFFTorch</span><span class="pun">();</span><span class="pln">
        </span><span class="pun">}</span><span class="pln">
    </span><span class="pun">});</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">private</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> turnONTorch</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">

    param</span><span class="pun">.</span><span class="pln">setFlashMode</span><span class="pun">(</span><span class="typ">Parameters</span><span class="pun">.</span><span class="pln">FLASH_MODE_TORCH</span><span class="pun">);</span><span class="pln">
    camera</span><span class="pun">.</span><span class="pln">setParameters</span><span class="pun">(</span><span class="pln">param</span><span class="pun">);</span><span class="pln">
    camera</span><span class="pun">.</span><span class="pln">startPreview</span><span class="pun">();</span><span class="pln">
    isTorchON </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">;</span><span class="pln">
    btn</span><span class="pun">.</span><span class="pln">setImageResource</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">drawable</span><span class="pun">.</span><span class="pln">power_off</span><span class="pun">);</span><span class="pln">

</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">private</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> turnOFFTorch</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">

    param</span><span class="pun">.</span><span class="pln">setFlashMode</span><span class="pun">(</span><span class="typ">Parameters</span><span class="pun">.</span><span class="pln">FLASH_MODE_OFF</span><span class="pun">);</span><span class="pln">
    camera</span><span class="pun">.</span><span class="pln">setParameters</span><span class="pun">(</span><span class="pln">param</span><span class="pun">);</span><span class="pln">
    camera</span><span class="pun">.</span><span class="pln">stopPreview</span><span class="pun">();</span><span class="pln">
    isTorchON </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">;</span><span class="pln">
    btn</span><span class="pun">.</span><span class="pln">setImageResource</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">drawable</span><span class="pun">.</span><span class="pln">power_on</span><span class="pun">);</span><span class="pln">

</span><span class="pun">}</span><span class="pln">

</span><span class="lit">@Override</span><span class="pln">
</span><span class="kwd">protected</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> onStart</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    super</span><span class="pun">.</span><span class="pln"> onStart</span><span class="pun">();</span><span class="pln">

    </span><span class="kwd">if</span><span class="pun">(!</span><span class="pln"> getApplicationContext</span><span class="pun">().</span><span class="pln">getPackageManager</span><span class="pun">().</span><span class="pln">hasSystemFeature</span><span class="pun">(</span><span class="typ">PackageManager</span><span class="pun">.</span><span class="pln">FEATURE_CAMERA_FLASH</span><span class="pun">))</span><span class="pln">
        finish</span><span class="pun">();</span><span class="pln">

    </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">camera </span><span class="pun">==</span><span class="pln"> </span><span class="kwd">null</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        isTorchON </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">;</span><span class="pln">
        camera </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Camera</span><span class="pun">.</span><span class="pln">open</span><span class="pun">();</span><span class="pln">
        param </span><span class="pun">=</span><span class="pln"> camera</span><span class="pun">.</span><span class="pln">getParameters</span><span class="pun">();</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="lit">@Override</span><span class="pln">
</span><span class="kwd">protected</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> onPause</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    super</span><span class="pun">.</span><span class="pln">onPause</span><span class="pun">();</span><span class="pln">
    </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">camera </span><span class="pun">!=</span><span class="pln"> </span><span class="kwd">null</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        camera</span><span class="pun">.</span><span class="pln">release</span><span class="pun">();</span><span class="pln">
        camera </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">null</span><span class="pun">;</span><span class="pln">


    </span><span class="pun">}</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	بعد ذلك نقوم بتجربة التطبيق على هاتف حقيقي وليس المحاكي حيث لا يمكنه محاكاة إضاءة ضوء الكاميرا.
</p>

<h2 id="تطبيق-2">
	تطبيق 2
</h2>

<p>
	بعد الإصدار السادس لنظام تشغيل أندرويد (Android Marshmallow) تم تعريف نموذج جديد للتعامل مع الأذونات داخل التطبيق حيث كان النموذج القديم يتطلب موافقة المستخدم على كافة الأذونات الخاصة بالتطبيق قبل تحميله على الهاتف أو رفضها وعدم تحميل التطبيق. أما الآن فأصبح بإمكان المستخدم تحميل وتنصيب التطبيق على الهاتف دون الموافقة على الأذونات إلا عند الحاجة إليها لكي تقوم بوظيفة ما، كما يمكن الموافقة على بعض الأذونات ورفض الأخرى (قد يؤدي ذلك إلى عدم عمل التطبيق بشكله الكامل) ويمكن بعد ذلك الموافقة عليها مما يعطي المستخدم القدرة على التحكم في التطبيق من داخل الإعدادات الخاصة بالتطبيق.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="21409" href="https://academy.hsoub.com/uploads/monthly_2017_02/002.png.3f79cf87d3248d38176007f2e1212fa1.png" rel=""><img alt="002.png" class="ipsImage ipsImage_thumbnailed" data-fileid="21409" data-unique="qi7j9dydy" src="https://academy.hsoub.com/uploads/monthly_2017_02/002.thumb.png.93d13017c08f689ba8e9618b26658560.png" style=""></a>
</p>

<p>
	وتنقسم الأذونات إلى قسمين:
</p>

<ol>
<li>
		الأذونات العادية وهي التي لا تهدد خصوصية المستخدم، ويتم التعامل معها دون طلب الأذن عند الحاجة إليها يكفي فقط طلب الأذن عند التحميل من المتجر مرة واحدة.
	</li>
	<li>
		الأذونات الخطيرة وهي التي قد تصل إلى بيانات خاصة بالمستخدم وتحتاج إلى انتباه المستخدم للتطبيق وطلب الأذن منه عندما استخدامها من قبل التطبيق.<br>
		سنتعامل في هذا التطبيق مع أحد هذه الأذونات الخطيرة، حيث سنقوم بصنع تطبيق يمكنه الاتصال مباشرة برقم محدد من قبل المستخدم ويُعتبر الاتصال من الأذونات الخطيرة وذلك لأنه قد يُعرض المستخدم لتكاليف خاصة بالاتصال.
	</li>
</ol>
<p>
	نبدأ أولًا بصنع واجهة المستخدم وهي تتكون من عنصر EditText كي يكتب المستخدم بداخله الرقم الذي يرغب في الاتصال به وزر للضغط عليه حتى يقوم التطبيق بالاتصال بهذا الرقم.
</p>

<pre class="ipsCode prettyprint lang-xml prettyprinted" id="ips_uid_4622_27">
<span class="pun">&lt;?</span><span class="pln">xml version</span><span class="pun">=</span><span class="str">"1.0"</span><span class="pln"> encoding</span><span class="pun">=</span><span class="str">"utf-8"</span><span class="pun">?&gt;</span><span class="pln">
</span><span class="tag">&lt;LinearLayout</span><span class="pln"> </span><span class="atn">xmlns:android</span><span class="pun">=</span><span class="atv">"http://schemas.android.com/apk/res/android"</span><span class="pln">
    </span><span class="atn">android:layout_width</span><span class="pun">=</span><span class="atv">"match_parent"</span><span class="pln">
    </span><span class="atn">android:layout_height</span><span class="pun">=</span><span class="atv">"match_parent"</span><span class="pln">
    </span><span class="atn">android:orientation</span><span class="pun">=</span><span class="atv">"horizontal"</span><span class="pln">
    </span><span class="atn">android:layout_margin</span><span class="pun">=</span><span class="atv">"16dp"</span><span class="tag">&gt;</span><span class="pln">

    </span><span class="tag">&lt;EditText</span><span class="pln">
        </span><span class="atn">android:layout_width</span><span class="pun">=</span><span class="atv">"0dp"</span><span class="pln">
        </span><span class="atn">android:layout_height</span><span class="pun">=</span><span class="atv">"wrap_content"</span><span class="pln">
        </span><span class="atn">android:layout_weight</span><span class="pun">=</span><span class="atv">"1"</span><span class="pln">
        </span><span class="atn">android:hint</span><span class="pun">=</span><span class="atv">"Enter Phone Number"</span><span class="pln">
        </span><span class="atn">android:id</span><span class="pun">=</span><span class="atv">"@+id/ph_num"</span><span class="tag">/&gt;</span><span class="pln">

    </span><span class="tag">&lt;Button</span><span class="pln">
        </span><span class="atn">android:layout_width</span><span class="pun">=</span><span class="atv">"wrap_content"</span><span class="pln">
        </span><span class="atn">android:layout_height</span><span class="pun">=</span><span class="atv">"wrap_content"</span><span class="pln">
        </span><span class="atn">android:text</span><span class="pun">=</span><span class="atv">"Call"</span><span class="pln">
        </span><span class="atn">android:id</span><span class="pun">=</span><span class="atv">"@+id/call_btn"</span><span class="tag">/&gt;</span><span class="pln">
</span><span class="tag">&lt;/LinearLayout&gt;</span></pre>

<p>
	بعد ذلك نحدد الأذونات الخاصة بالتطبيق في <code>AndroidManifest.xml</code> وهنا هو
</p>

<pre class="ipsCode prettyprint lang-xml prettyprinted" id="ips_uid_4622_29">
<span class="tag">&lt;uses-permission</span><span class="pln"> </span><span class="atn">android:name</span><span class="pun">=</span><span class="atv">"android.permission.CALL_PHONE"</span><span class="tag">/&gt;</span></pre>

<p>
	ويتم تضمينه داخل الملف كما سبق.
</p>

<pre class="ipsCode prettyprint lang-xml prettyprinted" id="ips_uid_4622_31">
<span class="pun">&lt;?</span><span class="pln">xml version</span><span class="pun">=</span><span class="str">"1.0"</span><span class="pln"> encoding</span><span class="pun">=</span><span class="str">"utf-8"</span><span class="pun">?&gt;</span><span class="pln">
</span><span class="tag">&lt;manifest</span><span class="pln"> </span><span class="atn">xmlns:android</span><span class="pun">=</span><span class="atv">"http://schemas.android.com/apk/res/android"</span><span class="pln">
    </span><span class="atn">package</span><span class="pun">=</span><span class="atv">"apps.noby.dailer"</span><span class="tag">&gt;</span><span class="pln">

    </span><span class="tag">&lt;uses-permission</span><span class="pln"> </span><span class="atn">android:name</span><span class="pun">=</span><span class="atv">"android.permission.CALL_PHONE"</span><span class="tag">/&gt;</span><span class="pln">

    </span><span class="tag">&lt;application</span><span class="pln">
        </span><span class="atn">android:allowBackup</span><span class="pun">=</span><span class="atv">"true"</span><span class="pln">
        </span><span class="atn">android:icon</span><span class="pun">=</span><span class="atv">"@mipmap/ic_launcher"</span><span class="pln">
        </span><span class="atn">android:label</span><span class="pun">=</span><span class="atv">"@string/app_name"</span><span class="pln">
        </span><span class="atn">android:supportsRtl</span><span class="pun">=</span><span class="atv">"true"</span><span class="pln">
        </span><span class="atn">android:theme</span><span class="pun">=</span><span class="atv">"@style/AppTheme"</span><span class="tag">&gt;</span><span class="pln">
        </span><span class="tag">&lt;activity</span><span class="pln"> </span><span class="atn">android:name</span><span class="pun">=</span><span class="atv">".MainActivity"</span><span class="tag">&gt;</span><span class="pln">
            </span><span class="tag">&lt;intent-filter&gt;</span><span class="pln">
                </span><span class="tag">&lt;action</span><span class="pln"> </span><span class="atn">android:name</span><span class="pun">=</span><span class="atv">"android.intent.action.MAIN"</span><span class="pln"> </span><span class="tag">/&gt;</span><span class="pln">

                </span><span class="tag">&lt;category</span><span class="pln"> </span><span class="atn">android:name</span><span class="pun">=</span><span class="atv">"android.intent.category.LAUNCHER"</span><span class="pln"> </span><span class="tag">/&gt;</span><span class="pln">
            </span><span class="tag">&lt;/intent-filter&gt;</span><span class="pln">
        </span><span class="tag">&lt;/activity&gt;</span><span class="pln">
    </span><span class="tag">&lt;/application&gt;</span><span class="pln">

</span><span class="tag">&lt;/manifest&gt;</span></pre>

<p>
	الآن يتبقى برمجة الزر كي يقوم بالاتصال ويتم التحكم في ذلك عن طريق استخدام <code>Intent</code> وتمرير له <code>ACTION_CALL</code> لتحديد وظيفته وهي الاتصال، ثم تحديد البيانات التي نرغب في إرسالها بداخل هذا الـ Intent وهي رقم الهاتف الذي تم إدخاله من قبل المستخدم داخل <code>EditText</code> وتسبقه “<code>tel:</code>” لإعلام نظام التشغيل بأنه رقم هاتف.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4622_33">
<span class="pln">     </span><span class="typ">String</span><span class="pln"> num </span><span class="pun">=</span><span class="pln"> et</span><span class="pun">.</span><span class="pln">getText</span><span class="pun">().</span><span class="pln">toString</span><span class="pun">();</span><span class="pln">
     </span><span class="typ">Intent</span><span class="pln"> intent </span><span class="pun">=</span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Intent</span><span class="pun">(</span><span class="typ">Intent</span><span class="pun">.</span><span class="pln">ACTION_CALL</span><span class="pun">);</span><span class="pln">
     intent</span><span class="pun">.</span><span class="pln">setData</span><span class="pun">(</span><span class="typ">Uri</span><span class="pun">.</span><span class="pln">parse</span><span class="pun">(</span><span class="str">"tel:"</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> num</span><span class="pun">))</span><span class="pln"> </span><span class="pun">;</span></pre>

<p>
	قبل القيام بعملية الاتصال يجب أولًا التأكد من حصول التطبيق على الأذونات الخاصة بالاتصال من المستخدم سواء عند التنصيب في الإصدارات القديمة أو طلبها في الإصدارات الأحدث.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4622_35">
<span class="pln">call_btn</span><span class="pun">.</span><span class="pln">setOnClickListener</span><span class="pun">(</span><span class="kwd">new</span><span class="pln"> </span><span class="typ">View</span><span class="pun">.</span><span class="typ">OnClickListener</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
            </span><span class="lit">@Override</span><span class="pln">
            </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> onClick</span><span class="pun">(</span><span class="typ">View</span><span class="pln"> v</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
                </span><span class="typ">String</span><span class="pln"> num </span><span class="pun">=</span><span class="pln"> et</span><span class="pun">.</span><span class="pln">getText</span><span class="pun">().</span><span class="pln">toString</span><span class="pun">();</span><span class="pln">
                </span><span class="typ">Intent</span><span class="pln"> intent </span><span class="pun">=</span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Intent</span><span class="pun">(</span><span class="typ">Intent</span><span class="pun">.</span><span class="pln">ACTION_CALL</span><span class="pun">);</span><span class="pln">
                intent</span><span class="pun">.</span><span class="pln">setData</span><span class="pun">(</span><span class="typ">Uri</span><span class="pun">.</span><span class="pln">parse</span><span class="pun">(</span><span class="str">"tel:"</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> num</span><span class="pun">))</span><span class="pln"> </span><span class="pun">;</span><span class="pln">

                    </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="typ">ContextCompat</span><span class="pun">.</span><span class="pln">checkSelfPermission</span><span class="pun">(</span><span class="typ">MainActivity</span><span class="pun">.</span><span class="kwd">this</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Manifest</span><span class="pun">.</span><span class="pln">permission</span><span class="pun">.</span><span class="pln">CALL_PHONE</span><span class="pun">)</span><span class="pln"> </span><span class="pun">!=</span><span class="pln"> </span><span class="typ">PackageManager</span><span class="pun">.</span><span class="pln">PERMISSION_GRANTED</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">

                        </span><span class="typ">ActivityCompat</span><span class="pun">.</span><span class="pln">requestPermissions</span><span class="pun">(</span><span class="typ">MainActivity</span><span class="pun">.</span><span class="kwd">this</span><span class="pun">,</span><span class="kwd">new</span><span class="pln"> </span><span class="typ">String</span><span class="pun">[]{</span><span class="typ">Manifest</span><span class="pun">.</span><span class="pln">permission</span><span class="pun">.</span><span class="pln">CALL_PHONE</span><span class="pun">},</span><span class="pln">CALL_PHONE_PERMISSIONS_REQUEST</span><span class="pun">);</span><span class="pln">
                    </span><span class="pun">}</span><span class="pln">
                    </span><span class="kwd">else</span><span class="pln">
                        startActivity</span><span class="pun">(</span><span class="pln">intent</span><span class="pun">);</span><span class="pln">
            </span><span class="pun">}</span><span class="pln">
        </span><span class="pun">});</span></pre>

<p>
	للتحقق من الأذونات نستخدم التابع <code>checkSelfPermission()</code> فإذا كان لم يتم الحصول عليه نطلب من المستخدم الموافقة عليه باستخدام التابع <code>requestPermissions()</code> غير ذلك نقوم بالاتصال.<br>
	عند طلب الحصول على إذن محدد من المستخدم يظهر أمام المستخدم مربع يطلب منه الموافقة أو الرفض ويقوم بتسجيل اختيار المستخدم لذلك ثم يستدعي التابع <code>onRequestPermissionsResult()</code> بشكل تلقائي ونقوم بداخله من التأكد من موافقة المستخدم على الأذن وإظهار رسالة بذلك.
</p>

<p style="text-align: center;">
	<br><a class="ipsAttachLink ipsAttachLink_image" data-fileid="21410" href="https://academy.hsoub.com/uploads/monthly_2017_02/003.png.b03685593b979392c5cb1220ec6b82b2.png" rel=""><img alt="003.png" class="ipsImage ipsImage_thumbnailed" data-fileid="21410" data-unique="5zgutrphk" src="https://academy.hsoub.com/uploads/monthly_2017_02/003.thumb.png.fe9d1ec1c564b781c467f8c492ea807e.png" style=""></a>
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4622_37">
<span class="pln">    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> onRequestPermissionsResult</span><span class="pun">(</span><span class="kwd">int</span><span class="pln"> requestCode</span><span class="pun">,</span><span class="pln"> </span><span class="typ">String</span><span class="pln"> permissions</span><span class="pun">[],</span><span class="pln"> </span><span class="kwd">int</span><span class="pun">[]</span><span class="pln"> grantResults</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">

        </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">requestCode </span><span class="pun">==</span><span class="pln"> CALL_PHONE_PERMISSIONS_REQUEST</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
            </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">grantResults</span><span class="pun">.</span><span class="pln">length </span><span class="pun">==</span><span class="pln"> </span><span class="lit">1</span><span class="pln"> </span><span class="pun">&amp;&amp;</span><span class="pln"> grantResults</span><span class="pun">[</span><span class="lit">0</span><span class="pun">]</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> </span><span class="typ">PackageManager</span><span class="pun">.</span><span class="pln">PERMISSION_GRANTED</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
                </span><span class="typ">Toast</span><span class="pun">.</span><span class="pln">makeText</span><span class="pun">(</span><span class="kwd">this</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Call Phones permission granted"</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Toast</span><span class="pun">.</span><span class="pln">LENGTH_SHORT</span><span class="pun">).</span><span class="pln">show</span><span class="pun">();</span><span class="pln">
            </span><span class="pun">}</span><span class="pln"> </span><span class="kwd">else</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
                </span><span class="typ">Toast</span><span class="pun">.</span><span class="pln">makeText</span><span class="pun">(</span><span class="kwd">this</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Call Phones permission denied"</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Toast</span><span class="pun">.</span><span class="pln">LENGTH_SHORT</span><span class="pun">).</span><span class="pln">show</span><span class="pun">();</span><span class="pln">
            </span><span class="pun">}</span><span class="pln">
        </span><span class="pun">}</span><span class="pln"> </span><span class="kwd">else</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
            super</span><span class="pun">.</span><span class="pln">onRequestPermissionsResult</span><span class="pun">(</span><span class="pln">requestCode</span><span class="pun">,</span><span class="pln"> permissions</span><span class="pun">,</span><span class="pln"> grantResults</span><span class="pun">);</span><span class="pln">
        </span><span class="pun">}</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	لتُصبح الشيفرة الكاملة لهذا التطبيق في ملف <code>MainActivity.java</code> هي
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4622_39">
<span class="pln">package apps</span><span class="pun">.</span><span class="pln">noby</span><span class="pun">.</span><span class="pln">dailer</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="typ">Manifest</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">app</span><span class="pun">.</span><span class="typ">Activity</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">content</span><span class="pun">.</span><span class="typ">Intent</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">content</span><span class="pun">.</span><span class="pln">pm</span><span class="pun">.</span><span class="typ">PackageManager</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">net</span><span class="pun">.</span><span class="typ">Uri</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">os</span><span class="pun">.</span><span class="typ">Bundle</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">support</span><span class="pun">.</span><span class="pln">v4</span><span class="pun">.</span><span class="pln">app</span><span class="pun">.</span><span class="typ">ActivityCompat</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">support</span><span class="pun">.</span><span class="pln">v4</span><span class="pun">.</span><span class="pln">content</span><span class="pun">.</span><span class="typ">ContextCompat</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">view</span><span class="pun">.</span><span class="typ">View</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">widget</span><span class="pun">.</span><span class="typ">Button</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">widget</span><span class="pun">.</span><span class="typ">EditText</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">widget</span><span class="pun">.</span><span class="typ">Toast</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">MainActivity</span><span class="pln"> extends </span><span class="typ">Activity</span><span class="pln"> </span><span class="pun">{</span><span class="pln">

    </span><span class="kwd">private</span><span class="pln"> </span><span class="kwd">static</span><span class="pln"> final </span><span class="kwd">int</span><span class="pln"> CALL_PHONE_PERMISSIONS_REQUEST </span><span class="pun">=</span><span class="pln"> </span><span class="lit">3</span><span class="pun">;</span><span class="pln">
    </span><span class="kwd">private</span><span class="pln"> </span><span class="typ">EditText</span><span class="pln"> et</span><span class="pun">;</span><span class="pln">
    </span><span class="kwd">private</span><span class="pln"> </span><span class="typ">Button</span><span class="pln"> call_btn</span><span class="pun">;</span><span class="pln">
    </span><span class="lit">@Override</span><span class="pln">
    </span><span class="kwd">protected</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> onCreate</span><span class="pun">(</span><span class="typ">Bundle</span><span class="pln"> savedInstanceState</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        super</span><span class="pun">.</span><span class="pln">onCreate</span><span class="pun">(</span><span class="pln">savedInstanceState</span><span class="pun">);</span><span class="pln">
        setContentView</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">layout</span><span class="pun">.</span><span class="pln">activity_main</span><span class="pun">);</span><span class="pln">

        et </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="typ">EditText</span><span class="pun">)</span><span class="pln"> findViewById</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">id</span><span class="pun">.</span><span class="pln">ph_num</span><span class="pun">);</span><span class="pln">
        call_btn </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="typ">Button</span><span class="pun">)</span><span class="pln"> findViewById</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">id</span><span class="pun">.</span><span class="pln">call_btn</span><span class="pun">);</span><span class="pln">

        call_btn</span><span class="pun">.</span><span class="pln">setOnClickListener</span><span class="pun">(</span><span class="kwd">new</span><span class="pln"> </span><span class="typ">View</span><span class="pun">.</span><span class="typ">OnClickListener</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
            </span><span class="lit">@Override</span><span class="pln">
            </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> onClick</span><span class="pun">(</span><span class="typ">View</span><span class="pln"> v</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
                </span><span class="typ">String</span><span class="pln"> num </span><span class="pun">=</span><span class="pln"> et</span><span class="pun">.</span><span class="pln">getText</span><span class="pun">().</span><span class="pln">toString</span><span class="pun">();</span><span class="pln">
                </span><span class="typ">Intent</span><span class="pln"> intent </span><span class="pun">=</span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Intent</span><span class="pun">(</span><span class="typ">Intent</span><span class="pun">.</span><span class="pln">ACTION_CALL</span><span class="pun">);</span><span class="pln">
                intent</span><span class="pun">.</span><span class="pln">setData</span><span class="pun">(</span><span class="typ">Uri</span><span class="pun">.</span><span class="pln">parse</span><span class="pun">(</span><span class="str">"tel:"</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> num</span><span class="pun">))</span><span class="pln"> </span><span class="pun">;</span><span class="pln">

                    </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="typ">ContextCompat</span><span class="pun">.</span><span class="pln">checkSelfPermission</span><span class="pun">(</span><span class="typ">MainActivity</span><span class="pun">.</span><span class="kwd">this</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Manifest</span><span class="pun">.</span><span class="pln">permission</span><span class="pun">.</span><span class="pln">CALL_PHONE</span><span class="pun">)</span><span class="pln"> </span><span class="pun">!=</span><span class="pln"> </span><span class="typ">PackageManager</span><span class="pun">.</span><span class="pln">PERMISSION_GRANTED</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">

                        </span><span class="typ">ActivityCompat</span><span class="pun">.</span><span class="pln">requestPermissions</span><span class="pun">(</span><span class="typ">MainActivity</span><span class="pun">.</span><span class="kwd">this</span><span class="pun">,</span><span class="kwd">new</span><span class="pln"> </span><span class="typ">String</span><span class="pun">[]{</span><span class="typ">Manifest</span><span class="pun">.</span><span class="pln">permission</span><span class="pun">.</span><span class="pln">CALL_PHONE</span><span class="pun">},</span><span class="pln">CALL_PHONE_PERMISSIONS_REQUEST</span><span class="pun">);</span><span class="pln">
                    </span><span class="pun">}</span><span class="pln">
                    </span><span class="kwd">else</span><span class="pln">
                        startActivity</span><span class="pun">(</span><span class="pln">intent</span><span class="pun">);</span><span class="pln">
            </span><span class="pun">}</span><span class="pln">
        </span><span class="pun">});</span><span class="pln">

    </span><span class="pun">}</span><span class="pln">

    </span><span class="lit">@Override</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> onRequestPermissionsResult</span><span class="pun">(</span><span class="kwd">int</span><span class="pln"> requestCode</span><span class="pun">,</span><span class="pln"> </span><span class="typ">String</span><span class="pln"> permissions</span><span class="pun">[],</span><span class="pln"> </span><span class="kwd">int</span><span class="pun">[]</span><span class="pln"> grantResults</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">

        </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">requestCode </span><span class="pun">==</span><span class="pln"> CALL_PHONE_PERMISSIONS_REQUEST</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
            </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">grantResults</span><span class="pun">.</span><span class="pln">length </span><span class="pun">==</span><span class="pln"> </span><span class="lit">1</span><span class="pln"> </span><span class="pun">&amp;&amp;</span><span class="pln"> grantResults</span><span class="pun">[</span><span class="lit">0</span><span class="pun">]</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> </span><span class="typ">PackageManager</span><span class="pun">.</span><span class="pln">PERMISSION_GRANTED</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
                </span><span class="typ">Toast</span><span class="pun">.</span><span class="pln">makeText</span><span class="pun">(</span><span class="kwd">this</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Call Phones permission granted"</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Toast</span><span class="pun">.</span><span class="pln">LENGTH_SHORT</span><span class="pun">).</span><span class="pln">show</span><span class="pun">();</span><span class="pln">
            </span><span class="pun">}</span><span class="pln"> </span><span class="kwd">else</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
                </span><span class="typ">Toast</span><span class="pun">.</span><span class="pln">makeText</span><span class="pun">(</span><span class="kwd">this</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Call Phones permission denied"</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Toast</span><span class="pun">.</span><span class="pln">LENGTH_SHORT</span><span class="pun">).</span><span class="pln">show</span><span class="pun">();</span><span class="pln">
            </span><span class="pun">}</span><span class="pln">
        </span><span class="pun">}</span><span class="pln"> </span><span class="kwd">else</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
            super</span><span class="pun">.</span><span class="pln">onRequestPermissionsResult</span><span class="pun">(</span><span class="pln">requestCode</span><span class="pun">,</span><span class="pln"> permissions</span><span class="pun">,</span><span class="pln"> grantResults</span><span class="pun">);</span><span class="pln">
        </span><span class="pun">}</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	لاحظ أنه إذا كان الهاتف يعمل بإصدار سابق لـ Android Marshmallow فسيتم الحصول على الموافقة على كافة الأذونات عند التحميل من المتجر كما كان يحدث سابقًا.<br>
	يمكننا الآن تجربة التطبيق على المحاكي أو على هاتف حقيقي.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="21411" href="https://academy.hsoub.com/uploads/monthly_2017_02/004.png.d01bb39e39a497f1ca0fe37895eee015.png" rel=""><img alt="004.png" class="ipsImage ipsImage_thumbnailed" data-fileid="21411" data-unique="tt92tbg60" src="https://academy.hsoub.com/uploads/monthly_2017_02/004.thumb.png.990c51979aeb56f358aadfa51c73e3e8.png" style=""></a>
</p>

<p>
	يجب عليك مراعاة عدم إجهاد المستخدم بالعديد من الأذونات التي لا حاجة لها داخل تطبيقك حتى لا يضطر المستخدم إلى إزالة تطبيقك والتخلص منه.<br>
	لذا يجب الاهتمام بتقديم تجربة استخدام جيدة، ففي العديد من الأحيان لا يكون خيار طلب الأذونات من المستخدم والقيام بالمهمة من داخل تطبيقك هو الخيار الأفضل، فقد يكون الأفضل استخدام الـ intent وطلب الوظيفة من تطبيق آخر للقيام بها.<br>
	مثال على ذلك يمكننا تعديل التطبيق السابق وإزالة الأذن الخاص بالاتصال من التطبيق، وتعديل الشيفرة في MainActivty.java كي تقوم بنقل مهمة الاتصال من التطبيق نفسه إلى أحد تطبيقات الاتصال المتواجدة بالهاتف
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4622_41">
<span class="pln">package apps</span><span class="pun">.</span><span class="pln">noby</span><span class="pun">.</span><span class="pln">dailer</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">app</span><span class="pun">.</span><span class="typ">Activity</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">content</span><span class="pun">.</span><span class="typ">Intent</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">net</span><span class="pun">.</span><span class="typ">Uri</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">os</span><span class="pun">.</span><span class="typ">Bundle</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">view</span><span class="pun">.</span><span class="typ">View</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">widget</span><span class="pun">.</span><span class="typ">Button</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">widget</span><span class="pun">.</span><span class="typ">EditText</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">MainActivity</span><span class="pln"> extends </span><span class="typ">Activity</span><span class="pln"> </span><span class="pun">{</span><span class="pln">

    </span><span class="kwd">private</span><span class="pln"> </span><span class="typ">EditText</span><span class="pln"> et</span><span class="pun">;</span><span class="pln">
    </span><span class="kwd">private</span><span class="pln"> </span><span class="typ">Button</span><span class="pln"> call_btn</span><span class="pun">;</span><span class="pln">
    </span><span class="lit">@Override</span><span class="pln">
    </span><span class="kwd">protected</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> onCreate</span><span class="pun">(</span><span class="typ">Bundle</span><span class="pln"> savedInstanceState</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        super</span><span class="pun">.</span><span class="pln">onCreate</span><span class="pun">(</span><span class="pln">savedInstanceState</span><span class="pun">);</span><span class="pln">
        setContentView</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">layout</span><span class="pun">.</span><span class="pln">activity_main</span><span class="pun">);</span><span class="pln">

        et </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="typ">EditText</span><span class="pun">)</span><span class="pln"> findViewById</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">id</span><span class="pun">.</span><span class="pln">ph_num</span><span class="pun">);</span><span class="pln">
        call_btn </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="typ">Button</span><span class="pun">)</span><span class="pln"> findViewById</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">id</span><span class="pun">.</span><span class="pln">call_btn</span><span class="pun">);</span><span class="pln">

        call_btn</span><span class="pun">.</span><span class="pln">setOnClickListener</span><span class="pun">(</span><span class="kwd">new</span><span class="pln"> </span><span class="typ">View</span><span class="pun">.</span><span class="typ">OnClickListener</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
            </span><span class="lit">@Override</span><span class="pln">
            </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> onClick</span><span class="pun">(</span><span class="typ">View</span><span class="pln"> v</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
                </span><span class="typ">String</span><span class="pln"> num </span><span class="pun">=</span><span class="pln"> et</span><span class="pun">.</span><span class="pln">getText</span><span class="pun">().</span><span class="pln">toString</span><span class="pun">();</span><span class="pln">
                </span><span class="typ">Intent</span><span class="pln"> intent </span><span class="pun">=</span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Intent</span><span class="pun">(</span><span class="typ">Intent</span><span class="pun">.</span><span class="pln">ACTION_DIAL</span><span class="pun">);</span><span class="pln">
                intent</span><span class="pun">.</span><span class="pln">setData</span><span class="pun">(</span><span class="typ">Uri</span><span class="pun">.</span><span class="pln">parse</span><span class="pun">(</span><span class="str">"tel:"</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> num</span><span class="pun">))</span><span class="pln"> </span><span class="pun">;</span><span class="pln">
                startActivity</span><span class="pun">(</span><span class="pln">intent</span><span class="pun">);</span><span class="pln">
            </span><span class="pun">}</span><span class="pln">
        </span><span class="pun">});</span><span class="pln">

    </span><span class="pun">}</span><span class="pln">

</span><span class="pun">}</span></pre>

<p>
	عند تجربة التطبيق على المحاكي ينقلنا إلى تطبيق الاتصال الخاص بالهاتف مع إدخال رقم الهاتف والانتظار لاتصال المستخدم بالرقم.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="21412" href="https://academy.hsoub.com/uploads/monthly_2017_02/005.png.01543d4079c71d38d09427220cec3696.png" rel=""><img alt="005.png" class="ipsImage ipsImage_thumbnailed" data-fileid="21412" data-unique="lt2wb0a9s" src="https://academy.hsoub.com/uploads/monthly_2017_02/005.thumb.png.cb2cc5c6baf41d8adf110bb3264930bd.png" style=""></a>
</p>

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

<p>
	بهذا نكون قد وصلنا إلى نهاية هذا الدرس، في انتظار تجربتكم وآرائكم.
</p>

<p><a class="ipsAttachLink" href="//academy.hsoub.com/applications/core/interface/file/attachment.php?id=21414">Icons.zip</a></p>]]></description><guid isPermaLink="false">418</guid><pubDate>Wed, 27 Jul 2016 23:00:00 +0000</pubDate></item><item><title>&#x627;&#x644;&#x62A;&#x639;&#x627;&#x645;&#x644; &#x645;&#x639; &#x627;&#x644;&#x625;&#x634;&#x639;&#x627;&#x631;&#x627;&#x62A; &#x641;&#x64A; &#x62A;&#x637;&#x628;&#x64A;&#x642;&#x627;&#x62A; &#x623;&#x646;&#x62F;&#x631;&#x648;&#x64A;&#x62F;</title><link>https://academy.hsoub.com/programming/android/%D8%A7%D9%84%D8%AA%D8%B9%D8%A7%D9%85%D9%84-%D9%85%D8%B9-%D8%A7%D9%84%D8%A5%D8%B4%D8%B9%D8%A7%D8%B1%D8%A7%D8%AA-%D9%81%D9%8A-%D8%AA%D8%B7%D8%A8%D9%8A%D9%82%D8%A7%D8%AA-%D8%A3%D9%86%D8%AF%D8%B1%D9%88%D9%8A%D8%AF-r368/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2016_07/android-notifications.png.f2291a889727beb561ea559686e418da.png" /></p>

<p>
	يتميز نظام تشغيل أندرويد بوجود شريط أعلى الشاشة يمُد المستخدم بالعديد من المعلومات الهامة من ضمنها الإشعارات التي ترسلها التطبيقات.
</p>

<p style="text-align: center;">
	<img alt="android-notifications.png" class="ipsImage ipsImage_thumbnailed" data-fileid="18585" data-unique="w655x4mh8" src="https://academy.hsoub.com/uploads/monthly_2016_07/android-notifications.png.94b988c4c3411d212797d137f8d335bc.png"></p>

<p>
	فالإشعارات هي جزء من واجهة المستخدم لكنها تظهر خارج التطبيق لإعلام المستخدم بحدث معين، مما يُمكّن المستخدم من عرضه والتفاعل معه بينما يستخدم تطبيقًا آخر. ويحتوي الإشعار على رسالة مختصرة عن هذا الحدث.
</p>

<p>
	ويظهر الإشعار عند حدوثه كأيقونة تعبر عن التطبيق في شريط الحالة أعلى الشاشة، ويمكنك معرفة تفاصيله عند سحب درج الإشعارات والضغط على الإشعار.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="18567" href="https://academy.hsoub.com/uploads/monthly_2016_07/11.png.c28a855a61447e82c24f4a516b2ea496.png" rel=""><img alt="11.png" class="ipsImage ipsImage_thumbnailed" data-fileid="18567" data-unique="crzu3aydb" src="https://academy.hsoub.com/uploads/monthly_2016_07/11.thumb.png.e893e1256e994a4df02c816478ed47b7.png"></a>
</p>

<p>
	هناك عدة خطوات لصنع الإشعارات من داخل تطبيقك:
</p>

<h2>
	صنع كائن البناء الخاص بالإشعار من الصنف<span style="font-family:courier new,courier,monospace;"> Notification.Builder</span>
</h2>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_3404_7">
<span class="typ">Notification</span><span class="pun">.</span><span class="typ">Builder</span><span class="pln"> mBuilder </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Notification</span><span class="pun">.</span><span class="typ">Builder</span><span class="pun">(</span><span class="kwd">this</span><span class="pun">);</span></pre>

<p>
	من خلال هذا الكائن يمكننا التحكم في الخصائص الخاصة بالإشعار مثل عنوان الإشعار، الأيقونة المستخدمة، التحكم في الأولوية، التحكم في المهام التي يستطيع القيام بها عند الضغط عليه وغيرهم من الخصائص المختلفة.
</p>

<h2>
	تخصيص الحد الأدنى من الخصائص للإشعار
</h2>

<p>
	بعد الحصول على كائن البناء نبدأ في التحكم في خصائص الإشعار، وهناك بعض الخصائص الأساسية اللازم توافرها في الإشعار وهي:
</p>

<ul>
<li>
		الأيقونة الخاصة بالإشعار.
	</li>
	<li>
		عنوان الإشعار.
	</li>
	<li>
		المحتوى الخاص بالإشعار.
	</li>
</ul>
<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="18568" href="https://academy.hsoub.com/uploads/monthly_2016_07/12.png.cb40f5e1e75f710c33d4be8c9abffab8.png" rel=""><img alt="12.png" class="ipsImage ipsImage_thumbnailed" data-fileid="18568" data-unique="8ugkxfcuf" src="https://academy.hsoub.com/uploads/monthly_2016_07/12.thumb.png.112895b57cd77265bca8bb3fcabf3d10.png"></a>
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_3404_9">
<span class="pln">mBuilder</span><span class="pun">.</span><span class="pln">setSmallIcon</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">drawable</span><span class="pun">.</span><span class="pln">msg_icon</span><span class="pun">);</span><span class="pln">
mBuilder</span><span class="pun">.</span><span class="pln">setContentTitle</span><span class="pun">(</span><span class="str">"New Message"</span><span class="pun">);</span><span class="pln">
mBuilder</span><span class="pun">.</span><span class="pln">setContentText</span><span class="pun">(</span><span class="str">"Hi, This is the message text."</span><span class="pun">);</span></pre>

<p>
	ويوجد العديد من الخصائص الأخرى التي يمكنك استخدامها حسب حاجة التطبيق لها.
</p>

<h2>
	بناء الإشعار بالخصائص السابقة
</h2>

<p>
	يتم ذلك باستدعاء التابع <span style="font-family:courier new,courier,monospace;">()build</span> والحصول على كائن من <span style="font-family:courier new,courier,monospace;">Notification</span>.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_3404_11">
<span class="typ">Notification</span><span class="pln"> notif </span><span class="pun">=</span><span class="pln"> mBuilder</span><span class="pun">.</span><span class="pln">build</span><span class="pun">();</span></pre>

<h2>
	إظهار الإشعار في درج الإشعارات
</h2>

<p>
	يوفر أندرويد الصنف <span style="font-family:courier new,courier,monospace;">NotificationManager</span> لإدارة الإشعارات من حيث إصدار الإشعار، تعديل الإشعار بعد إصداره أو إلغاء الإشعار برمجيًا. لذا يجب أولًا الحصول على كائن من هذا الصنف وذلك عن طريق استدعاء الدالة <span style="font-family:courier new,courier,monospace;">()getSystemService</span> وتمرير الثابت <span style="font-family:courier new,courier,monospace;">NOTIFICATION_SERVICE</span> والذي يعني طلب الخدمات الخاصة بالإشعارات من خدمات النظام. وسيتم استخدام الدالة <span style="font-family:courier new,courier,monospace;">()getSystemService</span> كثيرًا عند الحاجة لطلب خدمات من النظام.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_3404_13">
<span class="typ">NotificationManager</span><span class="pln"> notifyMngr </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="typ">NotificationManager</span><span class="pun">)</span><span class="pln"> getSystemService</span><span class="pun">(</span><span class="pln">NOTIFICATION_SERVICE</span><span class="pun">);</span></pre>

<p>
	بعد ذلك نستدعي التابع<span style="font-family:courier new,courier,monospace;"> ()notify </span>باستخدام الكائن من <span style="font-family:courier new,courier,monospace;">NotificationManager</span> ليظهر الإشعار في الحال، وتمرير رقم مميز له يُعبر عن الإشعار ليُستخدم هذا الرقم فيما بعد للتعديل على الإشعار أو إلغائه، كما يتم تمرير الإشعار الذي تم بنائه من قبل.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_3404_15">
<span class="kwd">int</span><span class="pln"> notificationId </span><span class="pun">=</span><span class="pln"> </span><span class="lit">103</span><span class="pun">;</span><span class="pln">
notifyMngr</span><span class="pun">.</span><span class="pln">notify</span><span class="pun">(</span><span class="pln">notificationId</span><span class="pun">,</span><span class="pln"> notif</span><span class="pun">);</span></pre>

<h2>
	تطبيق 1
</h2>

<p>
	سنقوم في هذا التطبيق بتجربة الخطوات السابق شرحها لتكوين التطبيق مثل الصورة التالية:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="18569" href="https://academy.hsoub.com/uploads/monthly_2016_07/13.png.bb6b0d03fbf20a5a144ea6e64887d6a1.png" rel=""><img alt="13.png" class="ipsImage ipsImage_thumbnailed" data-fileid="18569" data-unique="1ytw3q8gq" src="https://academy.hsoub.com/uploads/monthly_2016_07/13.thumb.png.029742f920bb5c90aeb767993feac767.png"></a>
</p>

<p>
	أولًا نبدأ بصنع واجهة المستخدم البسيطة في ملف<span style="font-family:courier new,courier,monospace;"> activity_main.xml:</span>
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3404_17">
<span class="pun">&lt;?</span><span class="pln">xml version</span><span class="pun">=</span><span class="str">"1.0"</span><span class="pln"> encoding</span><span class="pun">=</span><span class="str">"utf-8"</span><span class="pun">?&gt;</span><span class="pln">
</span><span class="tag">&lt;LinearLayout</span><span class="pln"> </span><span class="atn">xmlns:android</span><span class="pun">=</span><span class="atv">"http://schemas.android.com/apk/res/android"</span><span class="pln">
	</span><span class="atn">android:layout_width</span><span class="pun">=</span><span class="atv">"match_parent"</span><span class="pln">
	</span><span class="atn">android:layout_height</span><span class="pun">=</span><span class="atv">"match_parent"</span><span class="pln">
	</span><span class="atn">android:orientation</span><span class="pun">=</span><span class="atv">"vertical"</span><span class="pln">
	</span><span class="atn">android:gravity</span><span class="pun">=</span><span class="atv">"center"</span><span class="tag">&gt;</span><span class="pln">

	</span><span class="tag">&lt;Button</span><span class="pln">
		</span><span class="atn">android:layout_width</span><span class="pun">=</span><span class="atv">"wrap_content"</span><span class="pln">
		</span><span class="atn">android:layout_height</span><span class="pun">=</span><span class="atv">"wrap_content"</span><span class="pln">
		</span><span class="atn">android:text</span><span class="pun">=</span><span class="atv">"Show Notification"</span><span class="pln">
		</span><span class="atn">android:id</span><span class="pun">=</span><span class="atv">"@+id/shw_notification"</span><span class="tag">/&gt;</span><span class="pln">
</span><span class="tag">&lt;/LinearLayout&gt;</span></pre>

<p>
	بعد ذلك ننتقل إلى الشيفرة الخاصة بالتطبيق في <span style="font-family:courier new,courier,monospace;">MainActivity.java </span>باتباع الخطوات ذاتها لصنع الإشعار عند الضغط على الزر.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_3404_19">
<span class="pln">package apps</span><span class="pun">.</span><span class="pln">noby</span><span class="pun">.</span><span class="pln">simplenotification</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">app</span><span class="pun">.</span><span class="typ">Activity</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">app</span><span class="pun">.</span><span class="typ">Notification</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">app</span><span class="pun">.</span><span class="typ">NotificationManager</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">os</span><span class="pun">.</span><span class="typ">Bundle</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">view</span><span class="pun">.</span><span class="typ">View</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">widget</span><span class="pun">.</span><span class="typ">Button</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">MainActivity</span><span class="pln"> extends </span><span class="typ">Activity</span><span class="pln"> </span><span class="pun">{</span><span class="pln">

	</span><span class="kwd">private</span><span class="pln"> </span><span class="typ">Button</span><span class="pln"> shwbtn</span><span class="pun">;</span><span class="pln">
	</span><span class="kwd">private</span><span class="pln"> </span><span class="typ">String</span><span class="pln"> title</span><span class="pun">;</span><span class="pln">
	</span><span class="kwd">private</span><span class="pln"> </span><span class="typ">String</span><span class="pln"> detailText</span><span class="pun">;</span><span class="pln">

	</span><span class="lit">@Override</span><span class="pln">
	</span><span class="kwd">protected</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> onCreate</span><span class="pun">(</span><span class="typ">Bundle</span><span class="pln"> savedInstanceState</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
		super</span><span class="pun">.</span><span class="pln">onCreate</span><span class="pun">(</span><span class="pln">savedInstanceState</span><span class="pun">);</span><span class="pln">
		setContentView</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">layout</span><span class="pun">.</span><span class="pln">activity_main</span><span class="pun">);</span><span class="pln">

		shwbtn </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="typ">Button</span><span class="pun">)</span><span class="pln"> findViewById</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">id</span><span class="pun">.</span><span class="pln">shw_notification</span><span class="pun">);</span><span class="pln">
		title </span><span class="pun">=</span><span class="pln"> </span><span class="str">"New Message"</span><span class="pun">;</span><span class="pln">
		detailText </span><span class="pun">=</span><span class="str">"Hi, This is the message text."</span><span class="pun">;</span><span class="pln">

		shwbtn</span><span class="pun">.</span><span class="pln">setOnClickListener</span><span class="pun">(</span><span class="kwd">new</span><span class="pln"> </span><span class="typ">View</span><span class="pun">.</span><span class="typ">OnClickListener</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
			</span><span class="lit">@Override</span><span class="pln">
			</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> onClick</span><span class="pun">(</span><span class="typ">View</span><span class="pln"> v</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
				</span><span class="com">//Step 1</span><span class="pln">
				</span><span class="typ">Notification</span><span class="pun">.</span><span class="typ">Builder</span><span class="pln"> mBuilder </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Notification</span><span class="pun">.</span><span class="typ">Builder</span><span class="pun">(</span><span class="typ">MainActivity</span><span class="pun">.</span><span class="kwd">this</span><span class="pun">);</span><span class="pln">
	
				</span><span class="com">//Step 2</span><span class="pln">
				mBuilder</span><span class="pun">.</span><span class="pln">setSmallIcon</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">drawable</span><span class="pun">.</span><span class="pln">ic_message</span><span class="pun">);</span><span class="pln">
				mBuilder</span><span class="pun">.</span><span class="pln">setContentTitle</span><span class="pun">(</span><span class="pln">title</span><span class="pun">);</span><span class="pln">
				mBuilder</span><span class="pun">.</span><span class="pln">setContentText</span><span class="pun">(</span><span class="pln">detailText</span><span class="pun">);</span><span class="pln">

				</span><span class="com">//Step 3</span><span class="pln">
				</span><span class="typ">Notification</span><span class="pln"> notif </span><span class="pun">=</span><span class="pln"> mBuilder</span><span class="pun">.</span><span class="pln">build</span><span class="pun">();</span><span class="pln">

				</span><span class="com">//Step 4</span><span class="pln">
				</span><span class="typ">NotificationManager</span><span class="pln"> notifyMngr </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="typ">NotificationManager</span><span class="pun">)</span><span class="pln"> getSystemService</span><span class="pun">(</span><span class="pln">NOTIFICATION_SERVICE</span><span class="pun">);</span><span class="pln">

				</span><span class="kwd">int</span><span class="pln"> notificationId </span><span class="pun">=</span><span class="pln"> </span><span class="lit">103</span><span class="pun">;</span><span class="pln">
				notifyMngr</span><span class="pun">.</span><span class="pln">notify</span><span class="pun">(</span><span class="pln">notificationId</span><span class="pun">,</span><span class="pln">notif</span><span class="pun">);</span><span class="pln">
			</span><span class="pun">}</span><span class="pln">
		</span><span class="pun">});</span><span class="pln">
	</span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	ثم نقوم بتجربة التطبيق على المحاكي للتأكد من عمله كما ينبغي.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="18570" href="https://academy.hsoub.com/uploads/monthly_2016_07/14.png.081c737726d6c70e6aba75140b1ce881.png" rel=""><img alt="14.png" class="ipsImage ipsImage_thumbnailed" data-fileid="18570" data-unique="1g5tdv05z" src="https://academy.hsoub.com/uploads/monthly_2016_07/14.thumb.png.1268f9c29ae00abe35f89e03ebb8ba9d.png"></a>
</p>

<h2>
	تطبيق 2
</h2>

<p>
	في التطبيق السابق عند الضغط على الإشعار لا يحدث شيئ، لذا في هذا التطبيق سنقوم بفتح نشاط جديد يعرض تفاصيل الإشعار أو ما نريد من معلومات عند الضغط على الإشعار.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="18571" href="https://academy.hsoub.com/uploads/monthly_2016_07/15.png.0d0cd64dd131080a36b55b7a46bc0890.png" rel=""><img alt="15.png" class="ipsImage ipsImage_thumbnailed" data-fileid="18571" data-unique="o8b793kdu" src="https://academy.hsoub.com/uploads/monthly_2016_07/15.thumb.png.b74f6029eec2c49333cb75634ecc621b.png"></a>
</p>

<p>
	ولفتح نشاط جديد داخل التطبيق سنستخدم <span style="font-family:courier new,courier,monospace;">Intent</span> ولكن سنقوم بتغليف الكائن من <span style="font-family:courier new,courier,monospace;">Intent</span> داخل كائن آخر من <span style="font-family:courier new,courier,monospace;">PendingIntent</span> وفائدة هذا التغليف هو أنه لا يمكن استخدام الكائن من <span style="font-family:courier new,courier,monospace;">Intent</span> خارج التطبيق، والإشعار كما ذكرنا يُعرض خارج حدود التطبيق لذا يقوم <span style="font-family:courier new,courier,monospace;">PendingIntent</span> بإعطاء الصلاحية للتطبيقات الأخرى أو النظام والذي نُرسل إليه <span style="font-family:courier new,courier,monospace;">PendingIntent</span> القدرة على تنفيذ الأوامر كأنها تتم داخل تطبيقك.
</p>

<p>
	أولًا نقوم بصنع نشاط جديد يُدعى <span style="font-family:courier new,courier,monospace;">ResultActivity</span>.
</p>

<p>
	ثانيًا سنقوم بتعديل الشيفرة الخاصة بـ <span style="font-family:courier new,courier,monospace;">MainActivity.java</span> وإضافة كائن من <span style="font-family:courier new,courier,monospace;">Intent</span>.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_3404_21">
<span class="typ">Intent</span><span class="pln"> intent </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Intent</span><span class="pun">(</span><span class="typ">MainActivity</span><span class="pun">.</span><span class="kwd">this</span><span class="pun">,</span><span class="typ">ResultActivity</span><span class="pun">.</span><span class="kwd">class</span><span class="pun">);</span></pre>

<p>
	ونستطيع إرسال بيانات إلى النشاط الآخر بنفس الطريقة المستخدمة في الدروس السابقة.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_3404_23">
<span class="pln">intent</span><span class="pun">.</span><span class="pln">putExtra</span><span class="pun">(</span><span class="pln">DESC_KEY</span><span class="pun">,</span><span class="pln">detailText</span><span class="pun">);</span></pre>

<p>
	ثم نقوم بتغليف الكائن داخل <span style="font-family:courier new,courier,monospace;">PendingIntent:</span>
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_3404_25">
<span class="typ">PendingIntent</span><span class="pln"> pIntent </span><span class="pun">=</span><span class="pln"> </span><span class="typ">PendingIntent</span><span class="pun">.</span><span class="pln">getActivity</span><span class="pun">(</span><span class="typ">MainActivity</span><span class="pun">.</span><span class="kwd">this</span><span class="pln"> </span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pln"> </span><span class="pun">,</span><span class="pln"> intent </span><span class="pun">,</span><span class="pln"> </span><span class="typ">PendingIntent</span><span class="pun">.</span><span class="pln">FLAG_UPDATE_CURRENT</span><span class="pun">);</span></pre>

<p>
	والخطوة الأخيرة هي وضع هذا <span style="font-family:courier new,courier,monospace;">Intent</span> ضمن خصائص الإشعار باستخدام كائن البناء:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_3404_27">
<span class="pln">mBuilder</span><span class="pun">.</span><span class="pln">setContentIntent</span><span class="pun">(</span><span class="pln">pIntent</span><span class="pun">);</span></pre>

<p>
	لتُصبح الشيفرة النهائية لملف <span style="font-family:courier new,courier,monospace;">MainActivity.java</span> بعد التعديل هي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_3404_29">
<span class="pln">package apps</span><span class="pun">.</span><span class="pln">noby</span><span class="pun">.</span><span class="pln">simplenotification</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">app</span><span class="pun">.</span><span class="typ">Activity</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">app</span><span class="pun">.</span><span class="typ">Notification</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">app</span><span class="pun">.</span><span class="typ">NotificationManager</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">app</span><span class="pun">.</span><span class="typ">PendingIntent</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">content</span><span class="pun">.</span><span class="typ">Intent</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">os</span><span class="pun">.</span><span class="typ">Bundle</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">view</span><span class="pun">.</span><span class="typ">View</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">widget</span><span class="pun">.</span><span class="typ">Button</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">MainActivity</span><span class="pln"> extends </span><span class="typ">Activity</span><span class="pln"> </span><span class="pun">{</span><span class="pln">

	</span><span class="kwd">private</span><span class="pln"> </span><span class="typ">Button</span><span class="pln"> shwbtn</span><span class="pun">;</span><span class="pln">
	</span><span class="kwd">private</span><span class="pln"> </span><span class="typ">String</span><span class="pln"> title</span><span class="pun">;</span><span class="pln">
	</span><span class="kwd">private</span><span class="pln"> </span><span class="typ">String</span><span class="pln"> detailText</span><span class="pun">;</span><span class="pln">
	</span><span class="kwd">public</span><span class="pln"> final </span><span class="kwd">static</span><span class="pln"> </span><span class="typ">String</span><span class="pln"> DESC_KEY </span><span class="pun">=</span><span class="str">"descriptionKey"</span><span class="pun">;</span><span class="pln">

	</span><span class="lit">@Override</span><span class="pln">
	</span><span class="kwd">protected</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> onCreate</span><span class="pun">(</span><span class="typ">Bundle</span><span class="pln"> savedInstanceState</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
		super</span><span class="pun">.</span><span class="pln">onCreate</span><span class="pun">(</span><span class="pln">savedInstanceState</span><span class="pun">);</span><span class="pln">
		setContentView</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">layout</span><span class="pun">.</span><span class="pln">activity_main</span><span class="pun">);</span><span class="pln">

        shwbtn </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="typ">Button</span><span class="pun">)</span><span class="pln"> findViewById</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">id</span><span class="pun">.</span><span class="pln">shw_notification</span><span class="pun">);</span><span class="pln">
		title </span><span class="pun">=</span><span class="pln"> </span><span class="str">"New Message"</span><span class="pun">;</span><span class="pln">
		detailText </span><span class="pun">=</span><span class="str">"Hi, This is the message text."</span><span class="pun">;</span><span class="pln">

    	shwbtn</span><span class="pun">.</span><span class="pln">setOnClickListener</span><span class="pun">(</span><span class="kwd">new</span><span class="pln"> </span><span class="typ">View</span><span class="pun">.</span><span class="typ">OnClickListener</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
			</span><span class="lit">@Override</span><span class="pln">
			</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> onClick</span><span class="pun">(</span><span class="typ">View</span><span class="pln"> v</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
				</span><span class="com">//Step 1</span><span class="pln">
				</span><span class="typ">Notification</span><span class="pun">.</span><span class="typ">Builder</span><span class="pln"> mBuilder </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Notification</span><span class="pun">.</span><span class="typ">Builder</span><span class="pun">(</span><span class="typ">MainActivity</span><span class="pun">.</span><span class="kwd">this</span><span class="pun">);</span><span class="pln">

				</span><span class="com">//Step 2</span><span class="pln">
				mBuilder</span><span class="pun">.</span><span class="pln">setSmallIcon</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">drawable</span><span class="pun">.</span><span class="pln">ic_message</span><span class="pun">);</span><span class="pln">
				mBuilder</span><span class="pun">.</span><span class="pln">setContentTitle</span><span class="pun">(</span><span class="pln">title</span><span class="pun">);</span><span class="pln">
				mBuilder</span><span class="pun">.</span><span class="pln">setContentText</span><span class="pun">(</span><span class="pln">detailText</span><span class="pun">);</span><span class="pln">

				</span><span class="typ">Intent</span><span class="pln"> intent </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Intent</span><span class="pun">(</span><span class="typ">MainActivity</span><span class="pun">.</span><span class="kwd">this</span><span class="pun">,</span><span class="typ">ResultActivity</span><span class="pun">.</span><span class="kwd">class</span><span class="pun">);</span><span class="pln">
				intent</span><span class="pun">.</span><span class="pln">putExtra</span><span class="pun">(</span><span class="pln">DESC_KEY</span><span class="pun">,</span><span class="pln">detailText</span><span class="pun">);</span><span class="pln">
				</span><span class="typ">PendingIntent</span><span class="pln"> pIntent </span><span class="pun">=</span><span class="pln"> </span><span class="typ">PendingIntent</span><span class="pun">.</span><span class="pln">getActivity</span><span class="pun">(</span><span class="typ">MainActivity</span><span class="pun">.</span><span class="kwd">this</span><span class="pun">,</span><span class="lit">0</span><span class="pun">,</span><span class="pln">intent</span><span class="pun">,</span><span class="typ">PendingIntent</span><span class="pun">.</span><span class="pln">FLAG_UPDATE_CURRENT</span><span class="pun">);</span><span class="pln">

				mBuilder</span><span class="pun">.</span><span class="pln">setContentIntent</span><span class="pun">(</span><span class="pln">pIntent</span><span class="pun">);</span><span class="pln">

				</span><span class="com">//Step 3</span><span class="pln">
				</span><span class="typ">Notification</span><span class="pln"> notif </span><span class="pun">=</span><span class="pln"> mBuilder</span><span class="pun">.</span><span class="pln">build</span><span class="pun">();</span><span class="pln">

				</span><span class="com">//Step 4</span><span class="pln">
				</span><span class="typ">NotificationManager</span><span class="pln"> notifyMngr </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="typ">NotificationManager</span><span class="pun">)</span><span class="pln"> getSystemService</span><span class="pun">(</span><span class="pln">NOTIFICATION_SERVICE</span><span class="pun">);</span><span class="pln">

				</span><span class="kwd">int</span><span class="pln"> notificationId </span><span class="pun">=</span><span class="pln"> </span><span class="lit">103</span><span class="pun">;</span><span class="pln">
				notifyMngr</span><span class="pun">.</span><span class="pln">notify</span><span class="pun">(</span><span class="pln">notificationId</span><span class="pun">,</span><span class="pln">notif</span><span class="pun">);</span><span class="pln">
			</span><span class="pun">}</span><span class="pln">
		</span><span class="pun">});</span><span class="pln">
	</span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span></pre>

<p>
	ولم نقم بتغيير شيء في ملف الواجهة<span style="font-family:courier new,courier,monospace;"> activity_main.xml</span>.
</p>

<p>
	الآن لعرض التفاصيل التي سترسل إلى النشاط الجديد <span style="font-family:courier new,courier,monospace;">ResultActivity.java</span> نبدأ في صنع واجهة المستخدم الخاصة بالنشاط ثم بتغيير الشيفرة الخاصة به ولا يوجد اختلاف بينها وبين الطريقة المستخدمة في الدروس السابقة.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3404_31">
<span class="pun">&lt;?</span><span class="pln">xml version</span><span class="pun">=</span><span class="str">"1.0"</span><span class="pln"> encoding</span><span class="pun">=</span><span class="str">"utf-8"</span><span class="pun">?&gt;</span><span class="pln">
</span><span class="tag">&lt;LinearLayout</span><span class="pln"> </span><span class="atn">xmlns:android</span><span class="pun">=</span><span class="atv">"http://schemas.android.com/apk/res/android"</span><span class="pln">
	</span><span class="atn">android:layout_width</span><span class="pun">=</span><span class="atv">"match_parent"</span><span class="pln">
	</span><span class="atn">android:layout_height</span><span class="pun">=</span><span class="atv">"match_parent"</span><span class="pln">
	</span><span class="atn">android:gravity</span><span class="pun">=</span><span class="atv">"center"</span><span class="pln">
	</span><span class="atn">android:orientation</span><span class="pun">=</span><span class="atv">"vertical"</span><span class="tag">&gt;</span><span class="pln">

	</span><span class="tag">&lt;TextView</span><span class="pln">
		</span><span class="atn">android:layout_width</span><span class="pun">=</span><span class="atv">"wrap_content"</span><span class="pln">
		</span><span class="atn">android:layout_height</span><span class="pun">=</span><span class="atv">"wrap_content"</span><span class="pln">
		</span><span class="atn">android:textSize</span><span class="pun">=</span><span class="atv">"25sp"</span><span class="pln">
		</span><span class="atn">android:id</span><span class="pun">=</span><span class="atv">"@+id/desc"</span><span class="tag">/&gt;</span><span class="pln">
</span><span class="tag">&lt;/LinearLayout&gt;</span></pre>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_3404_33">
<span class="pln">package apps</span><span class="pun">.</span><span class="pln">noby</span><span class="pun">.</span><span class="pln">simplenotification</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">content</span><span class="pun">.</span><span class="typ">Intent</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">support</span><span class="pun">.</span><span class="pln">v7</span><span class="pun">.</span><span class="pln">app</span><span class="pun">.</span><span class="typ">AppCompatActivity</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">os</span><span class="pun">.</span><span class="typ">Bundle</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">widget</span><span class="pun">.</span><span class="typ">TextView</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">ResultActivity</span><span class="pln"> extends </span><span class="typ">AppCompatActivity</span><span class="pln"> </span><span class="pun">{</span><span class="pln">

	</span><span class="lit">@Override</span><span class="pln">
	</span><span class="kwd">protected</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> onCreate</span><span class="pun">(</span><span class="typ">Bundle</span><span class="pln"> savedInstanceState</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
		super</span><span class="pun">.</span><span class="pln">onCreate</span><span class="pun">(</span><span class="pln">savedInstanceState</span><span class="pun">);</span><span class="pln">
		setContentView</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">layout</span><span class="pun">.</span><span class="pln">activity_result</span><span class="pun">);</span><span class="pln">

		</span><span class="typ">TextView</span><span class="pln"> tv </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="typ">TextView</span><span class="pun">)</span><span class="pln"> findViewById</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">id</span><span class="pun">.</span><span class="pln">desc</span><span class="pun">);</span><span class="pln">
		</span><span class="typ">Intent</span><span class="pln"> intent </span><span class="pun">=</span><span class="pln"> getIntent</span><span class="pun">();</span><span class="pln">
		</span><span class="typ">String</span><span class="pln"> description </span><span class="pun">=</span><span class="pln"> intent</span><span class="pun">.</span><span class="pln">getExtras</span><span class="pun">().</span><span class="pln">getString</span><span class="pun">(</span><span class="typ">MainActivity</span><span class="pun">.</span><span class="pln">DESC_KEY</span><span class="pun">);</span><span class="pln">
		tv</span><span class="pun">.</span><span class="pln">setText</span><span class="pun">(</span><span class="pln">description</span><span class="pun">);</span><span class="pln">
	</span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="18572" href="https://academy.hsoub.com/uploads/monthly_2016_07/16.png.2d3132b8f6613ea014aea8acc1dca44c.png" rel=""><img alt="16.png" class="ipsImage ipsImage_thumbnailed" data-fileid="18572" data-unique="68v3a5013" src="https://academy.hsoub.com/uploads/monthly_2016_07/16.thumb.png.5e8e58458d068424f60f4545c8f40477.png"></a>
</p>

<p>
	ثم نقوم بتجربة التطبيق على المحاكي.
</p>

<h2>
	تطبيق 3
</h2>

<p>
	لاحظ أنه عند الضغط على الإشعار في التطبيق السابق يقوم بفتح نشاط جديد ولكن يظل الإشعار متواجدًا في درج الإشعارات رغم عرضه والتفاعل معه لذا سنقوم في هذا التطبيق بتغيير بسيط حتى يختفي الإشعار بمجرد التفاعل معه.
</p>

<p>
	في شيفرة التطبيق السابق بداخل الملف<span style="font-family:courier new,courier,monospace;"> MainActivity.java</span> سنقوم بتعديل السطور الخاصة بالخطوة الثانية لتُصبح.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_3404_41">
<span class="pln">mBuilder</span><span class="pun">.</span><span class="pln">setContentTitle</span><span class="pun">(</span><span class="pln">title</span><span class="pun">);</span><span class="pln">
mBuilder</span><span class="pun">.</span><span class="pln">setContentText</span><span class="pun">(</span><span class="pln">detailText</span><span class="pun">);</span><span class="pln">

mBuilder</span><span class="pun">.</span><span class="pln">setAutoCancel</span><span class="pun">(</span><span class="kwd">true</span><span class="pun">);</span><span class="pln">

</span><span class="typ">Intent</span><span class="pln"> intent </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Intent</span><span class="pun">(</span><span class="typ">MainActivity</span><span class="pun">.</span><span class="kwd">this</span><span class="pun">,</span><span class="typ">ResultActivity</span><span class="pun">.</span><span class="kwd">class</span><span class="pun">);</span><span class="pln">
intent</span><span class="pun">.</span><span class="pln">putExtra</span><span class="pun">(</span><span class="pln">DESC_KEY</span><span class="pun">,</span><span class="pln">detailText</span><span class="pun">);</span></pre>

<p>
	قمنا فقط بإضافة السطر الخاص باستدعاء التابع <span style="font-family:courier new,courier,monospace;">()setAutoCancel</span> وتمرير القيمة <span style="font-family:courier new,courier,monospace;">true</span> باستخدام كائن البناء، والآن عند تجربة التطبيق بعد هذا التعديل ستجد أنه يقوم بإزالة الإشعار بمجرد الضغط عليه.
</p>

<p style="text-align: center;">
	<img alt="17.png" class="ipsImage ipsImage_thumbnailed" data-fileid="18573" data-unique="bztbquwjw" src="https://academy.hsoub.com/uploads/monthly_2016_07/17.png.61abd8861658914aae6a9352b3ba1a3c.png"></p>

<h2>
	تطبيق 4
</h2>

<p>
	يتم استخدام الشكل السابق بكثرة خاصة في تطبيقات المحادثة أو رسائل البريد حيث يتم عرض صورة المستخدم وبجانبها بحجم صغير الأيقونة الخاصة بالتطبيق.
</p>

<p>
	ولصنع ذلك يتم استدعاء التابع <span style="font-family:courier new,courier,monospace;">()setLargeIcon</span> باستخدام كائن البناء وتمرير له الصورة المراد عرضها بحجم كبير.
</p>

<p>
	لكن هناك شرط وهو أن تكون الصورة بصيغة <span style="font-family:courier new,courier,monospace;">Bitmap</span> ولأننا حتى الآن نقوم في الدروس باستخدام الصور المتواجدة في مجلد <span style="font-family:courier new,courier,monospace;">drawable</span> لذا ينبغي قبل تمريرها للتابع <span style="font-family:courier new,courier,monospace;">()setLargeIcon</span> أن نقوم بتحويلها إلى <span style="font-family:courier new,courier,monospace;">Bitmap</span> ويتم ذلك عن طريق الخطوة التالية.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_3404_43">
<span class="typ">Bitmap</span><span class="pln"> img </span><span class="pun">=</span><span class="pln"> </span><span class="typ">BitmapFactory</span><span class="pun">.</span><span class="pln">decodeResource</span><span class="pun">(</span><span class="typ">MainActivity</span><span class="pun">.</span><span class="kwd">this</span><span class="pun">.</span><span class="pln">getResources</span><span class="pun">(),</span><span class="pln"> R</span><span class="pun">.</span><span class="pln">drawable</span><span class="pun">.</span><span class="pln">ic_person</span><span class="pun">);</span></pre>

<p>
	ثم بعد ذلك تمريرها كما سبق لبناء الإشعار.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_3404_45">
<span class="pln">mBuilder</span><span class="pun">.</span><span class="pln">setLargeIcon</span><span class="pun">(</span><span class="pln">img</span><span class="pun">);</span></pre>

<p>
	لتُصبح الشيفرة الكاملة الخاصة بالملف <span style="font-family:courier new,courier,monospace;">MainActivity.java</span> هي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_3404_47">
<span class="pln">package apps</span><span class="pun">.</span><span class="pln">noby</span><span class="pun">.</span><span class="pln">simplenotification</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">app</span><span class="pun">.</span><span class="typ">Activity</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">app</span><span class="pun">.</span><span class="typ">Notification</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">app</span><span class="pun">.</span><span class="typ">NotificationManager</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">app</span><span class="pun">.</span><span class="typ">PendingIntent</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">content</span><span class="pun">.</span><span class="typ">Intent</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">graphics</span><span class="pun">.</span><span class="typ">Bitmap</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">graphics</span><span class="pun">.</span><span class="typ">BitmapFactory</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">os</span><span class="pun">.</span><span class="typ">Bundle</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">view</span><span class="pun">.</span><span class="typ">View</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">widget</span><span class="pun">.</span><span class="typ">Button</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">MainActivity</span><span class="pln"> extends </span><span class="typ">Activity</span><span class="pln"> </span><span class="pun">{</span><span class="pln">

	</span><span class="kwd">private</span><span class="pln"> </span><span class="typ">Button</span><span class="pln"> shwbtn</span><span class="pun">;</span><span class="pln">
	</span><span class="kwd">private</span><span class="pln"> </span><span class="typ">String</span><span class="pln"> title</span><span class="pun">;</span><span class="pln">
	</span><span class="kwd">private</span><span class="pln"> </span><span class="typ">String</span><span class="pln"> detailText</span><span class="pun">;</span><span class="pln">
	</span><span class="kwd">public</span><span class="pln"> final </span><span class="kwd">static</span><span class="pln"> </span><span class="typ">String</span><span class="pln"> DESC_KEY </span><span class="pun">=</span><span class="str">"descriptionKey"</span><span class="pun">;</span><span class="pln">

	</span><span class="lit">@Override</span><span class="pln">
	</span><span class="kwd">protected</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> onCreate</span><span class="pun">(</span><span class="typ">Bundle</span><span class="pln"> savedInstanceState</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
		super</span><span class="pun">.</span><span class="pln">onCreate</span><span class="pun">(</span><span class="pln">savedInstanceState</span><span class="pun">);</span><span class="pln">
		setContentView</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">layout</span><span class="pun">.</span><span class="pln">activity_main</span><span class="pun">);</span><span class="pln">

		shwbtn </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="typ">Button</span><span class="pun">)</span><span class="pln"> findViewById</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">id</span><span class="pun">.</span><span class="pln">shw_notification</span><span class="pun">);</span><span class="pln">
		title </span><span class="pun">=</span><span class="pln"> </span><span class="str">"New Message"</span><span class="pun">;</span><span class="pln">
		detailText </span><span class="pun">=</span><span class="str">"Hi, This is the message text."</span><span class="pun">;</span><span class="pln">

      	shwbtn</span><span class="pun">.</span><span class="pln">setOnClickListener</span><span class="pun">(</span><span class="kwd">new</span><span class="pln"> </span><span class="typ">View</span><span class="pun">.</span><span class="typ">OnClickListener</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
			</span><span class="lit">@Override</span><span class="pln">
			</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> onClick</span><span class="pun">(</span><span class="typ">View</span><span class="pln"> v</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
				</span><span class="com">//Step 1</span><span class="pln">
				</span><span class="typ">Notification</span><span class="pun">.</span><span class="typ">Builder</span><span class="pln"> mBuilder </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Notification</span><span class="pun">.</span><span class="typ">Builder</span><span class="pun">(</span><span class="typ">MainActivity</span><span class="pun">.</span><span class="kwd">this</span><span class="pun">);</span><span class="pln">

				</span><span class="com">//Step 2</span><span class="pln">
				mBuilder</span><span class="pun">.</span><span class="pln">setSmallIcon</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">drawable</span><span class="pun">.</span><span class="pln">ic_message</span><span class="pun">);</span><span class="pln">

				</span><span class="typ">Bitmap</span><span class="pln"> img </span><span class="pun">=</span><span class="pln"> </span><span class="typ">BitmapFactory</span><span class="pun">.</span><span class="pln">decodeResource</span><span class="pun">(</span><span class="typ">MainActivity</span><span class="pun">.</span><span class="kwd">this</span><span class="pun">.</span><span class="pln">getResources</span><span class="pun">(),</span><span class="pln"> R</span><span class="pun">.</span><span class="pln">drawable</span><span class="pun">.</span><span class="pln">ic_person</span><span class="pun">);</span><span class="pln">
				mBuilder</span><span class="pun">.</span><span class="pln">setLargeIcon</span><span class="pun">(</span><span class="pln">img</span><span class="pun">);</span><span class="pln">

				mBuilder</span><span class="pun">.</span><span class="pln">setContentTitle</span><span class="pun">(</span><span class="pln">title</span><span class="pun">);</span><span class="pln">
				mBuilder</span><span class="pun">.</span><span class="pln">setContentText</span><span class="pun">(</span><span class="pln">detailText</span><span class="pun">);</span><span class="pln">
				mBuilder</span><span class="pun">.</span><span class="pln">setAutoCancel</span><span class="pun">(</span><span class="kwd">true</span><span class="pun">);</span><span class="pln">

				</span><span class="typ">Intent</span><span class="pln"> intent </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Intent</span><span class="pun">(</span><span class="typ">MainActivity</span><span class="pun">.</span><span class="kwd">this</span><span class="pun">,</span><span class="typ">ResultActivity</span><span class="pun">.</span><span class="kwd">class</span><span class="pun">);</span><span class="pln">
				intent</span><span class="pun">.</span><span class="pln">putExtra</span><span class="pun">(</span><span class="pln">DESC_KEY</span><span class="pun">,</span><span class="pln">detailText</span><span class="pun">);</span><span class="pln">
				</span><span class="typ">PendingIntent</span><span class="pln"> pIntent </span><span class="pun">=</span><span class="pln"> </span><span class="typ">PendingIntent</span><span class="pun">.</span><span class="pln">getActivity</span><span class="pun">(</span><span class="typ">MainActivity</span><span class="pun">.</span><span class="kwd">this</span><span class="pun">,</span><span class="lit">0</span><span class="pun">,</span><span class="pln">intent</span><span class="pun">,</span><span class="typ">PendingIntent</span><span class="pun">.</span><span class="pln">FLAG_UPDATE_CURRENT</span><span class="pun">);</span><span class="pln">

				mBuilder</span><span class="pun">.</span><span class="pln">setContentIntent</span><span class="pun">(</span><span class="pln">pIntent</span><span class="pun">);</span><span class="pln">

				</span><span class="com">//Step 3</span><span class="pln">
				</span><span class="typ">Notification</span><span class="pln"> notif </span><span class="pun">=</span><span class="pln"> mBuilder</span><span class="pun">.</span><span class="pln">build</span><span class="pun">();</span><span class="pln">

				</span><span class="com">//Step 4</span><span class="pln">
				</span><span class="typ">NotificationManager</span><span class="pln"> notifyMngr </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="typ">NotificationManager</span><span class="pun">)</span><span class="pln"> getSystemService</span><span class="pun">(</span><span class="pln">NOTIFICATION_SERVICE</span><span class="pun">);</span><span class="pln">

				</span><span class="kwd">int</span><span class="pln"> notificationId </span><span class="pun">=</span><span class="pln"> </span><span class="lit">103</span><span class="pun">;</span><span class="pln">
				notifyMngr</span><span class="pun">.</span><span class="pln">notify</span><span class="pun">(</span><span class="pln">notificationId</span><span class="pun">,</span><span class="pln">notif</span><span class="pun">);</span><span class="pln">

			</span><span class="pun">}</span><span class="pln">
		</span><span class="pun">});</span><span class="pln">
	</span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	ليعمل التطبيق كما هو متوقع على المحاكي.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="18574" href="https://academy.hsoub.com/uploads/monthly_2016_07/18.png.c08662e3fe2053f4febd5085535021f6.png" rel=""><img alt="18.png" class="ipsImage ipsImage_thumbnailed" data-fileid="18574" data-unique="5uhemaeua" src="https://academy.hsoub.com/uploads/monthly_2016_07/18.thumb.png.b397b5d8d7a080b56eb6936d9e87153f.png"></a>
</p>

<h2>
	تطبيق 5
</h2>

<p>
	في بعض الأحيان نحتاج إلى التفاعل السريع للمستخدم مع التطبيق دون الحاجة لفتح التطبيق أو لتوفير أكثر من اختيار لفتح أجزاء محددة في التطبيق.
</p>

<p style="text-align: center;">
	<img alt="19.png" class="ipsImage ipsImage_thumbnailed" data-fileid="18575" data-unique="oz5q4gf2v" src="https://academy.hsoub.com/uploads/monthly_2016_07/19.png.f7454c6ee428480a85657d4e22001283.png"></p>

<p>
	للقيام بذلك نستخدم التابع <span style="font-family:courier new,courier,monospace;">()addAction</span> والذي يمكننا من إضافة زر إلى الإشعار.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_3404_49">
<span class="typ">PendingIntent</span><span class="pln"> pIntent </span><span class="pun">=</span><span class="pln"> </span><span class="typ">PendingIntent</span><span class="pun">.</span><span class="pln">getActivity</span><span class="pun">(</span><span class="typ">MainActivity</span><span class="pun">.</span><span class="kwd">this</span><span class="pun">,</span><span class="lit">0</span><span class="pun">,</span><span class="pln">intent</span><span class="pun">,</span><span class="typ">PendingIntent</span><span class="pun">.</span><span class="pln">FLAG_UPDATE_CURRENT</span><span class="pun">);</span><span class="pln">

mBuilder</span><span class="pun">.</span><span class="pln">setContentIntent</span><span class="pun">(</span><span class="pln">pIntent</span><span class="pun">);</span><span class="pln">
mBuilder</span><span class="pun">.</span><span class="pln">addAction</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">drawable</span><span class="pun">.</span><span class="pln">ic_reply</span><span class="pun">,</span><span class="str">"Reply"</span><span class="pun">,</span><span class="pln">pIntent</span><span class="pun">);</span><span class="pln">
mBuilder</span><span class="pun">.</span><span class="pln">addAction</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">drawable</span><span class="pun">.</span><span class="pln">ic_content_copy</span><span class="pun">,</span><span class="str">"Copy"</span><span class="pun">,</span><span class="pln">pIntent</span><span class="pun">);</span><span class="pln">

</span><span class="com">//Step 3</span><span class="pln">
</span><span class="typ">Notification</span><span class="pln"> notif </span><span class="pun">=</span><span class="pln"> mBuilder</span><span class="pun">.</span><span class="pln">build</span><span class="pun">();</span></pre>

<p>
	ولاستخدام هذا التابع نقوم بتمرير صورة لتظهر داخل الزر، النص الخاص بالزر وأخيرًا كائن من <span style="font-family:courier new,courier,monospace;">PendingIntent</span> ليتم تنفيذه عند الضغط على هذا الزر.
</p>

<p>
	ويمكنك عمل <span style="font-family:courier new,courier,monospace;">()addAction</span> حتى ثلاث مرات فقط، ويمكن لكل زر أن يكون له <span style="font-family:courier new,courier,monospace;">PendingIntent</span> مختلف خاص به ليقوم بتنفيذ أمر مختلف وفي المثال السابق لشرح الفكرة تم استخدام <span style="font-family:courier new,courier,monospace;">PendingIntent</span> واحد.
</p>

<p>
	والآن نقوم بتشغيل التطبيق على المحاكي للتأكد من عمله بشكل صحيح.
</p>

<h2>
	تطبيق 6
</h2>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="18576" href="https://academy.hsoub.com/uploads/monthly_2016_07/20.png.ef5614f055471995ac598959e65142d4.png" rel=""><img alt="20.png" class="ipsImage ipsImage_thumbnailed" data-fileid="18576" data-unique="4wm9fjjlm" src="https://academy.hsoub.com/uploads/monthly_2016_07/20.thumb.png.7d7b50cfa5191781758c118cc7f8e9c5.png"></a>
</p>

<p>
	في بعض الأحيان تحتاج إلى التعديل على إشعار سابق دون إصدار إشعار جديد، وذلك بإضافة بعض المعلومات له أو بتغيير محتوى الإشعار أو كلاهما.
</p>

<p>
	وقد تحتاج أيضًا إلى إزالة الإشعار برمجيًا دون تدخل من المستخدم وذلك عند حدوث شيء محدد أو مرور وقت محدد.
</p>

<p>
	أولًا للقيام بالتعديل أو بتغيير محتوى إشعار دون إصدار إشعار آخر جديد نقوم ببناء الإشعار ثم نقوم بإصداره باستخدام نفس الـ NotificationID الذي نمرره للتابع<span style="font-family:courier new,courier,monospace;"> ()notify</span> حتى يقوم بتعديل الإشعار صاحب ID ذاته.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="18577" href="https://academy.hsoub.com/uploads/monthly_2016_07/21.png.724538a764394851bd0bab02e53b6909.png" rel=""><img alt="21.png" class="ipsImage ipsImage_thumbnailed" data-fileid="18577" data-unique="is2w22wmc" src="https://academy.hsoub.com/uploads/monthly_2016_07/21.thumb.png.3a50efb7aa04cf3aec58d5ddcb0a8e8a.png"></a>
</p>

<p>
	بفرض أن لدينا هذا الإشعار عند الضغط على زر Show Notification.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_3404_51">
<span class="pln">shwbtn </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="typ">Button</span><span class="pun">)</span><span class="pln"> findViewById</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">id</span><span class="pun">.</span><span class="pln">shw_notification</span><span class="pun">);</span><span class="pln">

shwbtn</span><span class="pun">.</span><span class="pln">setOnClickListener</span><span class="pun">(</span><span class="kwd">new</span><span class="pln"> </span><span class="typ">View</span><span class="pun">.</span><span class="typ">OnClickListener</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
	</span><span class="lit">@Override</span><span class="pln">
	</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> onClick</span><span class="pun">(</span><span class="typ">View</span><span class="pln"> v</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
		</span><span class="com">//Step 1</span><span class="pln">
		</span><span class="typ">Notification</span><span class="pun">.</span><span class="typ">Builder</span><span class="pln"> mBuilder </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Notification</span><span class="pun">.</span><span class="typ">Builder</span><span class="pun">(</span><span class="typ">MainActivity</span><span class="pun">.</span><span class="kwd">this</span><span class="pun">);</span><span class="pln">

		</span><span class="com">//Step 2</span><span class="pln">
		mBuilder</span><span class="pun">.</span><span class="pln">setSmallIcon</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">drawable</span><span class="pun">.</span><span class="pln">ic_message</span><span class="pun">);</span><span class="pln">

		</span><span class="typ">Bitmap</span><span class="pln"> img </span><span class="pun">=</span><span class="pln"> </span><span class="typ">BitmapFactory</span><span class="pun">.</span><span class="pln">decodeResource</span><span class="pun">(</span><span class="typ">MainActivity</span><span class="pun">.</span><span class="kwd">this</span><span class="pun">.</span><span class="pln">getResources</span><span class="pun">(),</span><span class="pln"> R</span><span class="pun">.</span><span class="pln">drawable</span><span class="pun">.</span><span class="pln">ic_person</span><span class="pun">);</span><span class="pln">
		mBuilder</span><span class="pun">.</span><span class="pln">setLargeIcon</span><span class="pun">(</span><span class="pln">img</span><span class="pun">);</span><span class="pln">

		mBuilder</span><span class="pun">.</span><span class="pln">setContentTitle</span><span class="pun">(</span><span class="str">"New Message"</span><span class="pun">);</span><span class="pln">
		mBuilder</span><span class="pun">.</span><span class="pln">setContentText</span><span class="pun">(</span><span class="str">"Hi, This is the message text."</span><span class="pun">);</span><span class="pln">
		mBuilder</span><span class="pun">.</span><span class="pln">setNumber</span><span class="pun">(++</span><span class="pln">totalNumber</span><span class="pun">);</span><span class="pln">
		mBuilder</span><span class="pun">.</span><span class="pln">setAutoCancel</span><span class="pun">(</span><span class="kwd">true</span><span class="pun">);</span><span class="pln">

		</span><span class="typ">Intent</span><span class="pln"> intent </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Intent</span><span class="pun">(</span><span class="typ">MainActivity</span><span class="pun">.</span><span class="kwd">this</span><span class="pun">,</span><span class="typ">ResultActivity</span><span class="pun">.</span><span class="kwd">class</span><span class="pun">);</span><span class="pln">
		intent</span><span class="pun">.</span><span class="pln">putExtra</span><span class="pun">(</span><span class="pln">DESC_KEY</span><span class="pun">,</span><span class="str">"Hi, This is the message text."</span><span class="pun">);</span><span class="pln">
		</span><span class="typ">PendingIntent</span><span class="pln"> pIntent </span><span class="pun">=</span><span class="pln"> </span><span class="typ">PendingIntent</span><span class="pun">.</span><span class="pln">getActivity</span><span class="pun">(</span><span class="typ">MainActivity</span><span class="pun">.</span><span class="kwd">this</span><span class="pun">,</span><span class="lit">0</span><span class="pun">,</span><span class="pln">intent</span><span class="pun">,</span><span class="typ">PendingIntent</span><span class="pun">.</span><span class="pln">FLAG_UPDATE_CURRENT</span><span class="pun">);</span><span class="pln">
		mBuilder</span><span class="pun">.</span><span class="pln">setContentIntent</span><span class="pun">(</span><span class="pln">pIntent</span><span class="pun">);</span><span class="pln">

		</span><span class="com">//Step 3</span><span class="pln">
		</span><span class="typ">Notification</span><span class="pln"> notif </span><span class="pun">=</span><span class="pln"> mBuilder</span><span class="pun">.</span><span class="pln">build</span><span class="pun">();</span><span class="pln">

		</span><span class="com">//Step 4</span><span class="pln">
		</span><span class="typ">NotificationManager</span><span class="pln"> notifyMngr </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="typ">NotificationManager</span><span class="pun">)</span><span class="pln"> getSystemService</span><span class="pun">(</span><span class="pln">NOTIFICATION_SERVICE</span><span class="pun">);</span><span class="pln">

		</span><span class="kwd">int</span><span class="pln"> notificationId </span><span class="pun">=</span><span class="pln"> </span><span class="lit">103</span><span class="pun">;</span><span class="pln">
		notifyMngr</span><span class="pun">.</span><span class="pln">notify</span><span class="pun">(</span><span class="pln">notificationId</span><span class="pun">,</span><span class="pln">notif</span><span class="pun">);</span><span class="pln">
	</span><span class="pun">}</span><span class="pln">
</span><span class="pun">});</span></pre>

<p>
	ثم عند الضغط على الزر Update Notification يتم تغييرها إلى المحتوى التالي.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_3404_53">
<span class="pln">updatebtn </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="typ">Button</span><span class="pun">)</span><span class="pln"> findViewById</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">id</span><span class="pun">.</span><span class="pln">upd_notification</span><span class="pun">);</span><span class="pln">

updatebtn</span><span class="pun">.</span><span class="pln">setOnClickListener</span><span class="pun">(</span><span class="kwd">new</span><span class="pln"> </span><span class="typ">View</span><span class="pun">.</span><span class="typ">OnClickListener</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
	</span><span class="lit">@Override</span><span class="pln">
	</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> onClick</span><span class="pun">(</span><span class="typ">View</span><span class="pln"> v</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
		</span><span class="com">//Step 1</span><span class="pln">
		</span><span class="typ">Notification</span><span class="pun">.</span><span class="typ">Builder</span><span class="pln"> mBuilder </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Notification</span><span class="pun">.</span><span class="typ">Builder</span><span class="pun">(</span><span class="typ">MainActivity</span><span class="pun">.</span><span class="kwd">this</span><span class="pun">);</span><span class="pln">

		</span><span class="com">//Step 2</span><span class="pln">
		mBuilder</span><span class="pun">.</span><span class="pln">setSmallIcon</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">drawable</span><span class="pun">.</span><span class="pln">ic_message</span><span class="pun">);</span><span class="pln">
	
		</span><span class="typ">Bitmap</span><span class="pln"> img </span><span class="pun">=</span><span class="pln"> </span><span class="typ">BitmapFactory</span><span class="pun">.</span><span class="pln">decodeResource</span><span class="pun">(</span><span class="typ">MainActivity</span><span class="pun">.</span><span class="kwd">this</span><span class="pun">.</span><span class="pln">getResources</span><span class="pun">(),</span><span class="pln"> R</span><span class="pun">.</span><span class="pln">drawable</span><span class="pun">.</span><span class="pln">ic_person</span><span class="pun">);</span><span class="pln">
		mBuilder</span><span class="pun">.</span><span class="pln">setLargeIcon</span><span class="pun">(</span><span class="pln">img</span><span class="pun">);</span><span class="pln">

		mBuilder</span><span class="pun">.</span><span class="pln">setContentTitle</span><span class="pun">(</span><span class="str">"Updated Message"</span><span class="pun">);</span><span class="pln">
		mBuilder</span><span class="pun">.</span><span class="pln">setContentText</span><span class="pun">(</span><span class="str">"Hi, This is an updated Message."</span><span class="pun">);</span><span class="pln">
		mBuilder</span><span class="pun">.</span><span class="pln">setNumber</span><span class="pun">(++</span><span class="pln">totalNumber</span><span class="pun">);</span><span class="pln">
		mBuilder</span><span class="pun">.</span><span class="pln">setAutoCancel</span><span class="pun">(</span><span class="kwd">true</span><span class="pun">);</span><span class="pln">

		</span><span class="typ">Intent</span><span class="pln"> intent </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Intent</span><span class="pun">(</span><span class="typ">MainActivity</span><span class="pun">.</span><span class="kwd">this</span><span class="pun">,</span><span class="typ">ResultActivity</span><span class="pun">.</span><span class="kwd">class</span><span class="pun">);</span><span class="pln">
		intent</span><span class="pun">.</span><span class="pln">putExtra</span><span class="pun">(</span><span class="pln">DESC_KEY</span><span class="pun">,</span><span class="str">"Hi, This is an updated Message."</span><span class="pun">);</span><span class="pln">
		</span><span class="typ">PendingIntent</span><span class="pln"> pIntent </span><span class="pun">=</span><span class="pln"> </span><span class="typ">PendingIntent</span><span class="pun">.</span><span class="pln">getActivity</span><span class="pun">(</span><span class="typ">MainActivity</span><span class="pun">.</span><span class="kwd">this</span><span class="pun">,</span><span class="lit">0</span><span class="pun">,</span><span class="pln">intent</span><span class="pun">,</span><span class="typ">PendingIntent</span><span class="pun">.</span><span class="pln">FLAG_UPDATE_CURRENT</span><span class="pun">);</span><span class="pln">
		mBuilder</span><span class="pun">.</span><span class="pln">setContentIntent</span><span class="pun">(</span><span class="pln">pIntent</span><span class="pun">);</span><span class="pln">

		</span><span class="com">//Step 3</span><span class="pln">
		</span><span class="typ">Notification</span><span class="pln"> notif </span><span class="pun">=</span><span class="pln"> mBuilder</span><span class="pun">.</span><span class="pln">build</span><span class="pun">();</span><span class="pln">

		</span><span class="com">//Step 4</span><span class="pln">
		</span><span class="typ">NotificationManager</span><span class="pln"> notifyMngr </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="typ">NotificationManager</span><span class="pun">)</span><span class="pln"> getSystemService</span><span class="pun">(</span><span class="pln">NOTIFICATION_SERVICE</span><span class="pun">);</span><span class="pln">

		</span><span class="kwd">int</span><span class="pln"> notificationId </span><span class="pun">=</span><span class="pln"> </span><span class="lit">103</span><span class="pun">;</span><span class="pln">
		notifyMngr</span><span class="pun">.</span><span class="pln">notify</span><span class="pun">(</span><span class="pln">notificationId</span><span class="pun">,</span><span class="pln">notif</span><span class="pun">);</span><span class="pln">
	</span><span class="pun">}</span><span class="pln">
</span><span class="pun">});</span></pre>

<p>
	لاحظ أننا قمنا باستخدام نفس NotificationID في خطوة إظهار الإشعار وذلك لإخبار النظام أننا نريد التعديل على إشعار متواجد بالفعل.
</p>

<p>
	والآن لإزالة الإشعار نضغط على الزر Cancel Notification.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_3404_55">
<span class="pln">cnclbtn </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="typ">Button</span><span class="pun">)</span><span class="pln"> findViewById</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">id</span><span class="pun">.</span><span class="pln">cncl_notification</span><span class="pun">);</span><span class="pln">

cnclbtn</span><span class="pun">.</span><span class="pln">setOnClickListener</span><span class="pun">(</span><span class="kwd">new</span><span class="pln"> </span><span class="typ">View</span><span class="pun">.</span><span class="typ">OnClickListener</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
	</span><span class="lit">@Override</span><span class="pln">
	</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> onClick</span><span class="pun">(</span><span class="typ">View</span><span class="pln"> v</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
		</span><span class="typ">NotificationManager</span><span class="pln"> notifyMngr </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="typ">NotificationManager</span><span class="pun">)</span><span class="pln"> getSystemService</span><span class="pun">(</span><span class="pln">NOTIFICATION_SERVICE</span><span class="pun">);</span><span class="pln">
		totalNumber </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
		</span><span class="kwd">int</span><span class="pln"> notificationId </span><span class="pun">=</span><span class="pln"> </span><span class="lit">103</span><span class="pun">;</span><span class="pln">
		notifyMngr</span><span class="pun">.</span><span class="pln">cancel</span><span class="pun">(</span><span class="pln">notificationId</span><span class="pun">);</span><span class="pln">
	</span><span class="pun">}</span><span class="pln">
</span><span class="pun">});</span></pre>

<p>
	لإزالة الإشعار نستدعي التابع <span style="font-family:courier new,courier,monospace;">()cancel</span> باستخدام الكائن من <span style="font-family:courier new,courier,monospace;">NotificationManager</span> ونمرر لها الـ ID الخاص بالإشعار.
</p>

<p>
	لاحظ أننا قد قمنا باستخدام التابع <span style="font-family:courier new,courier,monospace;">()setNumber</span> عند بناء الإشعار وذلك ليُظهر عدد مرات بناء وتعديل الإشعار ذاته، ويتم بدأ العد مجددًا عند الضغط على الزر Cancel Notification.
</p>

<p>
	وبتغيير ملف الواجهة في <span style="font-family:courier new,courier,monospace;">activity_main.xml</span> ليُصبح.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3404_57">
<span class="pun">&lt;?</span><span class="pln">xml version</span><span class="pun">=</span><span class="str">"1.0"</span><span class="pln"> encoding</span><span class="pun">=</span><span class="str">"utf-8"</span><span class="pun">?&gt;</span><span class="pln">
</span><span class="tag">&lt;LinearLayout</span><span class="pln"> </span><span class="atn">xmlns:android</span><span class="pun">=</span><span class="atv">"http://schemas.android.com/apk/res/android"</span><span class="pln">
	</span><span class="atn">android:layout_width</span><span class="pun">=</span><span class="atv">"match_parent"</span><span class="pln">
	</span><span class="atn">android:layout_height</span><span class="pun">=</span><span class="atv">"match_parent"</span><span class="pln">
	</span><span class="atn">android:orientation</span><span class="pun">=</span><span class="atv">"vertical"</span><span class="pln">
	</span><span class="atn">android:gravity</span><span class="pun">=</span><span class="atv">"center"</span><span class="tag">&gt;</span><span class="pln">

	</span><span class="tag">&lt;Button</span><span class="pln">
		</span><span class="atn">android:layout_width</span><span class="pun">=</span><span class="atv">"wrap_content"</span><span class="pln">
		</span><span class="atn">android:layout_height</span><span class="pun">=</span><span class="atv">"wrap_content"</span><span class="pln">
		</span><span class="atn">android:text</span><span class="pun">=</span><span class="atv">"Show Notification"</span><span class="pln">
		</span><span class="atn">android:id</span><span class="pun">=</span><span class="atv">"@+id/shw_notification"</span><span class="tag">/&gt;</span><span class="pln">

	</span><span class="tag">&lt;Button</span><span class="pln">
		</span><span class="atn">android:layout_width</span><span class="pun">=</span><span class="atv">"wrap_content"</span><span class="pln">
		</span><span class="atn">android:layout_height</span><span class="pun">=</span><span class="atv">"wrap_content"</span><span class="pln">
		</span><span class="atn">android:text</span><span class="pun">=</span><span class="atv">"Update Notification"</span><span class="pln">
		</span><span class="atn">android:id</span><span class="pun">=</span><span class="atv">"@+id/upd_notification"</span><span class="tag">/&gt;</span><span class="pln">

	</span><span class="tag">&lt;Button</span><span class="pln">
		</span><span class="atn">android:layout_width</span><span class="pun">=</span><span class="atv">"wrap_content"</span><span class="pln">
		</span><span class="atn">android:layout_height</span><span class="pun">=</span><span class="atv">"wrap_content"</span><span class="pln">
		</span><span class="atn">android:text</span><span class="pun">=</span><span class="atv">"Cancel Notification"</span><span class="pln">
		</span><span class="atn">android:id</span><span class="pun">=</span><span class="atv">"@+id/cncl_notification"</span><span class="tag">/&gt;</span><span class="pln">
</span><span class="tag">&lt;/LinearLayout&gt;</span></pre>

<p>
	تستطيع أن تلاحظ الرقم المتواجد أقصى يمين الإشعار والذي يُعبر عن عدد مرات التعديل على الإشعار ذاته، ويتحكم التابع<span style="font-family:courier new,courier,monospace;"> ()setNumber </span>في القيمة التي ستظهر بناءً على قيمة المعامل الذي تم تمريره له.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="18578" href="https://academy.hsoub.com/uploads/monthly_2016_07/22.png.2311e825551f9ca7f58b891681fa6530.png" rel=""><img alt="22.png" class="ipsImage ipsImage_thumbnailed" data-fileid="18578" data-unique="dxyr3lf70" src="https://academy.hsoub.com/uploads/monthly_2016_07/22.thumb.png.c0efe54f9843547f9ebcc2b6369fae5b.png"></a>
</p>

<h2>
	تطبيق 7
</h2>

<p>
	هناك العديد من الإشعارات التي لا يستطيع المستخدم من إزالتها ويجب عليه انتظار انتهاء حدث معين أو القيام بمهمة معينة حتى يختفي الإشعار، مثال على ذلك عند تحميلك لملف تجد إشعار لا يمكنك إزالته يُخبرك بمعلومات عن التحميل وللتخلص منه ينبغي الانتظار حتى اكتمال تحميل الملف أو إلغاء التحميل.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="18579" href="https://academy.hsoub.com/uploads/monthly_2016_07/23.png.de17196914da3d5071de2bc7d713589b.png" rel=""><img alt="23.png" class="ipsImage ipsImage_thumbnailed" data-fileid="18579" data-unique="jejyeu41f" src="https://academy.hsoub.com/uploads/monthly_2016_07/23.thumb.png.2b8846222c0ad9391255efd50d98a623.png"></a>
</p>

<p>
	لتفعيل هذه النوعية من الإشعارات داخل التطبيق لدينا طريقتان
</p>

<p>
	1. نقوم بتغير قيمة إحدى خصائص الإشعار الذي قمنا ببنائه وتدعى <span style="font-family:courier new,courier,monospace;">flags</span>، حيث نقوم بإضافة خاصيتين إلى الإشعار وهما:
</p>

<ul>
<li>
		<span style="font-family:courier new,courier,monospace;">Notification.FLAG_NO_CLEAR</span> وهي تلغي تأثير التابع<span style="font-family:courier new,courier,monospace;"> ()setAutoCancel</span> فلا يتم مسح الإشعار عند الضغط عليه.
	</li>
	<li>
		<span style="font-family:courier new,courier,monospace;">Notification.FLAG_ONGOING_EVENT</span> وهي المسؤولة عن إخبار النظام أن هذا الإشعار لديه معلومات لا زالت لها أهمية ولا ينبغي إزالتها الآن.
	</li>
</ul>
<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_3404_59">
<span class="com">//Step 3</span><span class="pln">
</span><span class="typ">Notification</span><span class="pln"> notif </span><span class="pun">=</span><span class="pln"> mBuilder</span><span class="pun">.</span><span class="pln">build</span><span class="pun">();</span><span class="pln">

notif</span><span class="pun">.</span><span class="pln">flags </span><span class="pun">|=</span><span class="pln"> </span><span class="typ">Notification</span><span class="pun">.</span><span class="pln">FLAG_NO_CLEAR </span><span class="pun">|</span><span class="pln"> </span><span class="typ">Notification</span><span class="pun">.</span><span class="pln">FLAG_ONGOING_EVENT</span><span class="pun">;</span></pre>

<p>
	2. استدعاء التابع <span style="font-family:courier new,courier,monospace;">()setOngoing</span> باستخدام كائن البناء و تمرير له القيمة <span style="font-family:courier new,courier,monospace;">true</span>، مع إزالة سطر استدعاء التابع <span style="font-family:courier new,courier,monospace;">()setAutoCancel </span>حتى لا يتم إزالة الإشعار عند الضغط عليه.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_3404_61">
<span class="com">//Step 2</span><span class="pln">

mBuilder</span><span class="pun">.</span><span class="pln">setSmallIcon</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">drawable</span><span class="pun">.</span><span class="pln">ic_message</span><span class="pun">);</span><span class="pln">
mBuilder</span><span class="pun">.</span><span class="pln">setContentTitle</span><span class="pun">(</span><span class="str">"New Message"</span><span class="pun">);</span><span class="pln">
mBuilder</span><span class="pun">.</span><span class="pln">setContentText</span><span class="pun">(</span><span class="str">"Hi, This is the message text."</span><span class="pun">);</span><span class="pln">
mBuilder</span><span class="pun">.</span><span class="pln">setOngoing</span><span class="pun">(</span><span class="kwd">true</span><span class="pun">);</span></pre>

<p>
	<strong>ملحوظة</strong>: لا يوجد فرق بين أي من الطريقتين من حيث الوظيفة أو التأثير.
</p>

<p>
	ولإزالة هذا الإشعار عند الانتهاء من الحدث ينبغي استدعاء التابع<span style="font-family:courier new,courier,monospace;"> ()cancel</span> وتمرير له NotificationID كما سبق، ولا يمكن إزالته إلا بهذه الطريقة.
</p>

<h2>
	تطبيق 8
</h2>

<p>
	عندما يأتي تنبيه من تطبيق ما وكانت شاشة القفل مغلقة فهناك ثلاثة اختيارات للنظام للتعامل مع هذا الإشعار.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="18580" href="https://academy.hsoub.com/uploads/monthly_2016_07/24.png.54e5e65dd3b1a74dad8952a25f4a3a25.png" rel=""><img alt="24.png" class="ipsImage ipsImage_thumbnailed" data-fileid="18580" data-unique="x4ut8caaa" src="https://academy.hsoub.com/uploads/monthly_2016_07/24.thumb.png.a8841be099805e2ab272473d7400063a.png"></a>
</p>

<p>
	إما إظهار محتوى الإشعار على شاشة القفل، أو إظهار الإشعار مع إخفاء محتواه أو عدم إظهار الإشعار ويمكن التحكم في هذه الاختيارات برمجيًا من خلال التابع <span style="font-family:courier new,courier,monospace;">()setVisibility </span>باستخدام كائن البناء ويُمرر له ثابت قيمته:
</p>

<ul>
<li>
		<span style="font-family:courier new,courier,monospace;">Notification.VISIBILITY_PUBLIC</span> إذا أردت أن يظهر محتوى الإشعار.
	</li>
	<li>
		<span style="font-family:courier new,courier,monospace;">Notification.VISIBILITY_PRIVATE</span> إذا أردت إظهار الإشعار فقط دون إظهار محتواه.
	</li>
	<li>
		<span style="font-family:courier new,courier,monospace;">Notification.VISIBILITY_SECRET</span> وذلك لعدم ظهور الإشعار على شاشة القفل ويظهر حين نتجاوز قفل الشاشة أولًا.
	</li>
</ul>
<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_3404_63">
<span class="com">//Step 2</span><span class="pln">
mBuilder</span><span class="pun">.</span><span class="pln">setSmallIcon</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">drawable</span><span class="pun">.</span><span class="pln">ic_message</span><span class="pun">);</span><span class="pln">
mBuilder</span><span class="pun">.</span><span class="pln">setContentTitle</span><span class="pun">(</span><span class="str">"New Message"</span><span class="pun">);</span><span class="pln">
mBuilder</span><span class="pun">.</span><span class="pln">setContentText</span><span class="pun">(</span><span class="str">"Hi, This is the message text."</span><span class="pun">);</span><span class="pln">
mBuilder</span><span class="pun">.</span><span class="pln">setAutoCancel</span><span class="pun">(</span><span class="kwd">true</span><span class="pun">);</span><span class="pln">
mBuilder</span><span class="pun">.</span><span class="pln">setVisibility</span><span class="pun">(</span><span class="typ">Notification</span><span class="pun">.</span><span class="pln">VISIBILITY_PRIVATE</span><span class="pun">);</span></pre>

<p>
	<strong>ملحوظة</strong>: حتى يعمل التابع<span style="font-family:courier new,courier,monospace;"> ()setVisibility</span> يجب أن يكون الحد الأدنى من نسخة النظام التي يدعمها التطبيق هي Lollipop <abbr title="Application Programming Interface | واجهة برمجية">API</abbr> 21، حيث لا تدعم النسخ الأقدم هذه الميزة لذا تأكد من تغييرها عند عمل مشروع جديد.
</p>

<h2>
	تطبيق 9
</h2>

<p>
	يدعم أندرويد عدة أنواع من الإشعارات بجانب النوع الأساسي الذي استخدمناه في الأمثلة السابقة.
</p>

<h3>
	Big Text Style
</h3>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="18581" href="https://academy.hsoub.com/uploads/monthly_2016_07/25.png.a2a604ffae5cdcbbc8cc65ad15622280.png" rel=""><img alt="25.png" class="ipsImage ipsImage_thumbnailed" data-fileid="18581" data-unique="jxwm286m6" src="https://academy.hsoub.com/uploads/monthly_2016_07/25.thumb.png.dbdbf3a73292b9b7bdbe69917199ba5f.png"></a>
</p>

<p>
	حيث تستطيع أن تجمع بين الأمرين، إشعار بسيط يعرض نصًا مختصرًا ويمكن للمستخدم أن يقوم بتكبيره لعرض المزيد من التفاصيل. ويكثر استخدام هذه الطريقة عند عرض إشعار برسالة بريد إلكتروني جديدة فيمكن لك تكبيرها وقراءة تفاصيل الرسالة دون فتح التطبيق.
</p>

<p>
	ويمكنك تطبيق ذلك في تطبيقك عن طريق.
</p>

<ol>
<li>
		عمل إشعار وتحديد خصائصه كما سبق وذلك لتُعرض هذه المعلومات عندما يكون الإشعار صغير الحجم.
	</li>
	<li>
		عمل كائن من <span style="font-family:courier new,courier,monospace;">Notification.BigTextStyle </span>وتحديد عنوان جديد وعرض تفاصيل أكثر ثم إضافته لخصائص الإشعار.
	</li>
	<li>
		بناء الإشعار.
	</li>
</ol>
<p>
	ولتوضيح هذه الخطوات بالشيفرة نقوم بالتالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_3404_39">
<span class="kwd">private</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> showBigTextNotification</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">

	</span><span class="com">//Step 1</span><span class="pln">
	mBuilder </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Notification</span><span class="pun">.</span><span class="typ">Builder</span><span class="pun">(</span><span class="kwd">this</span><span class="pun">);</span><span class="pln">
	mBuilder</span><span class="pun">.</span><span class="pln">setSmallIcon</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">drawable</span><span class="pun">.</span><span class="pln">ic_txt</span><span class="pun">);</span><span class="pln">
	mBuilder</span><span class="pun">.</span><span class="pln">setContentTitle</span><span class="pun">(“</span><span class="typ">Big</span><span class="pln"> </span><span class="typ">Text</span><span class="pln"> in </span><span class="typ">Normal</span><span class="pln"> </span><span class="typ">Mode</span><span class="pun">”);</span><span class="pln">
	mBuilder</span><span class="pun">.</span><span class="pln">setContentText</span><span class="pun">(“</span><span class="typ">Example</span><span class="pln"> of a </span><span class="typ">Big</span><span class="pln"> </span><span class="typ">Text</span><span class="pln"> </span><span class="typ">Notification</span><span class="pun">.”);</span><span class="pln">

	</span><span class="com">//Step 2</span><span class="pln">
	</span><span class="typ">Notification</span><span class="pun">.</span><span class="typ">BigTextStyle</span><span class="pln"> bigText </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Notification</span><span class="pun">.</span><span class="typ">BigTextStyle</span><span class="pun">();</span><span class="pln">
	bigText</span><span class="pun">.</span><span class="pln">bigText</span><span class="pun">(“</span><span class="typ">This</span><span class="pln"> </span><span class="typ">Text</span><span class="pln"> will be repeated over and over</span><span class="pun">.</span><span class="typ">This</span><span class="pln"> </span><span class="typ">Text</span><span class="pln"> will be repeated over and over</span><span class="pun">.</span><span class="typ">This</span><span class="pln"> </span><span class="typ">Text</span><span class="pln"> will be repeated over and over</span><span class="pun">.</span><span class="typ">This</span><span class="pln"> </span><span class="typ">Text</span><span class="pln"> will be repeated over and over</span><span class="pun">.”);</span><span class="pln">
	bigText</span><span class="pun">.</span><span class="pln">setBigContentTitle</span><span class="pun">(“</span><span class="typ">Big</span><span class="pln"> </span><span class="typ">Text</span><span class="pln"> in </span><span class="typ">Expansion</span><span class="pln"> </span><span class="typ">Mode</span><span class="pun">”);</span><span class="pln">

	mBuilder</span><span class="pun">.</span><span class="pln">setStyle</span><span class="pun">(</span><span class="pln">bigText</span><span class="pun">);</span><span class="pln">

	</span><span class="com">//Step 3</span><span class="pln">
	</span><span class="typ">Notification</span><span class="pln"> notfi </span><span class="pun">=</span><span class="pln"> mBuilder</span><span class="pun">.</span><span class="pln">build</span><span class="pun">();</span><span class="pln">
	mNotificationManager</span><span class="pun">.</span><span class="pln">notify</span><span class="pun">(</span><span class="lit">200</span><span class="pun">,</span><span class="pln">notfi</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span></pre>

<h3>
	Inbox Style
</h3>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="18582" href="https://academy.hsoub.com/uploads/monthly_2016_07/26.png.fa04a712c081192394b747ac53da9fa5.png" rel=""><img alt="26.png" class="ipsImage ipsImage_thumbnailed" data-fileid="18582" data-unique="tw3yhhprc" src="https://academy.hsoub.com/uploads/monthly_2016_07/26.thumb.png.1d3fda76ba27b924781496971e37f290.png"></a>
</p>

<p>
	يختلف هذا النوع عن النوع السابق في أنه يتيح لك عرض التفاصيل في أكثر من سطر، أما النوع السابق سيعرض كافة التفاصيل في نفس السطر دون القدرة على التحكم فيما يُعرض في كل سطر على حدا.
</p>

<p>
	ويُستخدم هذا النوع عند التعديل على إشعار وإضافة المزيد من التفاصيل إليه. مثل تطبيقات البريد الإلكتروني عند عرض في نفس الإشعار سطرًا عن كل رسالة قادمة.
</p>

<p>
	لتطبيق هذا النوع نمر بنفس الخطوات السابقة ولكن باستخدام كائن من الصنف <span style="font-family:courier new,courier,monospace;">Notification.InboxStyle</span>.
</p>

<p>
	لاحظ أن لكل صنف توابعه الخاصة التي تُمكنك من إضافة الخصائص له.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_3404_65">
<span class="kwd">private</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> showInboxNotification</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">

	</span><span class="com">//Step 1</span><span class="pln">
	mBuilder </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Notification</span><span class="pun">.</span><span class="typ">Builder</span><span class="pun">(</span><span class="kwd">this</span><span class="pun">);</span><span class="pln">
	mBuilder</span><span class="pun">.</span><span class="pln">setSmallIcon</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">drawable</span><span class="pun">.</span><span class="pln">ic_inbox</span><span class="pun">);</span><span class="pln">
	mBuilder</span><span class="pun">.</span><span class="pln">setContentTitle</span><span class="pun">(“</span><span class="typ">Inbox</span><span class="pln"> in </span><span class="typ">Normal</span><span class="pln"> </span><span class="typ">Mode</span><span class="pun">”);</span><span class="pln">
	mBuilder</span><span class="pun">.</span><span class="pln">setContentText</span><span class="pun">(“</span><span class="typ">Example</span><span class="pln"> of a </span><span class="typ">Inbox</span><span class="pln"> </span><span class="typ">Notification</span><span class="pun">.”);</span><span class="pln">

	lines </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">String</span><span class="pun">[</span><span class="lit">6</span><span class="pun">];</span><span class="pln">
	lines</span><span class="pun">[</span><span class="lit">0</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="pun">“</span><span class="typ">Line</span><span class="pln"> number </span><span class="lit">1</span><span class="pun">”;</span><span class="pln">
	lines</span><span class="pun">[</span><span class="lit">1</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="pun">“</span><span class="typ">Line</span><span class="pln"> number </span><span class="lit">2</span><span class="pun">”;</span><span class="pln">
	lines</span><span class="pun">[</span><span class="lit">2</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="pun">“</span><span class="typ">Line</span><span class="pln"> number </span><span class="lit">3</span><span class="pun">”;</span><span class="pln">
	lines</span><span class="pun">[</span><span class="lit">3</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="pun">“</span><span class="typ">Line</span><span class="pln"> number </span><span class="lit">4</span><span class="pun">”;</span><span class="pln">
	lines</span><span class="pun">[</span><span class="lit">4</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="pun">“</span><span class="typ">Line</span><span class="pln"> number </span><span class="lit">5</span><span class="pun">”;</span><span class="pln">
	lines</span><span class="pun">[</span><span class="lit">5</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="pun">“</span><span class="typ">Line</span><span class="pln"> number </span><span class="lit">6</span><span class="pun">”;</span><span class="pln">

	</span><span class="com">//Step 2</span><span class="pln">
	</span><span class="typ">Notification</span><span class="pun">.</span><span class="typ">InboxStyle</span><span class="pln"> inbox </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Notification</span><span class="pun">.</span><span class="typ">InboxStyle</span><span class="pun">();</span><span class="pln">
	</span><span class="kwd">for</span><span class="pun">(</span><span class="kwd">int</span><span class="pln"> I </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pln"> </span><span class="pun">;</span><span class="pln"> i</span><span class="pun">&lt;</span><span class="pln">lines</span><span class="pun">.</span><span class="pln">length</span><span class="pun">;</span><span class="pln"> i</span><span class="pun">++)</span><span class="pln">
		inbox</span><span class="pun">.</span><span class="pln">addLine</span><span class="pun">(</span><span class="pln">lines</span><span class="pun">[</span><span class="pln">i</span><span class="pun">]);</span><span class="pln">
	inbox</span><span class="pun">.</span><span class="pln">setBigContentTitle</span><span class="pun">(“</span><span class="typ">Inbox</span><span class="pln"> in </span><span class="typ">Expansion</span><span class="pln"> </span><span class="typ">Mode</span><span class="pun">”);</span><span class="pln">
	mBuilder</span><span class="pun">.</span><span class="pln">setStyle</span><span class="pun">(</span><span class="pln">inbox</span><span class="pun">);</span><span class="pln">

	</span><span class="com">//Step 3</span><span class="pln">
	</span><span class="typ">Notification</span><span class="pln"> notfi </span><span class="pun">=</span><span class="pln"> mBuilder</span><span class="pun">.</span><span class="pln">build</span><span class="pun">();</span><span class="pln">
	mNotificationManager</span><span class="pun">.</span><span class="pln">notify</span><span class="pun">(</span><span class="lit">97</span><span class="pun">,</span><span class="pln">notfi</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span></pre>

<h3>
	Big Picture Style
</h3>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="18583" href="https://academy.hsoub.com/uploads/monthly_2016_07/27.png.d9204a35a6e0c6ea2d429f415ebbbea4.png" rel=""><img alt="27.png" class="ipsImage ipsImage_thumbnailed" data-fileid="18583" data-unique="oqnhqvloi" src="https://academy.hsoub.com/uploads/monthly_2016_07/27.thumb.png.e34c7c8cf495b2cde27b2635ff936d22.png"></a>
</p>

<p>
	عندما تكون تفاصيل الإشعار هي صورة يُفضل استخدام هذا النوع.
</p>

<p>
	وأيضًا يختلف نوع الكائن المستخدم <span style="font-family:courier new,courier,monospace;">Notification.BigPictureStyle</span>.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_3404_67">
<span class="kwd">private</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> showBigPictureNotification</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">

	</span><span class="com">//Step 1</span><span class="pln">
	mBuilder </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Notification</span><span class="pun">.</span><span class="typ">Builder</span><span class="pun">(</span><span class="kwd">this</span><span class="pun">);</span><span class="pln">
	mBuilder</span><span class="pun">.</span><span class="pln">setSmallIcon</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">drawable</span><span class="pun">.</span><span class="pln">ic_picture</span><span class="pun">);</span><span class="pln">
	mBuilder</span><span class="pun">.</span><span class="pln">setContentTitle</span><span class="pun">(“</span><span class="typ">Big</span><span class="pln"> </span><span class="typ">Picture</span><span class="pln"> in </span><span class="typ">Normal</span><span class="pln"> </span><span class="typ">Mode</span><span class="pun">”);</span><span class="pln">
	mBuilder</span><span class="pun">.</span><span class="pln">setContentText</span><span class="pun">(“</span><span class="typ">Example</span><span class="pln"> of a </span><span class="typ">Big</span><span class="pln"> </span><span class="typ">Picture</span><span class="pln"> </span><span class="typ">Notification</span><span class="pun">.”);</span><span class="pln">

	</span><span class="typ">Bitmap</span><span class="pln"> img </span><span class="pun">=</span><span class="pln"> </span><span class="typ">BitmapFactory</span><span class="pun">.</span><span class="pln">decodeResource</span><span class="pun">(</span><span class="pln">getResources</span><span class="pun">(),</span><span class="pln">R</span><span class="pun">.</span><span class="pln">drawable</span><span class="pun">.</span><span class="pln">picture</span><span class="pun">);</span><span class="pln">

	</span><span class="com">//Step 2</span><span class="pln">
	</span><span class="typ">Notification</span><span class="pun">.</span><span class="typ">BigPictureStyle</span><span class="pln"> bigPic </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Notification</span><span class="pun">.</span><span class="typ">BigPictureStyle</span><span class="pun">();</span><span class="pln">
	bigPic</span><span class="pun">.</span><span class="pln">bigPicture</span><span class="pun">(</span><span class="pln">img</span><span class="pun">);</span><span class="pln">
	bigPic</span><span class="pun">.</span><span class="pln">setBigContentTitle</span><span class="pun">(“</span><span class="typ">Big</span><span class="pln"> </span><span class="typ">Picture</span><span class="pln"> in </span><span class="typ">Expansion</span><span class="pln"> </span><span class="typ">Mode</span><span class="pun">”);</span><span class="pln">
	mBuilder</span><span class="pun">.</span><span class="pln">setStyle</span><span class="pun">(</span><span class="pln">bigPic</span><span class="pun">);</span><span class="pln">

	</span><span class="com">//Step 3</span><span class="pln">
	</span><span class="typ">Notification</span><span class="pln"> notfi </span><span class="pun">=</span><span class="pln"> mBuilder</span><span class="pun">.</span><span class="pln">build</span><span class="pun">();</span><span class="pln">
	mNotificationManager</span><span class="pun">.</span><span class="pln">notify</span><span class="pun">(</span><span class="lit">6</span><span class="pun">,</span><span class="pln">notfi</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	وبدمج كافة الأنواع في تطبيق واحد يعرض الإشعار عند الضغط على الزر المناسب لتُصبح الشيفرة النهائية لملف<span style="font-family:courier new,courier,monospace;"> MainActivity.java</span> هي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_3404_37">
<span class="pln">package apps</span><span class="pun">.</span><span class="pln">noby</span><span class="pun">.</span><span class="pln">advancednotification</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">app</span><span class="pun">.</span><span class="typ">Activity</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">app</span><span class="pun">.</span><span class="typ">Notification</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">app</span><span class="pun">.</span><span class="typ">NotificationManager</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">graphics</span><span class="pun">.</span><span class="typ">Bitmap</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">graphics</span><span class="pun">.</span><span class="typ">BitmapFactory</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">os</span><span class="pun">.</span><span class="typ">Bundle</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">view</span><span class="pun">.</span><span class="typ">View</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">widget</span><span class="pun">.</span><span class="typ">Button</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">MainActivity</span><span class="pln"> extends </span><span class="typ">Activity</span><span class="pln"> </span><span class="pun">{</span><span class="pln">

	</span><span class="kwd">private</span><span class="pln"> </span><span class="typ">Button</span><span class="pln"> bigTextButton</span><span class="pun">;</span><span class="pln">
	</span><span class="kwd">private</span><span class="pln"> </span><span class="typ">Button</span><span class="pln"> inboxButton</span><span class="pun">;</span><span class="pln">
	</span><span class="kwd">private</span><span class="pln"> </span><span class="typ">Button</span><span class="pln"> bigPictureButton</span><span class="pun">;</span><span class="pln">
	</span><span class="kwd">private</span><span class="pln"> </span><span class="typ">Button</span><span class="pln"> cancelButton</span><span class="pun">;</span><span class="pln">

	</span><span class="kwd">private</span><span class="pln"> </span><span class="typ">Notification</span><span class="pun">.</span><span class="typ">Builder</span><span class="pln"> mBuilder</span><span class="pun">;</span><span class="pln">
	</span><span class="kwd">private</span><span class="pln"> </span><span class="typ">NotificationManager</span><span class="pln"> mNotificationManager</span><span class="pun">;</span><span class="pln">

	</span><span class="kwd">private</span><span class="pln"> </span><span class="typ">String</span><span class="pun">[]</span><span class="pln"> lines</span><span class="pun">;</span><span class="pln">

	</span><span class="lit">@Override</span><span class="pln">
	</span><span class="kwd">protected</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> onCreate</span><span class="pun">(</span><span class="typ">Bundle</span><span class="pln"> savedInstanceState</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
		super</span><span class="pun">.</span><span class="pln">onCreate</span><span class="pun">(</span><span class="pln">savedInstanceState</span><span class="pun">);</span><span class="pln">
		setContentView</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">layout</span><span class="pun">.</span><span class="pln">activity_main</span><span class="pun">);</span><span class="pln">

		bigTextButton </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="typ">Button</span><span class="pun">)</span><span class="pln"> findViewById</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">id</span><span class="pun">.</span><span class="pln">bg_txt</span><span class="pun">);</span><span class="pln">
		inboxButton </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="typ">Button</span><span class="pun">)</span><span class="pln"> findViewById</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">id</span><span class="pun">.</span><span class="pln">inbx</span><span class="pun">);</span><span class="pln">
		bigPictureButton </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="typ">Button</span><span class="pun">)</span><span class="pln"> findViewById</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">id</span><span class="pun">.</span><span class="pln">bg_pic</span><span class="pun">);</span><span class="pln">
		cancelButton </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="typ">Button</span><span class="pun">)</span><span class="pln"> findViewById</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">id</span><span class="pun">.</span><span class="pln">cncl</span><span class="pun">);</span><span class="pln">

		mNotificationManager </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="typ">NotificationManager</span><span class="pun">)</span><span class="pln"> getSystemService</span><span class="pun">(</span><span class="pln">NOTIFICATION_SERVICE</span><span class="pun">);</span><span class="pln">
		
      	bigTextButton</span><span class="pun">.</span><span class="pln">setOnClickListener</span><span class="pun">(</span><span class="kwd">new</span><span class="pln"> </span><span class="typ">View</span><span class="pun">.</span><span class="typ">OnClickListener</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
			</span><span class="lit">@Override</span><span class="pln">
			</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> onClick </span><span class="pun">(</span><span class="typ">View</span><span class="pln"> v</span><span class="pun">){</span><span class="pln">
				showBigTextNotification</span><span class="pun">();</span><span class="pln">
			</span><span class="pun">}</span><span class="pln">
		</span><span class="pun">}</span><span class="pln">
	</span><span class="pun">);</span><span class="pln">

	inboxButton</span><span class="pun">.</span><span class="pln">setOnClickListener</span><span class="pun">(</span><span class="kwd">new</span><span class="pln"> </span><span class="typ">View</span><span class="pun">.</span><span class="typ">OnClickListener</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
		</span><span class="lit">@Override</span><span class="pln">
		</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> onClick</span><span class="pun">(</span><span class="typ">View</span><span class="pln"> v</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
			showInboxNotification</span><span class="pun">();</span><span class="pln">
		</span><span class="pun">}</span><span class="pln">
	</span><span class="pun">});</span><span class="pln">

	bigPictureButton</span><span class="pun">.</span><span class="pln">setOnClickListener</span><span class="pun">(</span><span class="kwd">new</span><span class="pln"> </span><span class="typ">View</span><span class="pun">.</span><span class="typ">OnClickListener</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
		</span><span class="lit">@Override</span><span class="pln">
		</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> onClick</span><span class="pun">(</span><span class="typ">View</span><span class="pln"> v</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
			showBigPictureNotification</span><span class="pun">();</span><span class="pln">
		</span><span class="pun">}</span><span class="pln">
	</span><span class="pun">});</span><span class="pln">

	cancelButton</span><span class="pun">.</span><span class="pln">setOnClickListener</span><span class="pun">(</span><span class="kwd">new</span><span class="pln"> </span><span class="typ">View</span><span class="pun">.</span><span class="typ">OnClickListener</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
		</span><span class="lit">@Override</span><span class="pln">
		</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> onClick</span><span class="pun">(</span><span class="typ">View</span><span class="pln"> v</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
			cancelNotification</span><span class="pun">();</span><span class="pln">
		</span><span class="pun">}</span><span class="pln">
	</span><span class="pun">});</span><span class="pln">
	</span><span class="pun">}</span><span class="pln">

	</span><span class="kwd">private</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> cancelNotification</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
		mNotificationManager</span><span class="pun">.</span><span class="pln">cancelAll</span><span class="pun">();</span><span class="pln">
	</span><span class="pun">}</span><span class="pln">

	</span><span class="kwd">private</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> showBigTextNotification</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
		mBuilder </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Notification</span><span class="pun">.</span><span class="typ">Builder</span><span class="pun">(</span><span class="kwd">this</span><span class="pun">);</span><span class="pln">
		mBuilder</span><span class="pun">.</span><span class="pln">setSmallIcon</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">drawable</span><span class="pun">.</span><span class="pln">ic_txt</span><span class="pun">);</span><span class="pln">
		mBuilder</span><span class="pun">.</span><span class="pln">setContentTitle</span><span class="pun">(</span><span class="str">"Big Text in Normal Mode"</span><span class="pun">);</span><span class="pln">
		mBuilder</span><span class="pun">.</span><span class="pln">setContentText</span><span class="pun">(</span><span class="str">"Example of a Big Text Notification."</span><span class="pun">);</span><span class="pln">

		</span><span class="typ">Notification</span><span class="pun">.</span><span class="typ">BigTextStyle</span><span class="pln"> bigText </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Notification</span><span class="pun">.</span><span class="typ">BigTextStyle</span><span class="pun">();</span><span class="pln">
		bigText</span><span class="pun">.</span><span class="pln">bigText</span><span class="pun">(</span><span class="str">"This Text will be repeated over and over.This Text will be repeated over and over.This Text will be repeated over and over.This Text will be repeated over and over."</span><span class="pun">);</span><span class="pln">
		bigText</span><span class="pun">.</span><span class="pln">setBigContentTitle</span><span class="pun">(</span><span class="str">"Big Text in Expansion Mode"</span><span class="pun">);</span><span class="pln">

		mBuilder</span><span class="pun">.</span><span class="pln">setStyle</span><span class="pun">(</span><span class="pln">bigText</span><span class="pun">);</span><span class="pln">

		</span><span class="typ">Notification</span><span class="pln"> notfi </span><span class="pun">=</span><span class="pln"> mBuilder</span><span class="pun">.</span><span class="pln">build</span><span class="pun">();</span><span class="pln">
	
		mNotificationManager</span><span class="pun">.</span><span class="pln">notify</span><span class="pun">(</span><span class="lit">200</span><span class="pun">,</span><span class="pln">notfi</span><span class="pun">);</span><span class="pln">
	</span><span class="pun">}</span><span class="pln">

	</span><span class="kwd">private</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> showInboxNotification</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
		mBuilder </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Notification</span><span class="pun">.</span><span class="typ">Builder</span><span class="pun">(</span><span class="kwd">this</span><span class="pun">);</span><span class="pln">
		mBuilder</span><span class="pun">.</span><span class="pln">setSmallIcon</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">drawable</span><span class="pun">.</span><span class="pln">ic_inbox</span><span class="pun">);</span><span class="pln">
		mBuilder</span><span class="pun">.</span><span class="pln">setContentTitle</span><span class="pun">(</span><span class="str">"Inbox in Normal Mode"</span><span class="pun">);</span><span class="pln">
		mBuilder</span><span class="pun">.</span><span class="pln">setContentText</span><span class="pun">(</span><span class="str">"Example of a Inbox Notification."</span><span class="pun">);</span><span class="pln">

		lines </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">String</span><span class="pun">[</span><span class="lit">6</span><span class="pun">];</span><span class="pln">
		lines</span><span class="pun">[</span><span class="lit">0</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Line number 1"</span><span class="pun">;</span><span class="pln">
		lines</span><span class="pun">[</span><span class="lit">1</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Line number 2"</span><span class="pun">;</span><span class="pln">
		lines</span><span class="pun">[</span><span class="lit">2</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Line number 3"</span><span class="pun">;</span><span class="pln">
		lines</span><span class="pun">[</span><span class="lit">3</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Line number 4"</span><span class="pun">;</span><span class="pln">
		lines</span><span class="pun">[</span><span class="lit">4</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Line number 5"</span><span class="pun">;</span><span class="pln">
		lines</span><span class="pun">[</span><span class="lit">5</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Line number 6"</span><span class="pun">;</span><span class="pln">

		</span><span class="typ">Notification</span><span class="pun">.</span><span class="typ">InboxStyle</span><span class="pln"> inbox </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Notification</span><span class="pun">.</span><span class="typ">InboxStyle</span><span class="pun">();</span><span class="pln">
		</span><span class="kwd">for</span><span class="pun">(</span><span class="kwd">int</span><span class="pln"> i </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pln"> </span><span class="pun">;</span><span class="pln"> i</span><span class="pun">&lt;</span><span class="pln">lines</span><span class="pun">.</span><span class="pln">length</span><span class="pun">;</span><span class="pln"> i</span><span class="pun">++)</span><span class="pln">
			inbox</span><span class="pun">.</span><span class="pln">addLine</span><span class="pun">(</span><span class="pln">lines</span><span class="pun">[</span><span class="pln">i</span><span class="pun">]);</span><span class="pln">
		inbox</span><span class="pun">.</span><span class="pln">setBigContentTitle</span><span class="pun">(</span><span class="str">"Inbox in Expansion Mode"</span><span class="pun">);</span><span class="pln">
		mBuilder</span><span class="pun">.</span><span class="pln">setStyle</span><span class="pun">(</span><span class="pln">inbox</span><span class="pun">);</span><span class="pln">

		</span><span class="typ">Notification</span><span class="pln"> notfi </span><span class="pun">=</span><span class="pln"> mBuilder</span><span class="pun">.</span><span class="pln">build</span><span class="pun">();</span><span class="pln">

		mNotificationManager</span><span class="pun">.</span><span class="pln">notify</span><span class="pun">(</span><span class="lit">97</span><span class="pun">,</span><span class="pln">notfi</span><span class="pun">);</span><span class="pln">
	</span><span class="pun">}</span><span class="pln">

	</span><span class="kwd">private</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> showBigPictureNotification</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
		mBuilder </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Notification</span><span class="pun">.</span><span class="typ">Builder</span><span class="pun">(</span><span class="kwd">this</span><span class="pun">);</span><span class="pln">
		mBuilder</span><span class="pun">.</span><span class="pln">setSmallIcon</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">drawable</span><span class="pun">.</span><span class="pln">ic_picture</span><span class="pun">);</span><span class="pln">
		mBuilder</span><span class="pun">.</span><span class="pln">setContentTitle</span><span class="pun">(</span><span class="str">"Big Picture in Normal Mode"</span><span class="pun">);</span><span class="pln">
		mBuilder</span><span class="pun">.</span><span class="pln">setContentText</span><span class="pun">(</span><span class="str">"Example of a Big Picture Notification."</span><span class="pun">);</span><span class="pln">

		</span><span class="typ">Bitmap</span><span class="pln"> img </span><span class="pun">=</span><span class="pln"> </span><span class="typ">BitmapFactory</span><span class="pun">.</span><span class="pln">decodeResource</span><span class="pun">(</span><span class="pln">getResources</span><span class="pun">(),</span><span class="pln">R</span><span class="pun">.</span><span class="pln">drawable</span><span class="pun">.</span><span class="pln">picture</span><span class="pun">);</span><span class="pln">

		</span><span class="typ">Notification</span><span class="pun">.</span><span class="typ">BigPictureStyle</span><span class="pln"> bigPic </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Notification</span><span class="pun">.</span><span class="typ">BigPictureStyle</span><span class="pun">();</span><span class="pln">
		bigPic</span><span class="pun">.</span><span class="pln">bigPicture</span><span class="pun">(</span><span class="pln">img</span><span class="pun">);</span><span class="pln">
		bigPic</span><span class="pun">.</span><span class="pln">setBigContentTitle</span><span class="pun">(</span><span class="str">"Big Picture in Expansion Mode"</span><span class="pun">);</span><span class="pln">
		mBuilder</span><span class="pun">.</span><span class="pln">setStyle</span><span class="pun">(</span><span class="pln">bigPic</span><span class="pun">);</span><span class="pln">

		</span><span class="typ">Notification</span><span class="pln"> notfi </span><span class="pun">=</span><span class="pln"> mBuilder</span><span class="pun">.</span><span class="pln">build</span><span class="pun">();</span><span class="pln">
		mNotificationManager</span><span class="pun">.</span><span class="pln">notify</span><span class="pun">(</span><span class="lit">6</span><span class="pun">,</span><span class="pln">notfi</span><span class="pun">);</span><span class="pln">
	</span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	وملف واجهة المستخدم <span style="font-family:courier new,courier,monospace;">activity_main.xml</span>:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3404_35">
<span class="pun">&lt;?</span><span class="pln">xml version</span><span class="pun">=</span><span class="str">"1.0"</span><span class="pln"> encoding</span><span class="pun">=</span><span class="str">"utf-8"</span><span class="pun">?&gt;</span><span class="pln">
</span><span class="tag">&lt;LinearLayout</span><span class="pln"> </span><span class="atn">xmlns:android</span><span class="pun">=</span><span class="atv">"http://schemas.android.com/apk/res/android"</span><span class="pln">
	</span><span class="atn">android:layout_width</span><span class="pun">=</span><span class="atv">"match_parent"</span><span class="pln">
	</span><span class="atn">android:layout_height</span><span class="pun">=</span><span class="atv">"match_parent"</span><span class="pln">
	</span><span class="atn">android:gravity</span><span class="pun">=</span><span class="atv">"center"</span><span class="pln">
	</span><span class="atn">android:orientation</span><span class="pun">=</span><span class="atv">"vertical"</span><span class="tag">&gt;</span><span class="pln">

	</span><span class="tag">&lt;Button</span><span class="pln">
		</span><span class="atn">android:layout_width</span><span class="pun">=</span><span class="atv">"wrap_content"</span><span class="pln">
		</span><span class="atn">android:layout_height</span><span class="pun">=</span><span class="atv">"wrap_content"</span><span class="pln">
		</span><span class="atn">android:text</span><span class="pun">=</span><span class="atv">"Big Text Style"</span><span class="pln">
		</span><span class="atn">android:id</span><span class="pun">=</span><span class="atv">"@+id/bg_txt"</span><span class="tag">/&gt;</span><span class="pln">

	</span><span class="tag">&lt;Button</span><span class="pln">
		</span><span class="atn">android:layout_width</span><span class="pun">=</span><span class="atv">"wrap_content"</span><span class="pln">
		</span><span class="atn">android:layout_height</span><span class="pun">=</span><span class="atv">"wrap_content"</span><span class="pln">
		</span><span class="atn">android:text</span><span class="pun">=</span><span class="atv">"Inbox Style"</span><span class="pln">
		</span><span class="atn">android:id</span><span class="pun">=</span><span class="atv">"@+id/inbx"</span><span class="tag">/&gt;</span><span class="pln">

	</span><span class="tag">&lt;Button</span><span class="pln">
		</span><span class="atn">android:layout_width</span><span class="pun">=</span><span class="atv">"wrap_content"</span><span class="pln">
		</span><span class="atn">android:layout_height</span><span class="pun">=</span><span class="atv">"wrap_content"</span><span class="pln">
		</span><span class="atn">android:text</span><span class="pun">=</span><span class="atv">"Big Picture Style"</span><span class="pln">
		</span><span class="atn">android:id</span><span class="pun">=</span><span class="atv">"@+id/bg_pic"</span><span class="tag">/&gt;</span><span class="pln">

	</span><span class="tag">&lt;Button</span><span class="pln">
		</span><span class="atn">android:layout_width</span><span class="pun">=</span><span class="atv">"wrap_content"</span><span class="pln">
		</span><span class="atn">android:layout_height</span><span class="pun">=</span><span class="atv">"wrap_content"</span><span class="pln">
		</span><span class="atn">android:text</span><span class="pun">=</span><span class="atv">"Cancel ALL"</span><span class="pln">
		</span><span class="atn">android:id</span><span class="pun">=</span><span class="atv">"@+id/cncl"</span><span class="tag">/&gt;</span><span class="pln">
</span><span class="tag">&lt;/LinearLayout&gt;</span></pre>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="18584" href="https://academy.hsoub.com/uploads/monthly_2016_07/28.png.c9e2d7d26347b22c760083949cb1d980.png" rel=""><img alt="28.png" class="ipsImage ipsImage_thumbnailed" data-fileid="18584" data-unique="r3bdkhj5f" src="https://academy.hsoub.com/uploads/monthly_2016_07/28.thumb.png.c25dcf6eb5a5cae1a30c1378886074ec.png"></a>
</p>

<p>
	بهذا نكون قد وصلنا إلى نهاية هذا الدرس، في انتظار تجربتكم وآرائكم.
</p>
]]></description><guid isPermaLink="false">368</guid><pubDate>Tue, 26 Jul 2016 17:56:00 +0000</pubDate></item><item><title>&#x643;&#x64A;&#x641;&#x64A;&#x629; &#x627;&#x633;&#x62A;&#x62E;&#x62F;&#x627;&#x645; &#x627;&#x644;&#x62A;&#x62C;&#x632;&#x626;&#x629; &#x644;&#x62A;&#x62D;&#x642;&#x64A;&#x642; &#x623;&#x641;&#x636;&#x644; &#x627;&#x633;&#x62A;&#x641;&#x627;&#x62F;&#x629; &#x645;&#x646; &#x623;&#x62D;&#x62C;&#x627;&#x645; &#x627;&#x644;&#x634;&#x627;&#x634;&#x627;&#x62A; &#x627;&#x644;&#x645;&#x62E;&#x62A;&#x644;&#x641;&#x629; &#x641;&#x64A; &#x62A;&#x637;&#x628;&#x64A;&#x642;&#x627;&#x62A; &#x623;&#x646;&#x62F;&#x631;&#x648;&#x64A;&#x62F;</title><link>https://academy.hsoub.com/programming/android/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%A7%D9%84%D8%AA%D8%AC%D8%B2%D8%A6%D8%A9-%D9%84%D8%AA%D8%AD%D9%82%D9%8A%D9%82-%D8%A3%D9%81%D8%B6%D9%84-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D8%A9-%D9%85%D9%86-%D8%A3%D8%AD%D8%AC%D8%A7%D9%85-%D8%A7%D9%84%D8%B4%D8%A7%D8%B4%D8%A7%D8%AA-%D8%A7%D9%84%D9%85%D8%AE%D8%AA%D9%84%D9%81%D8%A9-%D9%81%D9%8A-%D8%AA%D8%B7%D8%A8%D9%8A%D9%82%D8%A7%D8%AA-%D8%A3%D9%86%D8%AF%D8%B1%D9%88%D9%8A%D8%AF-r378/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2016_10/android-fragment.png.006e2f3477298ee9b46d066127b9eca0.png" /></p>

<p>
	تنتشر الهواتف المحمولة والحواسيب اللوحية العاملة بنظام تشغيل أندرويد في أحجام مختلفة ودقة شاشات مختلفة، لذلك من الأفضل دائمًا إذا استطاع التطبيق أن يتأقلم مع حجم ودقة الشاشة لتقديم أفضل تجربة استخدام مع الاستغلال الأمثل لشاشة.
</p>

<p style="text-align: center;">
	<img alt="android-fragment.png" class="ipsImage ipsImage_thumbnailed" data-fileid="19247" data-unique="qixei3l0z" src="https://academy.hsoub.com/uploads/monthly_2016_10/android-fragment.png.d5beb4540312c3acc98bc76da7cd7c3c.png"></p>

<p>
	ويمكن أن تبني تطبيقًا تتغير الواجهة الخاصة به بشكل ديناميكي تبعًا للمساحة المتاحة في الشاشة، فإذا لم تتواجد مساحة كافية، يظهر جزء من الواجهة فقط في الشاشة ومنه يمكن الانتقال للواجهة الأخرى مثل الصورة التالية:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="19019" href="https://academy.hsoub.com/uploads/monthly_2016_09/1.png.0f78d6907d3c0dd55cb3794d16adf4f9.png" rel=""><img alt="1.png" class="ipsImage ipsImage_thumbnailed" data-fileid="19019" data-unique="mus2ijnp2" src="https://academy.hsoub.com/uploads/monthly_2016_09/1.thumb.png.21fd10050464a532ffa7b0ba9ad4670e.png"></a>
</p>

<p>
	أما إذا توافرت المساحة الكافية فيمكن دمج أكثر من واجهة في واجهة واحدة لسهولة التنقل بينها كما في الصورة التالية:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="19020" href="https://academy.hsoub.com/uploads/monthly_2016_09/2.png.8e2a4ce1cfe73c994214f196485b4ebe.png" rel=""><img alt="2.png" class="ipsImage ipsImage_thumbnailed" data-fileid="19020" data-unique="h06uzot78" src="https://academy.hsoub.com/uploads/monthly_2016_09/2.thumb.png.3fd99fff967f7e8435c63af308d9479f.png"></a>
</p>

<p>
	لذا يوفر أندرويد عدة طرق للقيام بذلك من ضمنها استخدام الـ Fragment داخل التطبيق.
</p>

<h2>
	Fragment
</h2>

<p>
	يُعبر مصطلح Fragment عن تجزئة واجهة المستخدم إلى وحدات أصغر تُمكن المطوّر من دمج أو فصل هذه الوحدات تبعًا لحجم الشاشة، ولا تتكون تلك الوحدة من عناصر واجهة المستخدم فقط ولكنها أيضًا تتكون من شيفرات تتحكم في وظيفة هذه الواجهة وسلوكها.
</p>

<p>
	لكن هذه الوحدات ليست مستقلة بذاتها أي لا يمكن أن تُعرض بداخل التطبيق إلا من خلال نشاط “Activity” يستضيفها بداخله. ولهذا المفهوم العديد من المزايا التي توفرها عند تطوير التطبيقات ومنها:
</p>

<ol>
<li>
		تقسيم الشيفرات المعقدة التي تتواجد في واجهة نشاط واحد إلى عدة وحدات لكل منها شيفرة بسيطة يتم دمجها وترتيبها بعد ذلك داخل واجهة واحدة.
	</li>
	<li>
		إمكانية إعادة استخدام الوحدة عدة مرات في أنشطة مختلفة ودمجها مع وحدات أخرى مختلفة.
	</li>
	<li>
		التكييف مع الواجهات المختلفة والأحجام المختلفة.
	</li>
</ol>
<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="19021" href="https://academy.hsoub.com/uploads/monthly_2016_09/3.png.00fe633d80d32694d2458d7856da23b9.png" rel=""><img alt="3.png" class="ipsImage ipsImage_thumbnailed" data-fileid="19021" data-unique="d4n8aepbp" src="https://academy.hsoub.com/uploads/monthly_2016_09/3.thumb.png.27272291d48cce75693030ed71c87596.png"></a>
</p>

<h2>
	دورة حياة التجزئة Fragment
</h2>

<p>
	للـ Fragment دورة حياة مشابهة لدورة حياة النشاط ويتم استدعاء التوابع الخاصة بدورة الحياة عند حدوث حدث معين كإنشاء أو إزالة الـ Fragment.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="19022" href="https://academy.hsoub.com/uploads/monthly_2016_09/4.png.db857d0997ef034d0bbcf905b12562a8.png" rel=""><img alt="4.png" class="ipsImage ipsImage_thumbnailed" data-fileid="19022" data-unique="kozr7ykf8" src="https://academy.hsoub.com/uploads/monthly_2016_09/4.thumb.png.7362b88ad2633b01250fee7aea72bcfe.png"></a>
</p>

<ul>
<li>
		<span style="font-family:courier new,courier,monospace;"><strong>()onAttach</strong></span>: ويتم استدعاؤه عندما يتم ربط الـ Fragment بالنشاط المضيف.
	</li>
	<li>
		<span style="font-family:courier new,courier,monospace;"><strong>()onCreate</strong></span>: ويتم استدعاؤه بعد ربطه بالنشاط مباشرة وذلك لاستخدامها في تهيئة العناصر والمتغيرات التي نرغب في بقائها حتى بعد إزالة واجهة الـ Fragment من داخل النشاط المضيف.
	</li>
	<li>
		<span style="font-family:courier new,courier,monospace;"><strong>()onCreateView</strong></span>: ويتم استدعاؤه لربط الواجهة الخاصة بالـ Fragment بالشيفرة الخاصة به.
	</li>
	<li>
		<span style="font-family:courier new,courier,monospace;"><strong>()onActivityCreated</strong></span>: ويتم استدعاؤه بعد انتهاء النشاط المضيف من التابع <span style="font-family:courier new,courier,monospace;">()onCreate</span> الخاص به.
	</li>
	<li>
		<span style="font-family:courier new,courier,monospace;"><strong>()onStart</strong></span>: ويتم استدعاؤه عندما تبدأ الواجهة الخاصة بالـ Fragment في الظهور وذلك بعد الانتهاء من <span style="font-family:courier new,courier,monospace;">()onStart</span> الخاصة بالنشاط أولًا.
	</li>
	<li>
		<span style="font-family:courier new,courier,monospace;"><strong>()onResume</strong></span>: ويتم استدعاؤه عندما تظهر الواجهة الخاصة بالـFragment وتصبح قابلة لتفاعل المستخدم معها، مع العلم بأنه لا يمكن للمستخدم بالتفاعل مع واجهة الـ Fragment قبل أن يتم استدعاء<span style="font-family:courier new,courier,monospace;"> <strong>()onResume</strong></span> الخاصة بالنشاط أولًا لتصبح واجهة النشاط قابلة للتفاعل أيضًا.
	</li>
	<li>
		<span style="font-family:courier new,courier,monospace;"><strong>()onPause</strong></span>: ويتم استدعاؤه عندما تبدأ الواجهة الخاصة بالنشاط المضيف في الاختفاء أو تظهر بشكل جزئي ولا يمكن للمستخدم التفاعل معها لوجود شيء ما يحجبها، أو عند الاستعداد لاستبدال أو إزالة الـ Fragment.
	</li>
	<li>
		<span style="font-family:courier new,courier,monospace;"><strong>()onStop</strong></span>: ويتم استدعاؤه عندما تختفي الواجهة الخاصة بالنشاط المضيف من أمام المستخدم أو لاستبدال أو إزالة الـ Fragment.
	</li>
	<li>
		<span style="font-family:courier new,courier,monospace;"><strong>()onDestroyView</strong></span>: ويتم استدعاؤه عند إزالة الواجهة التي تم إضافتها من قبل في <span style="font-family:courier new,courier,monospace;">()onCreateView</span>.
	</li>
	<li>
		<span style="font-family:courier new,courier,monospace;"><strong>()onDestroy</strong></span>: ويتم استدعاؤه قبل تدمير الواجهة وإزالتها من الذاكرة.
	</li>
	<li>
		<span style="font-family:courier new,courier,monospace;"><strong>()onDetach</strong></span>: ويتم استدعاؤه عند إزالة الـ Fragment من واجهة النشاط المضيف.
	</li>
</ul>
<p>
	لذا فكما ذكرنا فدورة حياة الـ Fragment مشابهة لدورة حياة النشاط ولكن هناك بعض التوابع الخاصة بالـ Fragment فقط ولا تتواجد في النشاط.
</p>

<h2>
	تطبيق 1
</h2>

<p>
	الهدف من هذا التطبيق فهم الأساسيات الخاصة بالـ Fragments حيث تتكون من:
</p>

<ol>
<li>
		واجهة خاصة به (XML File).
	</li>
	<li>
		صنف جديد يرث من Fragment.
	</li>
	<li>
		مكان خاص له في الواجهة الرئيسية الخاصة بالنشاط المضيف.
	</li>
</ol>
<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="19023" href="https://academy.hsoub.com/uploads/monthly_2016_09/5.png.eac165669de1d80f2ddc95f1777de9c1.png" rel=""><img alt="5.png" class="ipsImage ipsImage_thumbnailed" data-fileid="19023" data-unique="phgwul0g9" src="https://academy.hsoub.com/uploads/monthly_2016_09/5.thumb.png.9490527054c8874a561371d1e321eff3.png"></a>
</p>

<p>
	من Android Studio نُنشئ مشروعًا جديدًا يُدعى<span style="font-family:courier new,courier,monospace;"> <strong>Simple Fragment</strong></span> وبنفس الإعدادات في المشاريع السابقة.
</p>

<p>
	نبدأ أولًا بصنع <span style="font-family:courier new,courier,monospace;">Fragment</span> جديد (ملف واجهة وملف للشيفرة) عن طريق الضغط بالزر الأيمن على اسم الحزمة الخاصة بالمشروع كما بالصورة التالية:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="19024" href="https://academy.hsoub.com/uploads/monthly_2016_09/6.png.ea51e46532051399e0b893f794bbd94d.png" rel=""><img alt="6.png" class="ipsImage ipsImage_thumbnailed" data-fileid="19024" data-unique="h598anmke" src="https://academy.hsoub.com/uploads/monthly_2016_09/6.thumb.png.d06a7e4c9a00380eb71145cdca78e402.png"></a>
</p>

<p>
	ثم اختر:
</p>

<p style="text-align: center;">
	<strong>New &gt; Fragment &gt; Fragment Blank</strong>
</p>

<p>
	لتظهر لك هذه النافذة، قم بتغيير الاسم إلى الاسم الذي تراه مناسبًا وتغيير الاختيارات كما بالصورة:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="19248" href="https://academy.hsoub.com/uploads/monthly_2016_10/img1.png.91da5d93a591a0e46905efa490ae6087.png" rel=""><img alt="img1.png" class="ipsImage ipsImage_thumbnailed" data-fileid="19248" data-unique="3m5vp0t61" src="https://academy.hsoub.com/uploads/monthly_2016_10/img1.thumb.png.189cfabc6d47b96eff04aec62f5f7d60.png"></a>
</p>

<p>
	ثم اضغط <strong>Finish</strong>.
</p>

<p>
	سيقوم Android Studio بعد ذلك بإنشاء صنف جديد يُدعى <span style="font-family:courier new,courier,monospace;">ExampleFragment</span> ويرث من الصنف <span style="font-family:courier new,courier,monospace;">Fragment</span>، كما سينشئ ملف واجهة جديد يُدعى <span style="font-family:courier new,courier,monospace;">fragment_example</span>.
</p>

<p>
	نقوم بتغيير ملف الواجهة كما كنا نفعل في التطبيقات السابقة وفي هذا المثال سنكتفي بوضع نص في منتصف الواجهة مع تغيير لون الخلفية:
</p>

<pre class="ipsCode prettyprint lang-xml prettyprinted" id="ips_uid_8987_7">
<span class="tag">&lt;LinearLayout</span><span class="pln"> </span><span class="atn">xmlns:android</span><span class="pun">=</span><span class="atv">"http://schemas.android.com/apk/res/android"</span><span class="pln">
	</span><span class="atn">android:layout_width</span><span class="pun">=</span><span class="atv">"match_parent"</span><span class="pln">
	</span><span class="atn">android:layout_height</span><span class="pun">=</span><span class="atv">"match_parent"</span><span class="pln">
	</span><span class="atn">android:background</span><span class="pun">=</span><span class="atv">"#ccefff"</span><span class="pln">
	</span><span class="atn">android:orientation</span><span class="pun">=</span><span class="atv">"vertical"</span><span class="tag">&gt;</span><span class="pln">

	</span><span class="tag">&lt;TextView</span><span class="pln">
		</span><span class="atn">android:layout_width</span><span class="pun">=</span><span class="atv">"match_parent"</span><span class="pln">
		</span><span class="atn">android:layout_height</span><span class="pun">=</span><span class="atv">"match_parent"</span><span class="pln">
		</span><span class="atn">android:text</span><span class="pun">=</span><span class="atv">"Hello From Example Fragment"</span><span class="pln">
		</span><span class="atn">android:gravity</span><span class="pun">=</span><span class="atv">"center"</span><span class="tag">/&gt;</span><span class="pln">
</span><span class="tag">&lt;/LinearLayout&gt;</span></pre>

<p>
	والآن لربط ملف الواجهة بالشيفرة الخاصة بالصنف <span style="font-family:courier new,courier,monospace;">ExampleFragment</span> نكتب داخل التابع<span style="font-family:courier new,courier,monospace;"> ()onCreateView -</span>وهو التابع المسؤول عن ربط الشيفرة بالواجهة- الشيفرة التالية:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_8987_9">
<span class="lit">@Override</span><span class="pln">
</span><span class="kwd">public</span><span class="pln"> </span><span class="typ">View</span><span class="pln"> onCreateView</span><span class="pun">(</span><span class="typ">LayoutInflater</span><span class="pln"> inflater</span><span class="pun">,</span><span class="pln"> </span><span class="typ">ViewGroup</span><span class="pln"> container</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Bundle</span><span class="pln"> savedInstanceState</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">

	</span><span class="typ">View</span><span class="pln"> rootView </span><span class="pun">=</span><span class="pln">inflater</span><span class="pun">.</span><span class="pln">inflate</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">layout</span><span class="pun">.</span><span class="pln">fragment_example</span><span class="pun">,</span><span class="pln"> container</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">);</span><span class="pln">
	</span><span class="kwd">return</span><span class="pln"> rootView</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	تختلف طريقة ربط الواجهة في الـ Fragment عنها في النشاط (Activity) فلا نستطيع استخدام التابع <span style="font-family:courier new,courier,monospace;">()setContentView</span>، عوضًا عن ذلك نستخدم الكائن <span style="font-family:courier new,courier,monospace;">inflater</span> الذي تم تمريره للتابع <span style="font-family:courier new,courier,monospace;">()onCreateView</span> ونستدعي به التابع <span style="font-family:courier new,courier,monospace;">()inflate</span> وقد تعاملنا مع هذا التابع من قبل في <a href="https://academy.hsoub.com/programming/android/%D8%B9%D9%86%D8%A7%D8%B5%D8%B1-%D9%82%D8%A7%D8%A6%D9%85%D8%A9-%D8%A7%D9%84%D8%B9%D8%B1%D8%B6-%D9%84%D9%88%D8%A7%D8%AC%D9%87%D8%A9-%D8%A7%D9%84%D9%85%D8%B3%D8%AA%D8%AE%D8%AF%D9%85-%D9%81%D9%8A-%D8%AA%D8%B7%D8%A8%D9%8A%D9%82%D8%A7%D8%AA-%D8%A3%D9%86%D8%AF%D8%B1%D9%88%D9%8A%D8%AF-8-r360/" rel="">الدرس الخاص بقوائم العرض ListView</a>، ونمرر للتابع المعاملات الآتية:
</p>

<ol>
<li>
		الواجهة التي نريد ربطها.
	</li>
	<li>
		الواجهة التي ستحتوي واجهة الـ Fragment بداخلها وهي هنا <span style="font-family:courier new,courier,monospace;">container</span>.
	</li>
	<li>
		قيمة منطقية تُعبر عن "هل نريد وضع واجهة الـ Fragment داخل الواجهة <span style="font-family:courier new,courier,monospace;">container</span> -المعامل السابق- أم لا؟"، وسنقوم دائمًا عند التعامل مع الـ Fragments بالإجابة بلا أو القيمة المنطقية <span style="font-family:courier new,courier,monospace;">false</span>؛ وذلك لأنها بشكل افتراضي يتم ربطها.
	</li>
</ol>
<p>
	ويقوم هذا التابع بتحويل ملف الواجهة (XML File) إلى كائن من الصنف <span style="font-family:courier new,courier,monospace;">View</span> يمكن التعامل معه داخل شيفرات جافا بسهولة.
</p>

<p>
	بعد ذلك نعيد الكائن <span style="font-family:courier new,courier,monospace;">rootView</span> إلى التابع، لتصبح الشيفرة النهائية على الشّكل التّالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_8987_12">
<span class="pln">package apps</span><span class="pun">.</span><span class="pln">noby</span><span class="pun">.</span><span class="pln">simplefragment</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">os</span><span class="pun">.</span><span class="typ">Bundle</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">app</span><span class="pun">.</span><span class="typ">Fragment</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">view</span><span class="pun">.</span><span class="typ">LayoutInflater</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">view</span><span class="pun">.</span><span class="typ">View</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">view</span><span class="pun">.</span><span class="typ">ViewGroup</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">ExampleFragment</span><span class="pln"> extends </span><span class="typ">Fragment</span><span class="pln"> </span><span class="pun">{</span><span class="pln">

  	</span><span class="lit">@Override</span><span class="pln">
	</span><span class="kwd">public</span><span class="pln"> </span><span class="typ">View</span><span class="pln"> onCreateView</span><span class="pun">(</span><span class="typ">LayoutInflater</span><span class="pln"> inflater</span><span class="pun">,</span><span class="pln"> </span><span class="typ">ViewGroup</span><span class="pln"> container</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Bundle</span><span class="pln"> savedInstanceState</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">

		</span><span class="typ">View</span><span class="pln"> rootView </span><span class="pun">=</span><span class="pln">inflater</span><span class="pun">.</span><span class="pln">inflate</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">layout</span><span class="pun">.</span><span class="pln">fragment_example</span><span class="pun">,</span><span class="pln"> container</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">);</span><span class="pln">
		</span><span class="kwd">return</span><span class="pln"> rootView</span><span class="pun">;</span><span class="pln">
	</span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	لاحظ أنه لكي تعمل الشيفرة بشكل سليم عند الوراثة من الصنف <span style="font-family:courier new,courier,monospace;">Fragment</span> يجب أن تقوم بتضمين <span style="font-family:courier new,courier,monospace;">;import android.app.Fragment</span>.
</p>

<p>
	يتبقى الآن الخطوة الأخيرة وهي إيجاد مكان لهذا الـ Fragment داخل النشاط المضيف له، وفي هذا التطبيق النشاط المضيف هو النشاط الرئيسي (<span style="font-family:courier new,courier,monospace;">MainActivity</span>)، ولوضع مكان للـ Fragment داخل ملف واجهة النشاط نقوم بتعريف عنصر واجهة جديد من النوع <span style="font-family:courier new,courier,monospace;">&lt;fragment&gt;</span> وتحديد له بعض الخصائص كما يلي:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_8987_14">
<span class="tag">&lt;fragment</span><span class="pln">
	</span><span class="atn">android:layout_width</span><span class="pun">=</span><span class="atv">"match_parent"</span><span class="pln">
	</span><span class="atn">android:layout_height</span><span class="pun">=</span><span class="atv">"match_parent"</span><span class="pln">
	</span><span class="atn">android:name</span><span class="pun">=</span><span class="atv">"apps.noby.simplefragment.ExampleFragment"</span><span class="pln">
	</span><span class="atn">android:id</span><span class="pun">=</span><span class="atv">"@+id/fragment_container"</span><span class="pln">
	</span><span class="atn">tools:layout</span><span class="pun">=</span><span class="atv">"@layout/fragment_example"</span><span class="pln"> </span><span class="tag">/&gt;</span></pre>

<p>
	هناك بعض الخصائص المشتركة في العناصر كتحديد الطول والعرض وهناك خصائص تميز العنصر ولابد من تحديدها مثل <span style="font-family:courier new,courier,monospace;">android:name</span> وتكمن أهميته في تحديد الصنف الذي سيُعرض داخل هذا العنصر ولن يعمل التطبيق بدون وضع قيمة لهذه الخاصية وهنا وضعنا اسم الصنف الذي صنعناه سابقًا مع وضع اسم الحزمة كاملًا قبله. ولابد أيضًا من تحديد <span style="font-family:courier new,courier,monospace;">id</span> مميز لهذا العنصر.
</p>

<p>
	وسنضع داخل ملف الواجهة الرئيسي نص قبل واجهة الـ Fragment ليصبح ملف الواجهة كالتالي:
</p>

<pre class="ipsCode prettyprint lang-xml prettyprinted" id="ips_uid_8987_16">
<span class="pun">&lt;?</span><span class="pln">xml version</span><span class="pun">=</span><span class="str">"1.0"</span><span class="pln"> encoding</span><span class="pun">=</span><span class="str">"utf-8"</span><span class="pun">?&gt;</span><span class="pln">
</span><span class="tag">&lt;LinearLayout</span><span class="pln"> </span><span class="atn">xmlns:android</span><span class="pun">=</span><span class="atv">"http://schemas.android.com/apk/res/android"</span><span class="pln">
	</span><span class="atn">xmlns:tools</span><span class="pun">=</span><span class="atv">"http://schemas.android.com/tools"</span><span class="pln">
	</span><span class="atn">android:layout_width</span><span class="pun">=</span><span class="atv">"match_parent"</span><span class="pln">
	</span><span class="atn">android:layout_height</span><span class="pun">=</span><span class="atv">"match_parent"</span><span class="pln">
	</span><span class="atn">android:orientation</span><span class="pun">=</span><span class="atv">"vertical"</span><span class="tag">&gt;</span><span class="pln">

	</span><span class="tag">&lt;TextView</span><span class="pln">
		</span><span class="atn">android:layout_width</span><span class="pun">=</span><span class="atv">"wrap_content"</span><span class="pln">
		</span><span class="atn">android:layout_height</span><span class="pun">=</span><span class="atv">"wrap_content"</span><span class="pln">
		</span><span class="atn">android:text</span><span class="pun">=</span><span class="atv">"Hello Main Activity!"</span><span class="pln">
		</span><span class="atn">android:layout_gravity</span><span class="pun">=</span><span class="atv">"center"</span><span class="pln">
		</span><span class="atn">android:textSize</span><span class="pun">=</span><span class="atv">"25sp"</span><span class="tag">/&gt;</span><span class="pln">

	</span><span class="tag">&lt;fragment</span><span class="pln">
		</span><span class="atn">android:layout_width</span><span class="pun">=</span><span class="atv">"match_parent"</span><span class="pln">
		</span><span class="atn">android:layout_height</span><span class="pun">=</span><span class="atv">"match_parent"</span><span class="pln">
		</span><span class="atn">android:name</span><span class="pun">=</span><span class="atv">"apps.noby.simplefragment.ExampleFragment"</span><span class="pln">
		</span><span class="atn">android:id</span><span class="pun">=</span><span class="atv">"@+id/fragment_container"</span><span class="pln">
		</span><span class="atn">tools:layout</span><span class="pun">=</span><span class="atv">"@layout/fragment_example"</span><span class="pln"> </span><span class="tag">/&gt;</span><span class="pln">
</span><span class="tag">&lt;/LinearLayout&gt;</span></pre>

<p>
	ولن نقوم بتغيير الشيفرة الخاصة بالنشاط الرئيسي وسندعها كما هي، الآن يمكننا تجربة التطبيق على المحاكي للتأكد من عمله كما ينبغي.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="19026" href="https://academy.hsoub.com/uploads/monthly_2016_09/8.png.2cb6cba371a435b385f1dea64bd13be3.png" rel=""><img alt="8.png" class="ipsImage ipsImage_thumbnailed" data-fileid="19026" data-unique="tp4kzufxp" src="https://academy.hsoub.com/uploads/monthly_2016_09/8.thumb.png.95ce95375695d3b93281b4e8e1c773f0.png"></a>
</p>

<p>
	وتُسمى هذه الطريقة بالطريقة الساكنة لتضمين الـ Fragment؛ وذلك لأننا لم نحتج إلى كتابة شيفرات داخل النشاط لوضع الـ Fragment بداخله.
</p>

<h2>
	تطبيق 2
</h2>

<p>
	في هذا التطبيق سنقوم بعرض أكثر من Fragment بداخل نشاط واحد عند توفر المساحة المناسبة له، أما إذا لم تتوفر فسيتم عرض Fragment واحد فقط.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="19027" href="https://academy.hsoub.com/uploads/monthly_2016_09/9.png.d268f74b7dbd323c2a7d4be197ea6b61.png" rel=""><img alt="9.png" class="ipsImage ipsImage_thumbnailed" data-fileid="19027" data-unique="5h2iji0m5" src="https://academy.hsoub.com/uploads/monthly_2016_09/9.thumb.png.2afbb8981da0b53bcc4e2ada24174b91.png"></a>
</p>

<p>
	سنقوم بتعديل على المثال السابق وعمل Fragment جديد يُدعى <span style="font-family:courier new,courier,monospace;">DetailsFragment</span> بنفس الطريقة السابقة ونجعل له الواجهة التالية:
</p>

<pre class="ipsCode prettyprint lang-xml prettyprinted" id="ips_uid_8987_18">
<span class="tag">&lt;LinearLayout</span><span class="pln"> </span><span class="atn">xmlns:android</span><span class="pun">=</span><span class="atv">"http://schemas.android.com/apk/res/android"</span><span class="pln">
	</span><span class="atn">android:layout_width</span><span class="pun">=</span><span class="atv">"match_parent"</span><span class="pln">
	</span><span class="atn">android:layout_height</span><span class="pun">=</span><span class="atv">"match_parent"</span><span class="pln">
	</span><span class="atn">android:background</span><span class="pun">=</span><span class="atv">"#ffc829"</span><span class="pln">
	</span><span class="atn">android:orientation</span><span class="pun">=</span><span class="atv">"vertical"</span><span class="tag">&gt;</span><span class="pln">

  </span><span class="tag">&lt;TextView</span><span class="pln">
		</span><span class="atn">android:layout_width</span><span class="pun">=</span><span class="atv">"match_parent"</span><span class="pln">
		</span><span class="atn">android:layout_height</span><span class="pun">=</span><span class="atv">"match_parent"</span><span class="pln">
		</span><span class="atn">android:text</span><span class="pun">=</span><span class="atv">"Hello From Details Fragment"</span><span class="pln">
		</span><span class="atn">android:gravity</span><span class="pun">=</span><span class="atv">"center"</span><span class="tag">/&gt;</span><span class="pln">
</span><span class="tag">&lt;/LinearLayout&gt;</span></pre>

<p>
	وتتشابه الواجهة السابقة مع واجهة الـ Fragment الآخر، بعد ذلك سنقوم بعمل ملف واجهة جديد يُدعى <span style="font-family:courier new,courier,monospace;">activity_main</span> ولكن سنختار أن يوضع في المجلد <span style="font-family:courier new,courier,monospace;">layout-large</span> كما في الصورة التالية:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="19028" href="https://academy.hsoub.com/uploads/monthly_2016_09/10.png.283616ee1a70f172c4aa82aeb7226631.png" rel=""><img alt="10.png" class="ipsImage ipsImage_thumbnailed" data-fileid="19028" data-unique="cei832o2p" src="https://academy.hsoub.com/uploads/monthly_2016_09/10.thumb.png.dc48982aed12bd18adfab1ff8be2b391.png"></a>
</p>

<p>
	وبداخل ملف الواجهة الجديد نضع مكان آخر للـ Fragment الجديد بجانب الأول.
</p>

<pre class="ipsCode prettyprint lang-xml prettyprinted" id="ips_uid_8987_20">
<span class="pun">&lt;?</span><span class="pln">xml version</span><span class="pun">=</span><span class="str">"1.0"</span><span class="pln"> encoding</span><span class="pun">=</span><span class="str">"utf-8"</span><span class="pun">?&gt;</span><span class="pln">
</span><span class="tag">&lt;LinearLayout</span><span class="pln"> </span><span class="atn">xmlns:android</span><span class="pun">=</span><span class="atv">"http://schemas.android.com/apk/res/android"</span><span class="pln">
	</span><span class="atn">xmlns:tools</span><span class="pun">=</span><span class="atv">"http://schemas.android.com/tools"</span><span class="pln">
	</span><span class="atn">android:layout_width</span><span class="pun">=</span><span class="atv">"match_parent"</span><span class="pln">
	</span><span class="atn">android:layout_height</span><span class="pun">=</span><span class="atv">"match_parent"</span><span class="pln">
	</span><span class="atn">android:orientation</span><span class="pun">=</span><span class="atv">"vertical"</span><span class="tag">&gt;</span><span class="pln">

	</span><span class="tag">&lt;TextView</span><span class="pln">
		</span><span class="atn">android:layout_width</span><span class="pun">=</span><span class="atv">"wrap_content"</span><span class="pln">
		</span><span class="atn">android:layout_height</span><span class="pun">=</span><span class="atv">"wrap_content"</span><span class="pln">
		</span><span class="atn">android:text</span><span class="pun">=</span><span class="atv">"Hello Main Activity!"</span><span class="pln">
		</span><span class="atn">android:layout_gravity</span><span class="pun">=</span><span class="atv">"center"</span><span class="pln">
		</span><span class="atn">android:textSize</span><span class="pun">=</span><span class="atv">"25sp"</span><span class="tag">/&gt;</span><span class="pln">

	</span><span class="tag">&lt;LinearLayout</span><span class="pln">
		</span><span class="atn">android:layout_width</span><span class="pun">=</span><span class="atv">"match_parent"</span><span class="pln">
		</span><span class="atn">android:layout_height</span><span class="pun">=</span><span class="atv">"match_parent"</span><span class="pln">
		</span><span class="atn">android:orientation</span><span class="pun">=</span><span class="atv">"horizontal"</span><span class="tag">&gt;</span><span class="pln">

		</span><span class="tag">&lt;fragment</span><span class="pln">
			</span><span class="atn">android:layout_width</span><span class="pun">=</span><span class="atv">"0dp"</span><span class="pln">
			</span><span class="atn">android:layout_height</span><span class="pun">=</span><span class="atv">"match_parent"</span><span class="pln">
			</span><span class="atn">android:layout_weight</span><span class="pun">=</span><span class="atv">"1"</span><span class="pln">
			</span><span class="atn">android:name</span><span class="pun">=</span><span class="atv">"apps.noby.simplefragment.ExampleFragment"</span><span class="pln">
			</span><span class="atn">android:id</span><span class="pun">=</span><span class="atv">"@+id/fragment_container"</span><span class="pln">
			</span><span class="atn">tools:layout</span><span class="pun">=</span><span class="atv">"@layout/fragment_example"</span><span class="pln"> </span><span class="tag">/&gt;</span><span class="pln">

		</span><span class="tag">&lt;fragment</span><span class="pln">
			</span><span class="atn">android:layout_width</span><span class="pun">=</span><span class="atv">"0dp"</span><span class="pln">
			</span><span class="atn">android:layout_height</span><span class="pun">=</span><span class="atv">"match_parent"</span><span class="pln">
			</span><span class="atn">android:layout_weight</span><span class="pun">=</span><span class="atv">"1"</span><span class="pln">
			</span><span class="atn">android:name</span><span class="pun">=</span><span class="atv">"apps.noby.simplefragment.DetailsFragment"</span><span class="pln">
			</span><span class="atn">android:id</span><span class="pun">=</span><span class="atv">"@+id/fragment_details"</span><span class="pln">
			</span><span class="atn">tools:layout</span><span class="pun">=</span><span class="atv">"@layout/fragment_details"</span><span class="pln"> </span><span class="tag">/&gt;</span><span class="pln">

	</span><span class="tag">&lt;/LinearLayout&gt;</span><span class="pln">
</span><span class="tag">&lt;/LinearLayout&gt;</span></pre>

<p>
	ووضع القيم الخاصة بالخاصيتين <span style="font-family:courier new,courier,monospace;">name</span> و <span style="font-family:courier new,courier,monospace;">id</span>، والشيفرة الخاصة بملف جافا الخاص بـ <span style="font-family:courier new,courier,monospace;">DetailsFragment</span> يتشابه مع <span style="font-family:courier new,courier,monospace;">ExampleFragment</span>.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_971_7">
<span class="pln">package apps</span><span class="pun">.</span><span class="pln">noby</span><span class="pun">.</span><span class="pln">simplefragment</span><span class="pun">;</span><span class="pln">


</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">os</span><span class="pun">.</span><span class="typ">Bundle</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">app</span><span class="pun">.</span><span class="typ">Fragment</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">view</span><span class="pun">.</span><span class="typ">LayoutInflater</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">view</span><span class="pun">.</span><span class="typ">View</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">view</span><span class="pun">.</span><span class="typ">ViewGroup</span><span class="pun">;</span><span class="pln">


</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">DetailsFragment</span><span class="pln"> extends </span><span class="typ">Fragment</span><span class="pln"> </span><span class="pun">{</span><span class="pln">

	</span><span class="lit">@Override</span><span class="pln">
	</span><span class="kwd">public</span><span class="pln"> </span><span class="typ">View</span><span class="pln"> onCreateView</span><span class="pun">(</span><span class="typ">LayoutInflater</span><span class="pln"> inflater</span><span class="pun">,</span><span class="pln"> </span><span class="typ">ViewGroup</span><span class="pln"> container</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Bundle</span><span class="pln"> savedInstanceState</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">

		</span><span class="typ">View</span><span class="pln"> rootView </span><span class="pun">=</span><span class="pln"> inflater</span><span class="pun">.</span><span class="pln">inflate</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">layout</span><span class="pun">.</span><span class="pln">fragment_details</span><span class="pun">,</span><span class="pln">container</span><span class="pun">,</span><span class="kwd">false</span><span class="pun">);</span><span class="pln">
		</span><span class="kwd">return</span><span class="pln"> rootView</span><span class="pun">;</span><span class="pln">
	</span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	نستطيع الآن تجربة التطبيق بعد إجراء هذا التعديل على محاكي للهاتف وآخر للجهاز اللوحي -إذا لم تكن صنعت محاكيًا للحاسب اللوحي فينبغي أن تصنع واحدًا قبل التجربة-.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="19029" href="https://academy.hsoub.com/uploads/monthly_2016_09/11.png.695948e7e37f57ce94b8e4228993d424.png" rel=""><img alt="11.png" class="ipsImage ipsImage_thumbnailed" data-fileid="19029" data-unique="w53mnvmme" src="https://academy.hsoub.com/uploads/monthly_2016_09/11.thumb.png.a6b913798eaaa7398c9b4e9899ef92bf.png"></a>
</p>

<p>
	بناءً على الحجم الخاص بشاشة الجهاز يقوم التطبيق باستدعاء ملف الواجهة الخاص بالنشاط المناسب (العادي أو الكبير).
</p>

<p>
	لاحظ أنه يجب أن يكون بجانب اسم المجلد <span style="font-family:courier new,courier,monospace;">layout</span> كلمة <span style="font-family:courier new,courier,monospace;">large</span> حتى يعلم التطبيق بوجود ملفات خاصة بالشاشات ذات الحجم الكبير.
</p>

<h2>
	تطبيق 3
</h2>

<p>
	في هذا التطبيق سنقوم بتغيير طريقة تضمين الـ Fragment من الطريقة الساكنة إلى الديناميكية أي إمكانية إضافة، تبديل حذف الـ Fragment أثناء تشغيل التطبيق والتحكم به عن طريق الشيفرة.
</p>

<p>
	وللقيام بذلك سنستبدل عنصر الواجهة <span style="font-family:courier new,courier,monospace;">&lt;fragment&gt;</span> بالعنصر <span style="font-family:courier new,courier,monospace;">&lt;FrameLayout&gt;</span> والذي يقوم بحجز مساحة فارغة في الواجهة سيتم تحديد فيما بعد ما الذي سيشغلها.
</p>

<p>
	كل ما سيختلف في هذا التطبيق ملفات الواجهة الرئيسية الخاصة بالنشاط المضيف فقط ولن يحدث تغيير في الواجهة الخاصة بالـ Fragment.
</p>

<pre class="ipsCode prettyprint lang-xml prettyprinted" id="ips_uid_971_9">
<span class="pun">&lt;?</span><span class="pln">xml version</span><span class="pun">=</span><span class="str">"1.0"</span><span class="pln"> encoding</span><span class="pun">=</span><span class="str">"utf-8"</span><span class="pun">?&gt;</span><span class="pln">
</span><span class="tag">&lt;LinearLayout</span><span class="pln"> </span><span class="atn">xmlns:android</span><span class="pun">=</span><span class="atv">"http://schemas.android.com/apk/res/android"</span><span class="pln">
	</span><span class="atn">android:layout_width</span><span class="pun">=</span><span class="atv">"match_parent"</span><span class="pln">
	</span><span class="atn">android:layout_height</span><span class="pun">=</span><span class="atv">"match_parent"</span><span class="pln">
	</span><span class="atn">android:orientation</span><span class="pun">=</span><span class="atv">"vertical"</span><span class="tag">&gt;</span><span class="pln">

	</span><span class="tag">&lt;TextView</span><span class="pln">
		</span><span class="atn">android:layout_width</span><span class="pun">=</span><span class="atv">"wrap_content"</span><span class="pln">
		</span><span class="atn">android:layout_height</span><span class="pun">=</span><span class="atv">"wrap_content"</span><span class="pln">
		</span><span class="atn">android:text</span><span class="pun">=</span><span class="atv">"Hello Main Activity!"</span><span class="pln">
		</span><span class="atn">android:layout_gravity</span><span class="pun">=</span><span class="atv">"center"</span><span class="pln">
		</span><span class="atn">android:textSize</span><span class="pun">=</span><span class="atv">"25sp"</span><span class="tag">/&gt;</span><span class="pln">

	</span><span class="tag">&lt;FrameLayout</span><span class="pln">
		</span><span class="atn">android:layout_width</span><span class="pun">=</span><span class="atv">"match_parent"</span><span class="pln">
		</span><span class="atn">android:layout_height</span><span class="pun">=</span><span class="atv">"match_parent"</span><span class="pln">
		</span><span class="atn">android:id</span><span class="pun">=</span><span class="atv">"@+id/view_container"</span><span class="pln"> </span><span class="tag">/&gt;</span><span class="pln">
</span><span class="tag">&lt;/LinearLayout&gt;</span></pre>

<p>
	ولتحديد المحتوى الخاص بالعنصر <span style="font-family:courier new,courier,monospace;">FrameLayout</span> ننتقل إلى ملف النشاط <span style="font-family:courier new,courier,monospace;">MainActivity.java</span> لتعديله، الآن لإضافة Fragment جديد داخل الواجهة ينبغي أن نمر بثلاث خطوات
</p>

<p>
	1. إيجاد كائن من الصنف <span style="font-family:courier new,courier,monospace;">FragmentManger</span> والذي يستطيع إدارة كافة المهام الخاصة بالتعامل مع الـ Fragments ومن ضمن هذه المهام هي إضافة الـ Framgments ولجلب كائن من هذا الصنف نستدعى التابع <span style="font-family:courier new,courier,monospace;">()getFragmentManager </span>حيث يوجد كائن بالفعل داخل النشاط ويكتفي استدعاءه فقط.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_971_12">
<span class="typ">FragmentManager</span><span class="pln"> fragmentManager </span><span class="pun">=</span><span class="pln"> getFragmentManager</span><span class="pun">();</span></pre>

<p>
	2. للتحكم في المهام الخاصة بإضافة أو تبديل او إزالة الـ Fragments نحتاج إلى كائن من الصنف <span style="font-family:courier new,courier,monospace;">FragmentTransaction</span> والذي يحتوي على التوابع التي تقوم بعملية الإضافة تلك.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_971_14">
<span class="typ">FragmentTransaction</span><span class="pln"> fragmentTransaction </span><span class="pun">=</span><span class="pln"> fragmentManager</span><span class="pun">.</span><span class="pln">beginTransaction</span><span class="pun">();</span></pre>

<p>
	3. أخيرًا نستطيع استدعاء التابع المناسب للعملية وتمرير له المعاملات الصحيحة.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_971_16">
<span class="typ">ExampleFragment</span><span class="pln"> frag </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">ExampleFragment</span><span class="pun">();</span><span class="pln">
fragmentTransaction</span><span class="pun">.</span><span class="pln">add</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">id</span><span class="pun">.</span><span class="pln">view_container</span><span class="pun">,</span><span class="pln"> frag</span><span class="pun">);</span><span class="pln">
fragmentTransaction</span><span class="pun">.</span><span class="pln">commit</span><span class="pun">();</span></pre>

<p>
	يستطيع التابع <span style="font-family:courier new,courier,monospace;">()add</span> من إضافة Fragment إلى الواجهة التي سيُعرض بها، وتلك هي المعاملات التي نمررها له:
</p>

<ul>
<li>
		الـ <span style="font-family:courier new,courier,monospace;">id</span> الخاص بعنصر الواجهة.
	</li>
	<li>
		كائن من الـ Fragment الذي نرغب في عرضه بداخل عنصر الواجهة.
	</li>
</ul>
<p>
	وبعد ذلك نستدعي التابع<span style="font-family:courier new,courier,monospace;"> ()commit</span> لتنفيذ العملية السابقة، حيث لن يتم تنفيذها إلا بعد استدعاءه.
</p>

<p>
	لتصبح الشيفرة الكاملة للنشاط كما يلي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_971_18">
<span class="pln">package apps</span><span class="pun">.</span><span class="pln">noby</span><span class="pun">.</span><span class="pln">simplefragment</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">app</span><span class="pun">.</span><span class="typ">Activity</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">app</span><span class="pun">.</span><span class="typ">FragmentManager</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">app</span><span class="pun">.</span><span class="typ">FragmentTransaction</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">support</span><span class="pun">.</span><span class="pln">v7</span><span class="pun">.</span><span class="pln">app</span><span class="pun">.</span><span class="typ">AppCompatActivity</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">os</span><span class="pun">.</span><span class="typ">Bundle</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">MainActivity</span><span class="pln"> extends </span><span class="typ">Activity</span><span class="pln"> </span><span class="pun">{</span><span class="pln">

	</span><span class="lit">@Override</span><span class="pln">
	</span><span class="kwd">protected</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> onCreate</span><span class="pun">(</span><span class="typ">Bundle</span><span class="pln"> savedInstanceState</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
		super</span><span class="pun">.</span><span class="pln">onCreate</span><span class="pun">(</span><span class="pln">savedInstanceState</span><span class="pun">);</span><span class="pln">
		setContentView</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">layout</span><span class="pun">.</span><span class="pln">activity_main</span><span class="pun">);</span><span class="pln">

		</span><span class="kwd">if</span><span class="pun">(</span><span class="pln">findViewById</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">id</span><span class="pun">.</span><span class="pln">view_container</span><span class="pun">)</span><span class="pln"> </span><span class="pun">!=</span><span class="pln"> </span><span class="kwd">null</span><span class="pun">){</span><span class="pln">
			</span><span class="typ">FragmentManager</span><span class="pln"> fragmentManager </span><span class="pun">=</span><span class="pln"> getFragmentManager</span><span class="pun">();</span><span class="pln">
			</span><span class="typ">FragmentTransaction</span><span class="pln"> fragmentTransaction </span><span class="pun">=</span><span class="pln"> fragmentManager</span><span class="pun">.</span><span class="pln">beginTransaction</span><span class="pun">();</span><span class="pln">
			</span><span class="typ">ExampleFragment</span><span class="pln"> frag </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">ExampleFragment</span><span class="pun">();</span><span class="pln">
			fragmentTransaction</span><span class="pun">.</span><span class="pln">add</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">id</span><span class="pun">.</span><span class="pln">view_container</span><span class="pun">,</span><span class="pln"> frag</span><span class="pun">);</span><span class="pln">
			fragmentTransaction</span><span class="pun">.</span><span class="pln">commit</span><span class="pun">();</span><span class="pln">
		</span><span class="pun">}</span><span class="pln">
	</span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	وفائدة الجملة الشرطية هو التأكد من أننا نتعامل مع ملف الواجهة <span style="font-family:courier new,courier,monospace;">activity_main.xml</span> الخاص بالهواتف والذي يحتوي بداخله على عنصر له <span style="font-family:courier new,courier,monospace;">id</span> قيمته <span style="font-family:courier new,courier,monospace;">view_container</span>، وليس ملف الواجهة الآخر الخاص بالشاشات كبيرة الحجم حيث لا يحتوي على عنصر له ذلك الـ <span style="font-family:courier new,courier,monospace;">id</span>.
</p>

<p>
	والآن بتجربة التطبيق على كلا المحاكيين -الهاتف والحاسب اللوحي- نجد أنه يعمل كالتطبيقات السابقة.
</p>

<h2>
	تطبيق 4
</h2>

<p>
	في التطبيقات السابقة لم نتمكن من عرض الـ Fragment الآخر في حالة الهاتف وذلك لأن التبديل بين Fragment وآخر لا تتم إلا داخل النشاط المضيف، لذا ينبغي أن نجعل الشيفرة الخاصة بالـ Fragment قادرة على التحدث مع النشاط المضيف لها وتنفيذ شيفرات بداخله. ويمكننا القيام بذلك باستخدام <span style="font-family:courier new,courier,monospace;">interface</span> كحلقة وصل بين النشاط المضيف والـ Fragment.
</p>

<p>
	نضع أولًا زر في الواجهة الخاصة بـ <span style="font-family:courier new,courier,monospace;">fragment_example.xml</span> عند الضغط عليه ننتقل إلى الـ <span style="font-family:courier new,courier,monospace;">fragment_details </span>كالآتي.
</p>

<pre class="ipsCode prettyprint lang-xml prettyprinted" id="ips_uid_971_20">
<span class="tag">&lt;LinearLayout</span><span class="pln"> </span><span class="atn">xmlns:android</span><span class="pun">=</span><span class="atv">"http://schemas.android.com/apk/res/android"</span><span class="pln">
	</span><span class="atn">android:layout_width</span><span class="pun">=</span><span class="atv">"match_parent"</span><span class="pln">
	</span><span class="atn">android:layout_height</span><span class="pun">=</span><span class="atv">"match_parent"</span><span class="pln">
	</span><span class="atn">android:background</span><span class="pun">=</span><span class="atv">"#ccefff"</span><span class="pln">
	</span><span class="atn">android:orientation</span><span class="pun">=</span><span class="atv">"vertical"</span><span class="pln">
	</span><span class="atn">android:gravity</span><span class="pun">=</span><span class="atv">"center"</span><span class="tag">&gt;</span><span class="pln">

	</span><span class="tag">&lt;TextView</span><span class="pln">
		</span><span class="atn">android:layout_width</span><span class="pun">=</span><span class="atv">"wrap_content"</span><span class="pln">
		</span><span class="atn">android:layout_height</span><span class="pun">=</span><span class="atv">"wrap_content"</span><span class="pln">
		</span><span class="atn">android:text</span><span class="pun">=</span><span class="atv">"Hello From Example Fragment"</span><span class="tag">/&gt;</span><span class="pln">

	</span><span class="tag">&lt;Button</span><span class="pln">
		</span><span class="atn">android:layout_width</span><span class="pun">=</span><span class="atv">"wrap_content"</span><span class="pln">
		</span><span class="atn">android:layout_height</span><span class="pun">=</span><span class="atv">"wrap_content"</span><span class="pln">
		</span><span class="atn">android:text</span><span class="pun">=</span><span class="atv">"Go to Details Frafment"</span><span class="pln">
		</span><span class="atn">android:id</span><span class="pun">=</span><span class="atv">"@+id/go_to_btn"</span><span class="tag">/&gt;</span><span class="pln">

</span><span class="tag">&lt;/LinearLayout&gt;</span></pre>

<p>
	ثم ننتقل إلى الشيفرة الخاصة بـ <span style="font-family:courier new,courier,monospace;">ExampleFragment.java</span> وبداخلها نقوم بصنع <span style="font-family:courier new,courier,monospace;">interface</span> جديد يُدعى <span style="font-family:courier new,courier,monospace;">OnBtnClicked</span> وبداخله التابع <span style="font-family:courier new,courier,monospace;">()goToFragment</span>.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_971_22">
<span class="kwd">public</span><span class="pln"> interface </span><span class="typ">OnBtnClicked</span><span class="pun">{</span><span class="pln">
	</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> goToFragment</span><span class="pun">();</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	ثم نجعل الصنف الخاص بالنشاط المضيف يقوم باستخدام هذا الـ interface.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_971_24">
<span class="kwd">public</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">MainActivity</span><span class="pln"> extends </span><span class="typ">Activity</span><span class="pln"> implements </span><span class="typ">ExampleFragment</span><span class="pun">.</span><span class="typ">OnBtnClicked</span></pre>

<p>
	نعود مجددًا للشيفرة الخاصة بـ <span style="font-family:courier new,courier,monospace;">ExampleFragmen.java </span>ونقوم بكتابة التابع <span style="font-family:courier new,courier,monospace;">()onAttach</span> الخاص بدورة الحياة للـ Fragment كالتالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_971_26">
<span class="kwd">private</span><span class="pln"> </span><span class="typ">MainActivity</span><span class="pln"> mContext</span><span class="pun">;</span><span class="pln">

</span><span class="lit">@Override</span><span class="pln">
</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> onAttach</span><span class="pun">(</span><span class="typ">Context</span><span class="pln"> context</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
	super</span><span class="pun">.</span><span class="pln">onAttach</span><span class="pun">(</span><span class="pln">context</span><span class="pun">);</span><span class="pln">
	mContext </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="typ">MainActivity</span><span class="pun">)</span><span class="pln"> context</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	ووظيفة الشيفرة السابقة جعل الشيفرة الخاصة بالـ Fragment تستطيع التواصل مع النشاط المضيف باستخدام كائن منه يُمرر لحظة ربط الـ fragment بالنشاط المضيف.
</p>

<p>
	ثم بعد ذلك لربط الزر الذي قمنا بإضافته في الواجهة بالشيفرة نستخدم التابع <span style="font-family:courier new,courier,monospace;">()findViewById </span>ولكن هذه المرة باستخدام الكائن <span style="font-family:courier new,courier,monospace;">rootView</span> وذلك لأنه يُعبر عن الواجهة فلا يمكننا من استدعاء التابع مباشرة كما كان داخل النشاط.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_971_28">
<span class="lit">@Override</span><span class="pln">
</span><span class="kwd">public</span><span class="pln"> </span><span class="typ">View</span><span class="pln"> onCreateView</span><span class="pun">(</span><span class="typ">LayoutInflater</span><span class="pln"> inflater</span><span class="pun">,</span><span class="pln"> </span><span class="typ">ViewGroup</span><span class="pln"> container</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Bundle</span><span class="pln"> savedInstanceState</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">

	</span><span class="typ">View</span><span class="pln"> rootView </span><span class="pun">=</span><span class="pln">inflater</span><span class="pun">.</span><span class="pln">inflate</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">layout</span><span class="pun">.</span><span class="pln">fragment_example</span><span class="pun">,</span><span class="pln"> container</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">);</span><span class="pln">

	</span><span class="typ">Button</span><span class="pln"> btn </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="typ">Button</span><span class="pun">)</span><span class="pln">rootView</span><span class="pun">.</span><span class="pln">findViewById</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">id</span><span class="pun">.</span><span class="pln">go_to_btn</span><span class="pun">);</span><span class="pln">

	btn</span><span class="pun">.</span><span class="pln">setOnClickListener</span><span class="pun">(</span><span class="kwd">new</span><span class="pln"> </span><span class="typ">View</span><span class="pun">.</span><span class="typ">OnClickListener</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
		</span><span class="lit">@Override</span><span class="pln">
		</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> onClick</span><span class="pun">(</span><span class="typ">View</span><span class="pln"> v</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
			mContext</span><span class="pun">.</span><span class="pln">goToFragment</span><span class="pun">();</span><span class="pln">
		</span><span class="pun">}</span><span class="pln">
	</span><span class="pun">});</span><span class="pln">

	</span><span class="kwd">return</span><span class="pln"> rootView</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	ونجعل الزر مستعدًا للاستجابة عند الضغط عليه على أن يقوم باستدعاء التابع <span style="font-family:courier new,courier,monospace;">()goToFragment</span> باستخدام الكائن الخاص بالنشاط المضيف. لتصبح الشيفرة النهائية لهذا الـ Fragment كالتالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_971_30">
<span class="pln">package apps</span><span class="pun">.</span><span class="pln">noby</span><span class="pun">.</span><span class="pln">simplefragment</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">content</span><span class="pun">.</span><span class="typ">Context</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">os</span><span class="pun">.</span><span class="typ">Bundle</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">app</span><span class="pun">.</span><span class="typ">Fragment</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">view</span><span class="pun">.</span><span class="typ">LayoutInflater</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">view</span><span class="pun">.</span><span class="typ">View</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">view</span><span class="pun">.</span><span class="typ">ViewGroup</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">widget</span><span class="pun">.</span><span class="typ">Button</span><span class="pun">;</span><span class="pln">


</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">ExampleFragment</span><span class="pln"> extends </span><span class="typ">Fragment</span><span class="pln"> </span><span class="pun">{</span><span class="pln">

	</span><span class="kwd">private</span><span class="pln"> </span><span class="typ">MainActivity</span><span class="pln"> mContext</span><span class="pun">;</span><span class="pln">
  
	</span><span class="lit">@Override</span><span class="pln">
	</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> onAttach</span><span class="pun">(</span><span class="typ">Context</span><span class="pln"> context</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
		super</span><span class="pun">.</span><span class="pln">onAttach</span><span class="pun">(</span><span class="pln">context</span><span class="pun">);</span><span class="pln">
		mContext </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="typ">MainActivity</span><span class="pun">)</span><span class="pln"> context</span><span class="pun">;</span><span class="pln">
	</span><span class="pun">}</span><span class="pln">

	</span><span class="lit">@Override</span><span class="pln">
	</span><span class="kwd">public</span><span class="pln"> </span><span class="typ">View</span><span class="pln"> onCreateView</span><span class="pun">(</span><span class="typ">LayoutInflater</span><span class="pln"> inflater</span><span class="pun">,</span><span class="pln"> </span><span class="typ">ViewGroup</span><span class="pln"> container</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Bundle</span><span class="pln"> savedInstanceState</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">

		</span><span class="typ">View</span><span class="pln"> rootView </span><span class="pun">=</span><span class="pln">inflater</span><span class="pun">.</span><span class="pln">inflate</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">layout</span><span class="pun">.</span><span class="pln">fragment_example</span><span class="pun">,</span><span class="pln"> container</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">);</span><span class="pln">

		</span><span class="typ">Button</span><span class="pln"> btn </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="typ">Button</span><span class="pun">)</span><span class="pln">rootView</span><span class="pun">.</span><span class="pln">findViewById</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">id</span><span class="pun">.</span><span class="pln">go_to_btn</span><span class="pun">);</span><span class="pln">

		btn</span><span class="pun">.</span><span class="pln">setOnClickListener</span><span class="pun">(</span><span class="kwd">new</span><span class="pln"> </span><span class="typ">View</span><span class="pun">.</span><span class="typ">OnClickListener</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
			</span><span class="lit">@Override</span><span class="pln">
			</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> onClick</span><span class="pun">(</span><span class="typ">View</span><span class="pln"> v</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
				mContext</span><span class="pun">.</span><span class="pln">goToFragment</span><span class="pun">();</span><span class="pln">
			</span><span class="pun">}</span><span class="pln">
		</span><span class="pun">});</span><span class="pln">
		</span><span class="kwd">return</span><span class="pln"> rootView</span><span class="pun">;</span><span class="pln">
	</span><span class="pun">}</span><span class="pln">

	</span><span class="kwd">public</span><span class="pln"> interface </span><span class="typ">OnBtnClicked</span><span class="pun">{</span><span class="pln">

		</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> goToFragment</span><span class="pun">();</span><span class="pln">
	</span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	يتبقى فقط إضافة الوظيفة التي نريدها عن الضغط على هذا الزر وذلك بكتابة الشيفرة الخاصة بالتابع <span style="font-family:courier new,courier,monospace;">()goToFragment</span> داخل النشاط المضيف.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_8457_7">
<span class="pln">package apps</span><span class="pun">.</span><span class="pln">noby</span><span class="pun">.</span><span class="pln">simplefragment</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">app</span><span class="pun">.</span><span class="typ">Activity</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">app</span><span class="pun">.</span><span class="typ">FragmentManager</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">app</span><span class="pun">.</span><span class="typ">FragmentTransaction</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">support</span><span class="pun">.</span><span class="pln">v7</span><span class="pun">.</span><span class="pln">app</span><span class="pun">.</span><span class="typ">AppCompatActivity</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">os</span><span class="pun">.</span><span class="typ">Bundle</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">MainActivity</span><span class="pln"> extends </span><span class="typ">Activity</span><span class="pln"> implements </span><span class="typ">ExampleFragment</span><span class="pun">.</span><span class="typ">OnBtnClicked</span><span class="pln"> </span><span class="pun">{</span><span class="pln">

	</span><span class="lit">@Override</span><span class="pln">
	</span><span class="kwd">protected</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> onCreate</span><span class="pun">(</span><span class="typ">Bundle</span><span class="pln"> savedInstanceState</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
		super</span><span class="pun">.</span><span class="pln">onCreate</span><span class="pun">(</span><span class="pln">savedInstanceState</span><span class="pun">);</span><span class="pln">
		setContentView</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">layout</span><span class="pun">.</span><span class="pln">activity_main</span><span class="pun">);</span><span class="pln">

		</span><span class="kwd">if</span><span class="pun">(</span><span class="pln">findViewById</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">id</span><span class="pun">.</span><span class="pln">view_container</span><span class="pun">)</span><span class="pln"> </span><span class="pun">!=</span><span class="pln"> </span><span class="kwd">null</span><span class="pun">){</span><span class="pln">
			</span><span class="typ">FragmentManager</span><span class="pln"> fragmentManager </span><span class="pun">=</span><span class="pln"> getFragmentManager</span><span class="pun">();</span><span class="pln">
			</span><span class="typ">FragmentTransaction</span><span class="pln"> fragmentTransaction </span><span class="pun">=</span><span class="pln"> fragmentManager</span><span class="pun">.</span><span class="pln">beginTransaction</span><span class="pun">();</span><span class="pln">
			</span><span class="typ">ExampleFragment</span><span class="pln"> frag </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">ExampleFragment</span><span class="pun">();</span><span class="pln">
			fragmentTransaction</span><span class="pun">.</span><span class="pln">add</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">id</span><span class="pun">.</span><span class="pln">view_container</span><span class="pun">,</span><span class="pln"> frag</span><span class="pun">);</span><span class="pln">
			fragmentTransaction</span><span class="pun">.</span><span class="pln">commit</span><span class="pun">();</span><span class="pln">
		</span><span class="pun">}</span><span class="pln">
	</span><span class="pun">}</span><span class="pln">

	</span><span class="lit">@Override</span><span class="pln">
	</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> goToFragment</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
		</span><span class="kwd">if</span><span class="pun">(</span><span class="pln">findViewById</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">id</span><span class="pun">.</span><span class="pln">view_container</span><span class="pun">)</span><span class="pln"> </span><span class="pun">!=</span><span class="pln"> </span><span class="kwd">null</span><span class="pun">){</span><span class="pln">
			</span><span class="typ">FragmentManager</span><span class="pln"> fragmentManager </span><span class="pun">=</span><span class="pln"> getFragmentManager</span><span class="pun">();</span><span class="pln">
			</span><span class="typ">FragmentTransaction</span><span class="pln"> fragmentTransaction </span><span class="pun">=</span><span class="pln"> fragmentManager</span><span class="pun">.</span><span class="pln">beginTransaction</span><span class="pun">();</span><span class="pln">
			</span><span class="typ">DetailsFragment</span><span class="pln"> frag </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">DetailsFragment</span><span class="pun">();</span><span class="pln">
			fragmentTransaction</span><span class="pun">.</span><span class="pln">replace</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">id</span><span class="pun">.</span><span class="pln">view_container</span><span class="pun">,</span><span class="pln"> frag</span><span class="pun">);</span><span class="pln">
			fragmentTransaction</span><span class="pun">.</span><span class="pln">addToBackStack</span><span class="pun">(</span><span class="kwd">null</span><span class="pun">);</span><span class="pln">
			fragmentTransaction</span><span class="pun">.</span><span class="pln">commit</span><span class="pun">();</span><span class="pln">
		</span><span class="pun">}</span><span class="pln">
	</span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	وتتشابه الشيفرة داخل التابع <span style="font-family:courier new,courier,monospace;">()goToFragment </span>مع الأخرى المتواجدة داخل <span style="font-family:courier new,courier,monospace;">()onCreate</span> ولكننا نستخدم التابع <span style="font-family:courier new,courier,monospace;">()replace</span> بدلًا من<span style="font-family:courier new,courier,monospace;"> ()add</span> وذلك لتبديل الواجهات داخل نفس العنصر <span style="font-family:courier new,courier,monospace;">FrameLayout</span> بشكل ديناميكي، كما نستدعي التابع <span style="font-family:courier new,courier,monospace;">()addToBackStack </span>وذلك حتى نضيف واجهة الـ Fragment السابق في الذاكرة الخاصة بزر الرجوع حتى نعود إليها عند الضغط على زر الرجوع وإلا سيتم غلق التطبيق.
</p>

<p>
	وتوضح الصورة التالية ما المقصود بذلك:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="19030" href="https://academy.hsoub.com/uploads/monthly_2016_09/12.png.0da19af12010203ae0f8c07498e30938.png" rel=""><img alt="12.png" class="ipsImage ipsImage_thumbnailed" data-fileid="19030" data-unique="8ucvufjav" src="https://academy.hsoub.com/uploads/monthly_2016_09/12.thumb.png.a1a66f61380959331a8f2060c715185e.png"></a>
</p>

<p>
	والآن عند تجربة التطبيق على المحاكي (الهاتف أو الحاسب اللوحي) نجد أننا نستطيع الوصول إلى الـ <span style="font-family:courier new,courier,monospace;">DetailsFragment</span> عند الضغط على الزر.
</p>

<h2>
	تطبيق 5
</h2>

<p>
	في التطبيق التالي سنقوم بإرسال نص من Fragment إلى آخر للتحدث فيما بينهما.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="19031" href="https://academy.hsoub.com/uploads/monthly_2016_09/13.png.6ffcaa8b713e4469472963e64c17437d.png" rel=""><img alt="13.png" class="ipsImage ipsImage_thumbnailed" data-fileid="19031" data-unique="b6zxrzewc" src="https://academy.hsoub.com/uploads/monthly_2016_09/13.thumb.png.9b62594ba5ed219936a14e11eb0b31d2.png"></a>
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="19032" href="https://academy.hsoub.com/uploads/monthly_2016_09/14.png.232788e4fac235350a388d13297cad34.png" rel=""><img alt="14.png" class="ipsImage ipsImage_thumbnailed" data-fileid="19032" data-unique="u9y7ogm37" src="https://academy.hsoub.com/uploads/monthly_2016_09/14.thumb.png.e5fb87b2d69a573c751159af4a370bb6.png"></a>
</p>

<p>
	ويتم ذلك عن طريق استخدام التابع <span style="font-family:courier new,courier,monospace;">()setArguments</span> وللقيام بذلك نقوم بتلك التعديلات على التطبيق السابق.
</p>

<p>
	في ملف الواجهة <span style="font-family:courier new,courier,monospace;">fragment_example.xml </span>نضيف عنصر <span style="font-family:courier new,courier,monospace;">EditText</span> بالخصائص الآتية.
</p>

<pre class="ipsCode prettyprint lang-xml prettyprinted" id="ips_uid_8457_9">
<span class="tag">&lt;LinearLayout</span><span class="pln"> </span><span class="atn">xmlns:android</span><span class="pun">=</span><span class="atv">"http://schemas.android.com/apk/res/android"</span><span class="pln">
	</span><span class="atn">android:layout_width</span><span class="pun">=</span><span class="atv">"match_parent"</span><span class="pln">
	</span><span class="atn">android:layout_height</span><span class="pun">=</span><span class="atv">"match_parent"</span><span class="pln">
	</span><span class="atn">android:background</span><span class="pun">=</span><span class="atv">"#ccefff"</span><span class="pln">
	</span><span class="atn">android:orientation</span><span class="pun">=</span><span class="atv">"vertical"</span><span class="pln">
	</span><span class="atn">android:gravity</span><span class="pun">=</span><span class="atv">"center"</span><span class="tag">&gt;</span><span class="pln">

	</span><span class="tag">&lt;TextView</span><span class="pln">
		</span><span class="atn">android:layout_width</span><span class="pun">=</span><span class="atv">"wrap_content"</span><span class="pln">
		</span><span class="atn">android:layout_height</span><span class="pun">=</span><span class="atv">"wrap_content"</span><span class="pln">
		</span><span class="atn">android:text</span><span class="pun">=</span><span class="atv">"Hello From Example Fragment"</span><span class="tag">/&gt;</span><span class="pln">

	</span><span class="tag">&lt;EditText</span><span class="pln">
		</span><span class="atn">android:layout_width</span><span class="pun">=</span><span class="atv">"wrap_content"</span><span class="pln">
		</span><span class="atn">android:layout_height</span><span class="pun">=</span><span class="atv">"wrap_content"</span><span class="pln">
		</span><span class="atn">android:hint</span><span class="pun">=</span><span class="atv">"Enter Your Name"</span><span class="pln">
		</span><span class="atn">android:id</span><span class="pun">=</span><span class="atv">"@+id/edit_txt"</span><span class="tag">/&gt;</span><span class="pln">

	</span><span class="tag">&lt;Button</span><span class="pln">
		</span><span class="atn">android:layout_width</span><span class="pun">=</span><span class="atv">"wrap_content"</span><span class="pln">
		</span><span class="atn">android:layout_height</span><span class="pun">=</span><span class="atv">"wrap_content"</span><span class="pln">
		</span><span class="atn">android:text</span><span class="pun">=</span><span class="atv">"Go to Details Frafment"</span><span class="pln">
		</span><span class="atn">android:id</span><span class="pun">=</span><span class="atv">"@+id/go_to_btn"</span><span class="tag">/&gt;</span><span class="pln">

</span><span class="tag">&lt;/LinearLayout&gt;</span></pre>

<p>
	وفي ملف الواجهة <span style="font-family:courier new,courier,monospace;">fragment_details</span> نضيف الخاصية <span style="font-family:courier new,courier,monospace;">id</span> للعنصر <span style="font-family:courier new,courier,monospace;">TextView</span>.
</p>

<pre class="ipsCode prettyprint lang-xml prettyprinted" id="ips_uid_8457_11">
<span class="tag">&lt;LinearLayout</span><span class="pln"> </span><span class="atn">xmlns:android</span><span class="pun">=</span><span class="atv">"http://schemas.android.com/apk/res/android"</span><span class="pln">
	</span><span class="atn">android:layout_width</span><span class="pun">=</span><span class="atv">"match_parent"</span><span class="pln">
	</span><span class="atn">android:layout_height</span><span class="pun">=</span><span class="atv">"match_parent"</span><span class="pln">
	</span><span class="atn">android:background</span><span class="pun">=</span><span class="atv">"#ffc829"</span><span class="pln">
	</span><span class="atn">android:orientation</span><span class="pun">=</span><span class="atv">"vertical"</span><span class="tag">&gt;</span><span class="pln">

	</span><span class="tag">&lt;TextView</span><span class="pln">
		</span><span class="atn">android:layout_width</span><span class="pun">=</span><span class="atv">"match_parent"</span><span class="pln">
		</span><span class="atn">android:layout_height</span><span class="pun">=</span><span class="atv">"match_parent"</span><span class="pln">
		</span><span class="atn">android:text</span><span class="pun">=</span><span class="atv">"Hello From Details Fragment"</span><span class="pln">
		</span><span class="atn">android:gravity</span><span class="pun">=</span><span class="atv">"center"</span><span class="pln">
		</span><span class="atn">android:id</span><span class="pun">=</span><span class="atv">"@+id/txt_view"</span><span class="tag">/&gt;</span><span class="pln">

</span><span class="tag">&lt;/LinearLayout&gt;</span></pre>

<p>
	وفي ملف الواجهة الرئيسي الخاص بالشاشات ذات الحجم الكبير نقوم بتغيير العنصر <span style="font-family:courier new,courier,monospace;">fragment</span> الثاني بالعنصر <span style="font-family:courier new,courier,monospace;">FrameLayout</span>.
</p>

<pre class="ipsCode prettyprint lang-xml prettyprinted" id="ips_uid_8457_13">
<span class="pun">&lt;?</span><span class="pln">xml version</span><span class="pun">=</span><span class="str">"1.0"</span><span class="pln"> encoding</span><span class="pun">=</span><span class="str">"utf-8"</span><span class="pun">?&gt;</span><span class="pln">
</span><span class="tag">&lt;LinearLayout</span><span class="pln"> </span><span class="atn">xmlns:android</span><span class="pun">=</span><span class="atv">"http://schemas.android.com/apk/res/android"</span><span class="pln">
	</span><span class="atn">xmlns:tools</span><span class="pun">=</span><span class="atv">"http://schemas.android.com/tools"</span><span class="pln">
	</span><span class="atn">android:layout_width</span><span class="pun">=</span><span class="atv">"match_parent"</span><span class="pln">
	</span><span class="atn">android:layout_height</span><span class="pun">=</span><span class="atv">"match_parent"</span><span class="pln">
	</span><span class="atn">android:orientation</span><span class="pun">=</span><span class="atv">"vertical"</span><span class="tag">&gt;</span><span class="pln">

	</span><span class="tag">&lt;TextView</span><span class="pln">
		</span><span class="atn">android:layout_width</span><span class="pun">=</span><span class="atv">"wrap_content"</span><span class="pln">
		</span><span class="atn">android:layout_height</span><span class="pun">=</span><span class="atv">"wrap_content"</span><span class="pln">
		</span><span class="atn">android:text</span><span class="pun">=</span><span class="atv">"Hello Main Activity!"</span><span class="pln">
		</span><span class="atn">android:layout_gravity</span><span class="pun">=</span><span class="atv">"center"</span><span class="pln">
		</span><span class="atn">android:textSize</span><span class="pun">=</span><span class="atv">"25sp"</span><span class="tag">/&gt;</span><span class="pln">

	</span><span class="tag">&lt;LinearLayout</span><span class="pln">
		</span><span class="atn">android:layout_width</span><span class="pun">=</span><span class="atv">"match_parent"</span><span class="pln">
		</span><span class="atn">android:layout_height</span><span class="pun">=</span><span class="atv">"match_parent"</span><span class="pln">
		</span><span class="atn">android:orientation</span><span class="pun">=</span><span class="atv">"horizontal"</span><span class="tag">&gt;</span><span class="pln">
		
		</span><span class="tag">&lt;fragment</span><span class="pln">
			</span><span class="atn">android:layout_width</span><span class="pun">=</span><span class="atv">"0dp"</span><span class="pln">
			</span><span class="atn">android:layout_height</span><span class="pun">=</span><span class="atv">"match_parent"</span><span class="pln">
			</span><span class="atn">android:layout_weight</span><span class="pun">=</span><span class="atv">"1"</span><span class="pln">
			</span><span class="atn">android:name</span><span class="pun">=</span><span class="atv">"apps.noby.simplefragment.ExampleFragment"</span><span class="pln">
			</span><span class="atn">android:id</span><span class="pun">=</span><span class="atv">"@+id/fragment_container"</span><span class="pln">
			</span><span class="atn">tools:layout</span><span class="pun">=</span><span class="atv">"@layout/fragment_example"</span><span class="pln"> </span><span class="tag">/&gt;</span><span class="pln">

		</span><span class="tag">&lt;FrameLayout</span><span class="pln">
			</span><span class="atn">android:layout_width</span><span class="pun">=</span><span class="atv">"0dp"</span><span class="pln">
			</span><span class="atn">android:layout_height</span><span class="pun">=</span><span class="atv">"match_parent"</span><span class="pln">
			</span><span class="atn">android:layout_weight</span><span class="pun">=</span><span class="atv">"1"</span><span class="pln">
			</span><span class="atn">android:id</span><span class="pun">=</span><span class="atv">"@+id/fragment_details"</span><span class="tag">/&gt;</span><span class="pln">
	</span><span class="tag">&lt;/LinearLayout&gt;</span><span class="pln">
</span><span class="tag">&lt;/LinearLayout&gt;</span></pre>

<p>
	داخل الشيفرة الخاصة بـ <span style="font-family:courier new,courier,monospace;">ExampleFragment.java</span> نقوم بتغيير التابع داخل الـ interface ليقبل تمرير نص، ثم عند الضغط على الزر نرسل النص المكتوب داخل عنصر الواجهة <span style="font-family:courier new,courier,monospace;">EditText</span> إلى التابع <span style="font-family:courier new,courier,monospace;">()goToFragment</span>.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_8457_15">
<span class="pln">package apps</span><span class="pun">.</span><span class="pln">noby</span><span class="pun">.</span><span class="pln">simplefragment</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">content</span><span class="pun">.</span><span class="typ">Context</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">os</span><span class="pun">.</span><span class="typ">Bundle</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">app</span><span class="pun">.</span><span class="typ">Fragment</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">view</span><span class="pun">.</span><span class="typ">LayoutInflater</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">view</span><span class="pun">.</span><span class="typ">View</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">view</span><span class="pun">.</span><span class="typ">ViewGroup</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">widget</span><span class="pun">.</span><span class="typ">Button</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">widget</span><span class="pun">.</span><span class="typ">EditText</span><span class="pun">;</span><span class="pln">


</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">ExampleFragment</span><span class="pln"> extends </span><span class="typ">Fragment</span><span class="pln"> </span><span class="pun">{</span><span class="pln">

	</span><span class="kwd">private</span><span class="pln"> </span><span class="typ">MainActivity</span><span class="pln"> mContext</span><span class="pun">;</span><span class="pln">
  
	</span><span class="lit">@Override</span><span class="pln">
	</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> onAttach</span><span class="pun">(</span><span class="typ">Context</span><span class="pln"> context</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
		super</span><span class="pun">.</span><span class="pln">onAttach</span><span class="pun">(</span><span class="pln">context</span><span class="pun">);</span><span class="pln">
		mContext </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="typ">MainActivity</span><span class="pun">)</span><span class="pln"> context</span><span class="pun">;</span><span class="pln">
	</span><span class="pun">}</span><span class="pln">

	</span><span class="lit">@Override</span><span class="pln">
	</span><span class="kwd">public</span><span class="pln"> </span><span class="typ">View</span><span class="pln"> onCreateView</span><span class="pun">(</span><span class="typ">LayoutInflater</span><span class="pln"> inflater</span><span class="pun">,</span><span class="pln"> </span><span class="typ">ViewGroup</span><span class="pln"> container</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Bundle</span><span class="pln"> savedInstanceState</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">

		final </span><span class="typ">View</span><span class="pln"> rootView </span><span class="pun">=</span><span class="pln">inflater</span><span class="pun">.</span><span class="pln">inflate</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">layout</span><span class="pun">.</span><span class="pln">fragment_example</span><span class="pun">,</span><span class="pln"> container</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">);</span><span class="pln">

		</span><span class="typ">Button</span><span class="pln"> btn </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="typ">Button</span><span class="pun">)</span><span class="pln">rootView</span><span class="pun">.</span><span class="pln">findViewById</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">id</span><span class="pun">.</span><span class="pln">go_to_btn</span><span class="pun">);</span><span class="pln">

		btn</span><span class="pun">.</span><span class="pln">setOnClickListener</span><span class="pun">(</span><span class="kwd">new</span><span class="pln"> </span><span class="typ">View</span><span class="pun">.</span><span class="typ">OnClickListener</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
			</span><span class="lit">@Override</span><span class="pln">
			</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> onClick</span><span class="pun">(</span><span class="typ">View</span><span class="pln"> v</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
				</span><span class="typ">EditText</span><span class="pln"> et </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="typ">EditText</span><span class="pun">)</span><span class="pln"> rootView</span><span class="pun">.</span><span class="pln">findViewById</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">id</span><span class="pun">.</span><span class="pln">edit_txt</span><span class="pun">);</span><span class="pln">
				</span><span class="typ">String</span><span class="pln"> name </span><span class="pun">=</span><span class="pln"> et</span><span class="pun">.</span><span class="pln">getText</span><span class="pun">().</span><span class="pln">toString</span><span class="pun">();</span><span class="pln">
				mContext</span><span class="pun">.</span><span class="pln">goToFragment</span><span class="pun">(</span><span class="pln">name</span><span class="pun">);</span><span class="pln">
			</span><span class="pun">}</span><span class="pln">
		</span><span class="pun">});</span><span class="pln">

		</span><span class="kwd">return</span><span class="pln"> rootView</span><span class="pun">;</span><span class="pln">
	</span><span class="pun">}</span><span class="pln">

	</span><span class="kwd">public</span><span class="pln"> interface </span><span class="typ">OnBtnClicked</span><span class="pun">{</span><span class="pln">

		</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> goToFragment</span><span class="pun">(</span><span class="typ">String</span><span class="pln"> name</span><span class="pun">);</span><span class="pln">
	</span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	داخل شيفرة النشاط الرئيسي <span style="font-family:courier new,courier,monospace;">MainActivity.java</span> سنقوم بإرسال النص المرسل مع الكائن <span style="font-family:courier new,courier,monospace;">DetailsFragment</span> باستخدام التابع<span style="font-family:courier new,courier,monospace;"> ()setArguments</span>.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_8457_18">
<span class="pln">package apps</span><span class="pun">.</span><span class="pln">noby</span><span class="pun">.</span><span class="pln">simplefragment</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">app</span><span class="pun">.</span><span class="typ">Activity</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">app</span><span class="pun">.</span><span class="typ">FragmentManager</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">app</span><span class="pun">.</span><span class="typ">FragmentTransaction</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">support</span><span class="pun">.</span><span class="pln">v7</span><span class="pun">.</span><span class="pln">app</span><span class="pun">.</span><span class="typ">AppCompatActivity</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">os</span><span class="pun">.</span><span class="typ">Bundle</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">MainActivity</span><span class="pln"> extends </span><span class="typ">Activity</span><span class="pln"> implements </span><span class="typ">ExampleFragment</span><span class="pun">.</span><span class="typ">OnBtnClicked</span><span class="pln"> </span><span class="pun">{</span><span class="pln">

	</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">static</span><span class="pln"> final </span><span class="typ">String</span><span class="pln"> ARGUMENT_NAME </span><span class="pun">=</span><span class="pln"> </span><span class="str">"name"</span><span class="pun">;</span><span class="pln">

	</span><span class="lit">@Override</span><span class="pln">
	</span><span class="kwd">protected</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> onCreate</span><span class="pun">(</span><span class="typ">Bundle</span><span class="pln"> savedInstanceState</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
		super</span><span class="pun">.</span><span class="pln">onCreate</span><span class="pun">(</span><span class="pln">savedInstanceState</span><span class="pun">);</span><span class="pln">
		setContentView</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">layout</span><span class="pun">.</span><span class="pln">activity_main</span><span class="pun">);</span><span class="pln">

		</span><span class="kwd">if</span><span class="pun">(</span><span class="pln">findViewById</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">id</span><span class="pun">.</span><span class="pln">view_container</span><span class="pun">)</span><span class="pln"> </span><span class="pun">!=</span><span class="pln"> </span><span class="kwd">null</span><span class="pun">){</span><span class="pln">
			</span><span class="typ">FragmentManager</span><span class="pln"> fragmentManager </span><span class="pun">=</span><span class="pln"> getFragmentManager</span><span class="pun">();</span><span class="pln">
			</span><span class="typ">FragmentTransaction</span><span class="pln"> fragmentTransaction </span><span class="pun">=</span><span class="pln"> fragmentManager</span><span class="pun">.</span><span class="pln">beginTransaction</span><span class="pun">();</span><span class="pln">
			</span><span class="typ">ExampleFragment</span><span class="pln"> frag </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">ExampleFragment</span><span class="pun">();</span><span class="pln">
			fragmentTransaction</span><span class="pun">.</span><span class="pln">add</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">id</span><span class="pun">.</span><span class="pln">view_container</span><span class="pun">,</span><span class="pln"> frag</span><span class="pun">);</span><span class="pln">
			fragmentTransaction</span><span class="pun">.</span><span class="pln">commit</span><span class="pun">();</span><span class="pln">
        </span><span class="pun">}</span><span class="pln">
	</span><span class="pun">}</span><span class="pln">

	</span><span class="lit">@Override</span><span class="pln">
	</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> goToFragment</span><span class="pun">(</span><span class="typ">String</span><span class="pln"> name</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
		</span><span class="typ">FragmentManager</span><span class="pln"> fragmentManager </span><span class="pun">=</span><span class="pln"> getFragmentManager</span><span class="pun">();</span><span class="pln">
		</span><span class="typ">FragmentTransaction</span><span class="pln"> fragmentTransaction </span><span class="pun">=</span><span class="pln"> fragmentManager</span><span class="pun">.</span><span class="pln">beginTransaction</span><span class="pun">();</span><span class="pln">
		</span><span class="typ">DetailsFragment</span><span class="pln"> frag </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">DetailsFragment</span><span class="pun">();</span><span class="pln">
		</span><span class="typ">Bundle</span><span class="pln"> bundle </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Bundle</span><span class="pun">();</span><span class="pln">
		bundle</span><span class="pun">.</span><span class="pln">putString</span><span class="pun">(</span><span class="pln">ARGUMENT_NAME</span><span class="pun">,</span><span class="pln">name</span><span class="pun">);</span><span class="pln">
		frag</span><span class="pun">.</span><span class="pln">setArguments</span><span class="pun">(</span><span class="pln">bundle</span><span class="pun">);</span><span class="pln">

		</span><span class="kwd">if</span><span class="pun">(</span><span class="pln">findViewById</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">id</span><span class="pun">.</span><span class="pln">view_container</span><span class="pun">)</span><span class="pln"> </span><span class="pun">!=</span><span class="pln"> </span><span class="kwd">null</span><span class="pun">){</span><span class="pln">
			fragmentTransaction</span><span class="pun">.</span><span class="pln">replace</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">id</span><span class="pun">.</span><span class="pln">view_container</span><span class="pun">,</span><span class="pln"> frag</span><span class="pun">);</span><span class="pln">
			fragmentTransaction</span><span class="pun">.</span><span class="pln">addToBackStack</span><span class="pun">(</span><span class="kwd">null</span><span class="pun">);</span><span class="pln">
			fragmentTransaction</span><span class="pun">.</span><span class="pln">commit</span><span class="pun">();</span><span class="pln">
		</span><span class="pun">}</span><span class="pln">
		</span><span class="kwd">else</span><span class="pun">{</span><span class="pln">
			fragmentTransaction</span><span class="pun">.</span><span class="pln">replace</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">id</span><span class="pun">.</span><span class="pln">fragment_details</span><span class="pun">,</span><span class="pln"> frag</span><span class="pun">);</span><span class="pln">
			fragmentTransaction</span><span class="pun">.</span><span class="pln">commit</span><span class="pun">();</span><span class="pln">
		</span><span class="pun">}</span><span class="pln">
	</span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	وتم إضافة حالتين الأولى للواجهات الصغير والأخرى عن التعامل مع الواجهات الكبيرة.
</p>

<p>
	أخيرًا نقوم باستقبال النص في الشيفرة الخاصة بـ <span style="font-family:courier new,courier,monospace;">DetailsFragment.java</span> وعرضه بداخل العنصر <span style="font-family:courier new,courier,monospace;">TextView</span>.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_8457_20">
<span class="pln">package apps</span><span class="pun">.</span><span class="pln">noby</span><span class="pun">.</span><span class="pln">simplefragment</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">os</span><span class="pun">.</span><span class="typ">Bundle</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">app</span><span class="pun">.</span><span class="typ">Fragment</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">view</span><span class="pun">.</span><span class="typ">LayoutInflater</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">view</span><span class="pun">.</span><span class="typ">View</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">view</span><span class="pun">.</span><span class="typ">ViewGroup</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">widget</span><span class="pun">.</span><span class="typ">TextView</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">DetailsFragment</span><span class="pln"> extends </span><span class="typ">Fragment</span><span class="pln"> </span><span class="pun">{</span><span class="pln">

	</span><span class="lit">@Override</span><span class="pln">
	</span><span class="kwd">public</span><span class="pln"> </span><span class="typ">View</span><span class="pln"> onCreateView</span><span class="pun">(</span><span class="typ">LayoutInflater</span><span class="pln"> inflater</span><span class="pun">,</span><span class="pln"> </span><span class="typ">ViewGroup</span><span class="pln"> container</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Bundle</span><span class="pln"> savedInstanceState</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">

		</span><span class="typ">View</span><span class="pln"> rootView </span><span class="pun">=</span><span class="pln"> inflater</span><span class="pun">.</span><span class="pln">inflate</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">layout</span><span class="pun">.</span><span class="pln">fragment_details</span><span class="pun">,</span><span class="pln">container</span><span class="pun">,</span><span class="kwd">false</span><span class="pun">);</span><span class="pln">

		</span><span class="typ">TextView</span><span class="pln"> tv </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="typ">TextView</span><span class="pun">)</span><span class="pln"> rootView</span><span class="pun">.</span><span class="pln">findViewById</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">id</span><span class="pun">.</span><span class="pln">txt_view</span><span class="pun">);</span><span class="pln">
		</span><span class="typ">Bundle</span><span class="pln"> bundle </span><span class="pun">=</span><span class="pln"> getArguments</span><span class="pun">();</span><span class="pln">
		</span><span class="typ">String</span><span class="pln"> str </span><span class="pun">=</span><span class="pln"> bundle</span><span class="pun">.</span><span class="pln">getString</span><span class="pun">(</span><span class="typ">MainActivity</span><span class="pun">.</span><span class="pln">ARGUMENT_NAME</span><span class="pun">);</span><span class="pln">
		tv</span><span class="pun">.</span><span class="pln">setText</span><span class="pun">(</span><span class="str">"Hello "</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> str </span><span class="pun">+</span><span class="pln"> </span><span class="str">" From Details Fragment"</span><span class="pun">);</span><span class="pln">
		</span><span class="kwd">return</span><span class="pln"> rootView</span><span class="pun">;</span><span class="pln">
	</span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	بعد ذلك نقوم بتشغيل التطبيق على المحاكي وتجربته للتأكد من أداءه للوظيفة المطلوبة بشكل سليم.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="19033" href="https://academy.hsoub.com/uploads/monthly_2016_09/15.png.74f10ef45f70ab05a2c326be1bc006d9.png" rel=""><img alt="15.png" class="ipsImage ipsImage_thumbnailed" data-fileid="19033" data-unique="r2dsgb3dp" src="https://academy.hsoub.com/uploads/monthly_2016_09/15.thumb.png.b4ad564ec10a57e51826c5464efcc63b.png"></a>
</p>

<p>
	بهذا نكون قد وصلنا إلى نهاية هذا الدرس، في انتظار تجربتكم وآرائكم.
</p>
]]></description><guid isPermaLink="false">378</guid><pubDate>Wed, 13 Jul 2016 11:42:00 +0000</pubDate></item><item><title>&#x639;&#x646;&#x627;&#x635;&#x631; &#x642;&#x627;&#x626;&#x645;&#x629; &#x627;&#x644;&#x639;&#x631;&#x636; &#x644;&#x648;&#x627;&#x62C;&#x647;&#x629; &#x627;&#x644;&#x645;&#x633;&#x62A;&#x62E;&#x62F;&#x645; &#x641;&#x64A; &#x62A;&#x637;&#x628;&#x64A;&#x642;&#x627;&#x62A; &#x623;&#x646;&#x62F;&#x631;&#x648;&#x64A;&#x62F;</title><link>https://academy.hsoub.com/programming/android/%D8%B9%D9%86%D8%A7%D8%B5%D8%B1-%D9%82%D8%A7%D8%A6%D9%85%D8%A9-%D8%A7%D9%84%D8%B9%D8%B1%D8%B6-%D9%84%D9%88%D8%A7%D8%AC%D9%87%D8%A9-%D8%A7%D9%84%D9%85%D8%B3%D8%AA%D8%AE%D8%AF%D9%85-%D9%81%D9%8A-%D8%AA%D8%B7%D8%A8%D9%8A%D9%82%D8%A7%D8%AA-%D8%A3%D9%86%D8%AF%D8%B1%D9%88%D9%8A%D8%AF-r360/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2016_06/android-listview.png.e314fd43f955d94b84f73d778e4bacb8.png" /></p>

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

<p style="text-align: center;">
	<img alt="android-listview.png" class="ipsImage ipsImage_thumbnailed" data-fileid="18191" data-unique="yilvr8ilh" src="https://academy.hsoub.com/uploads/monthly_2016_06/android-listview.png.9984dc9354176e2f860ac27a00ef3822.png"></p>

<p>
	نستخدم عنصر الواجهة <span style="font-family:courier new,courier,monospace;">ListView</span> أو قائمة العرض للقيام بما سبق والذي يتيح عرض أكثر من عنصر في قائمة واحدة، ويتم إضافة العناصر إلى قائمة العرض تلقائيًا باستخدام كائن من الصنف <span style="font-family:courier new,courier,monospace;">Adapter</span> والذي يستطيع جلب المحتوى من مصفوفة من البيانات أو قاعدة بيانات.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="18177" href="https://academy.hsoub.com/uploads/monthly_2016_06/1.png.174e5a23bcef591f640619d2930e9fb1.png" rel=""><img alt="1.png" class="ipsImage ipsImage_thumbnailed" data-fileid="18177" data-unique="abj8m20dt" src="https://academy.hsoub.com/uploads/monthly_2016_06/1.thumb.png.e60e5bb44e24c94c0c15453ee47d1c90.png"></a>
</p>

<p>
	ويُعتبر الصنف <span style="font-family:courier new,courier,monospace;">Adapter</span> بمثابة حلقة الوصل بين عنصر الواجهة الخاص بقائمة العرض ومصدر البيانات المستخدم حيث يقوم بتشكيلها بالشكل المطلوب لتُمثل عنصرًا من عناصر القائمة.
</p>

<p>
	يوجد عدة أصناف فرعية من الصنف <span style="font-family:courier new,courier,monospace;">Adapter</span> كي تُستخدم مع أشكال البيانات المختلفة مثل:
</p>

<ul>
<li>
		ArrayAdapter
	</li>
	<li>
		Base Adapter
	</li>
	<li>
		SimpleCursorAdapter
	</li>
</ul>
<h2>
	قوائم العرض مع كائن من ArrayAdapter
</h2>

<h3>
	تطبيق 1
</h3>

<p>
	يُستخدم <span style="font-family:courier new,courier,monospace;">ArrayAdapter</span> عندما يكون المصدر البيانات هو قائمة أو مصفوفة.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="18178" href="https://academy.hsoub.com/uploads/monthly_2016_06/2.png.dc6d976687dbeb5b1e7f68d8ddaa3a6f.png" rel=""><img alt="2.png" class="ipsImage ipsImage_thumbnailed" data-fileid="18178" data-unique="5ax9c38ks" src="https://academy.hsoub.com/uploads/monthly_2016_06/2.thumb.png.8b53d8f811e5bbfa2fe4c1027e596ce2.png"></a>
</p>

<p>
	سنقوم بصنع تطبيق يعرض مجموعة من النصوص في قائمة العرض، لذا سنقوم بعمل مشروع جديد في Android Studio. ولتكوين قائمة العرض نقوم بالخطوات التالية:
</p>

<ul>
<li>
		نضع عنصر من <span style="font-family:courier new,courier,monospace;">ListView</span> في ملفات الواجهة ونشير له بـ Id مميز، ثم نربط هذا العنصر بشيفرات الجافا باستخدام التابع <span style="font-family:courier new,courier,monospace;">()findViewById</span>.
	</li>
</ul>
<pre class="ipsCode prettyprint lang-xml prettyprinted" id="ips_uid_7906_7">
<span class="pun">&lt;?</span><span class="pln">xml version</span><span class="pun">=</span><span class="str">"1.0"</span><span class="pln"> encoding</span><span class="pun">=</span><span class="str">"utf-8"</span><span class="pun">?&gt;</span><span class="pln">
</span><span class="tag">&lt;LinearLayout</span><span class="pln"> </span><span class="atn">xmlns:android</span><span class="pun">=</span><span class="atv">"http://schemas.android.com/apk/res/android"</span><span class="pln">
	</span><span class="atn">android:layout_width</span><span class="pun">=</span><span class="atv">"match_parent"</span><span class="pln">
	</span><span class="atn">android:layout_height</span><span class="pun">=</span><span class="atv">"match_parent"</span><span class="tag">&gt;</span><span class="pln">

	</span><span class="tag">&lt;ListView</span><span class="pln">
		</span><span class="atn">android:layout_width</span><span class="pun">=</span><span class="atv">"match_parent"</span><span class="pln">
		</span><span class="atn">android:layout_height</span><span class="pun">=</span><span class="atv">"match_parent"</span><span class="pln">
		</span><span class="atn">android:id</span><span class="pun">=</span><span class="atv">"@+id/listview"</span><span class="tag">/&gt;</span><span class="pln">
</span><span class="tag">&lt;/LinearLayout&gt;</span></pre>

<ul>
<li>
		نصنع ملف واجهة جديد يكون الجذر له عنصر من النوع <span style="font-family:courier new,courier,monospace;">TextView</span>.
	</li>
</ul>
<p>
	ولصنع واجهة استخدام جديدة نضغط على المجلد <span style="font-family:courier new,courier,monospace;">layout</span> المتواجد داخل <span style="font-family:courier new,courier,monospace;">res</span> بالزر الأيمن ثم نختار:
</p>

<p style="text-align: center;">
	<strong>new &gt; XML &gt; Layout XML File</strong>
</p>

<p>
	ونسميه <span style="font-family:courier new,courier,monospace;">row_item</span>.
</p>

<p>
	وبداخل هذا الملف نجعل عنصر الجذر من النوع <span style="font-family:courier new,courier,monospace;">TextView</span> ونغير حجم النص الذي سيُكتب بداخله إلى 20sp ونجعل الخاصية <span style="font-family:courier new,courier,monospace;">padding</span> لها قيمة 20sp.
</p>

<p>
	لاحظ أن الخاصية <span style="font-family:courier new,courier,monospace;">padding</span> تعني الحشو أي ضع فراغًا مقداره 20sp حول النص المكتوب داخل <span style="font-family:courier new,courier,monospace;">TextView</span> في كل الاتجاهات.
</p>

<pre class="ipsCode prettyprint lang-xml prettyprinted" id="ips_uid_7906_9">
<span class="pun">&lt;?</span><span class="pln">xml version</span><span class="pun">=</span><span class="str">"1.0"</span><span class="pln"> encoding</span><span class="pun">=</span><span class="str">"utf-8"</span><span class="pun">?&gt;</span><span class="pln">
</span><span class="tag">&lt;TextView</span><span class="pln"> </span><span class="atn">xmlns:android</span><span class="pun">=</span><span class="atv">"http://schemas.android.com/apk/res/android"</span><span class="pln">
	</span><span class="atn">android:layout_width</span><span class="pun">=</span><span class="atv">"match_parent"</span><span class="pln">
	</span><span class="atn">android:layout_height</span><span class="pun">=</span><span class="atv">"match_parent"</span><span class="pln">
	</span><span class="atn">android:textSize</span><span class="pun">=</span><span class="atv">"20sp"</span><span class="pln">
	</span><span class="atn">android:padding</span><span class="pun">=</span><span class="atv">"20sp"</span><span class="tag">/&gt;</span></pre>

<p>
	في شيفرة الجافا نبني كائنًا جديدًا من الصنف <span style="font-family:courier new,courier,monospace;">ArrayAdapter</span> ونمرر لدالة البناء الخاصة به ثلاث عناصر:
</p>

<ul>
<li>
		العنصر الأول هو <span style="font-family:courier new,courier,monospace;">this</span> والذي يعبر عن السياق الخاص بالنشاط المكوّن للقائمة.
	</li>
	<li>
		العنصر الثاني هو <span style="font-family:courier new,courier,monospace;">TextView</span> الذي سيُعرض فيه كل نص في القائمة.
	</li>
	<li>
		العنصر الأخير هو المصفوفة الخاصة بالنصوص التي سيتم عرضها في قائمة العرض.
	</li>
</ul>
<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_3248_7">
<span class="typ">ArrayAdapter</span><span class="pun">&lt;</span><span class="typ">String</span><span class="pun">&gt;</span><span class="pln"> adapter </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">ArrayAdapter</span><span class="pun">&lt;</span><span class="typ">String</span><span class="pun">&gt;(</span><span class="kwd">this</span><span class="pun">,</span><span class="pln">R</span><span class="pun">.</span><span class="pln">layout</span><span class="pun">.</span><span class="pln">row_item</span><span class="pun">,</span><span class="pln">colorsArray</span><span class="pun">);</span></pre>

<ul>
<li>
		نستدعي التابع<span style="font-family:courier new,courier,monospace;"> ()setAdapter</span> باستخدام الكائن الخاص بالـ <span style="font-family:courier new,courier,monospace;">ListView</span> ونمرر له الـ <span style="font-family:courier new,courier,monospace;">Adapter</span> الذي قمنا بصنعه ليصبح التطبيق النهائي:
	</li>
</ul>
<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_7906_11">
<span class="pln">package apps</span><span class="pun">.</span><span class="pln">noby</span><span class="pun">.</span><span class="pln">listviewexample</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">app</span><span class="pun">.</span><span class="typ">Activity</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">os</span><span class="pun">.</span><span class="typ">Bundle</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">widget</span><span class="pun">.</span><span class="typ">ArrayAdapter</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">widget</span><span class="pun">.</span><span class="typ">ListView</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">MainActivity</span><span class="pln"> extends </span><span class="typ">Activity</span><span class="pln"> </span><span class="pun">{</span><span class="pln">

	</span><span class="kwd">private</span><span class="pln"> </span><span class="typ">ListView</span><span class="pln"> lv</span><span class="pun">;</span><span class="pln">
	</span><span class="typ">String</span><span class="pln"> </span><span class="pun">[]</span><span class="pln"> colorsArray </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="str">"Red"</span><span class="pun">,</span><span class="str">"Yellow"</span><span class="pun">,</span><span class="str">"Blue"</span><span class="pun">,</span><span class="str">"Orange"</span><span class="pun">,</span><span class="str">"Black"</span><span class="pun">,</span><span class="str">"Green"</span><span class="pun">,</span><span class="str">"Brown"</span><span class="pun">,</span><span class="str">"Grey"</span><span class="pun">};</span><span class="pln">

	</span><span class="lit">@Override</span><span class="pln">
	</span><span class="kwd">protected</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> onCreate</span><span class="pun">(</span><span class="typ">Bundle</span><span class="pln"> savedInstanceState</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
		super</span><span class="pun">.</span><span class="pln">onCreate</span><span class="pun">(</span><span class="pln">savedInstanceState</span><span class="pun">);</span><span class="pln">
		setContentView</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">layout</span><span class="pun">.</span><span class="pln">activity_main</span><span class="pun">);</span><span class="pln">

		lv </span><span class="pun">=(</span><span class="typ">ListView</span><span class="pun">)</span><span class="pln"> findViewById</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">id</span><span class="pun">.</span><span class="pln">listview</span><span class="pun">);</span><span class="pln">
		</span><span class="typ">ArrayAdapter</span><span class="pun">&lt;</span><span class="typ">String</span><span class="pun">&gt;</span><span class="pln"> adapter </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">ArrayAdapter</span><span class="pun">&lt;</span><span class="typ">String</span><span class="pun">&gt;(</span><span class="kwd">this</span><span class="pun">,</span><span class="pln">R</span><span class="pun">.</span><span class="pln">layout</span><span class="pun">.</span><span class="pln">row_item</span><span class="pun">,</span><span class="pln">colorsArray</span><span class="pun">);</span><span class="pln">
		lv</span><span class="pun">.</span><span class="pln">setAdapter</span><span class="pun">(</span><span class="pln">adapter</span><span class="pun">);</span><span class="pln">
	</span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	ثم نقوم بتجربة التطبيق على المحاكي لنتأكد من عمله بالشكل المطلوب.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="18179" href="https://academy.hsoub.com/uploads/monthly_2016_06/3.png.75a095f788dd0d864757e1b67650cfea.png" rel=""><img alt="3.png" class="ipsImage ipsImage_thumbnailed" data-fileid="18179" data-unique="hldyuacqc" src="https://academy.hsoub.com/uploads/monthly_2016_06/3.thumb.png.092fec4b2ab6b2611ac6d7e9c5784159.png"></a>
</p>

<h3>
	تطبيق 2
</h3>

<p>
	في هذا التطبيق بدلًا من استخدام المصفوفة لتخزين البيانات سنقوم باستبدالها بقائمة من النوع <span style="font-family:courier new,courier,monospace;">ArrayList</span> مع الحفاظ على باقي ملفات الواجهة السابقة لتصبح الشفرة النهائية بعد التعديل:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_7906_13">
<span class="pln">package apps</span><span class="pun">.</span><span class="pln">noby</span><span class="pun">.</span><span class="pln">listviewexample</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">app</span><span class="pun">.</span><span class="typ">Activity</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">os</span><span class="pun">.</span><span class="typ">Bundle</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">widget</span><span class="pun">.</span><span class="typ">ArrayAdapter</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">widget</span><span class="pun">.</span><span class="typ">ListView</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> java</span><span class="pun">.</span><span class="pln">util</span><span class="pun">.</span><span class="typ">ArrayList</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">MainActivity</span><span class="pln"> extends </span><span class="typ">Activity</span><span class="pln"> </span><span class="pun">{</span><span class="pln">

	</span><span class="kwd">private</span><span class="pln"> </span><span class="typ">ListView</span><span class="pln"> lv</span><span class="pun">;</span><span class="pln">
	</span><span class="typ">ArrayList</span><span class="pun">&lt;</span><span class="typ">String</span><span class="pun">&gt;</span><span class="pln"> colorsList</span><span class="pun">;</span><span class="pln">

	</span><span class="lit">@Override</span><span class="pln">
	</span><span class="kwd">protected</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> onCreate</span><span class="pun">(</span><span class="typ">Bundle</span><span class="pln"> savedInstanceState</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
		super</span><span class="pun">.</span><span class="pln">onCreate</span><span class="pun">(</span><span class="pln">savedInstanceState</span><span class="pun">);</span><span class="pln">
		setContentView</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">layout</span><span class="pun">.</span><span class="pln">activity_main</span><span class="pun">);</span><span class="pln">
      
		colorsList </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">ArrayList</span><span class="pun">&lt;</span><span class="typ">String</span><span class="pun">&gt;();</span><span class="pln">
		colorsList</span><span class="pun">.</span><span class="pln">add</span><span class="pun">(</span><span class="str">"Red"</span><span class="pun">);</span><span class="pln">
		colorsList</span><span class="pun">.</span><span class="pln">add</span><span class="pun">(</span><span class="str">"Yellow"</span><span class="pun">);</span><span class="pln">
		colorsList</span><span class="pun">.</span><span class="pln">add</span><span class="pun">(</span><span class="str">"Blue"</span><span class="pun">);</span><span class="pln">
		colorsList</span><span class="pun">.</span><span class="pln">add</span><span class="pun">(</span><span class="str">"Orange"</span><span class="pun">);</span><span class="pln">
		colorsList</span><span class="pun">.</span><span class="pln">add</span><span class="pun">(</span><span class="str">"Black"</span><span class="pun">);</span><span class="pln">
		colorsList</span><span class="pun">.</span><span class="pln">add</span><span class="pun">(</span><span class="str">"Green"</span><span class="pun">);</span><span class="pln">
		colorsList</span><span class="pun">.</span><span class="pln">add</span><span class="pun">(</span><span class="str">"Brown"</span><span class="pun">);</span><span class="pln">
		colorsList</span><span class="pun">.</span><span class="pln">add</span><span class="pun">(</span><span class="str">"Grey"</span><span class="pun">);</span><span class="pln">

		lv </span><span class="pun">=(</span><span class="typ">ListView</span><span class="pun">)</span><span class="pln"> findViewById</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">id</span><span class="pun">.</span><span class="pln">listview</span><span class="pun">);</span><span class="pln">
		</span><span class="typ">ArrayAdapter</span><span class="pun">&lt;</span><span class="typ">String</span><span class="pun">&gt;</span><span class="pln"> adapter </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">ArrayAdapter</span><span class="pun">&lt;</span><span class="typ">String</span><span class="pun">&gt;(</span><span class="kwd">this</span><span class="pun">,</span><span class="pln">R</span><span class="pun">.</span><span class="pln">layout</span><span class="pun">.</span><span class="pln">row_item</span><span class="pun">,</span><span class="pln">colorsList</span><span class="pun">);</span><span class="pln">
		lv</span><span class="pun">.</span><span class="pln">setAdapter</span><span class="pun">(</span><span class="pln">adapter</span><span class="pun">);</span><span class="pln">
	</span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	وبتجربة هذا التطبيق على المحاكي نجد أنه يقوم بنفس الوظيفة السابقة، ولكن استخدامنا للقائمة بدلًا من المصفوفة يتيح لنا القدرة على إضافة أو إزالة العناصر بسهولة وهو ما لا تسمح به المصفوفة.
</p>

<h2>
	استجابة عناصر القائمة عند الضغط عليها
</h2>

<h3>
	تطبيق 3
</h3>

<p>
	سنقوم في هذا التطبيق بجعل العناصر المتواجدة بقائمة العرض تستجيب عند الضغط عليها، فكما ذكرنا سابقًا أننا استخدمنا كائنًا من نوع <span style="font-family:courier new,courier,monospace;">ArrayList</span> لسهولة إضافة أو إزالة العناصر منه، سنقوم الآن بتطبيق هذا المفهوم حيث سنقوم بإزالة العنصر من القائمة عند الضغط عليه.
</p>

<p>
	كما نستخدم التابع <span style="font-family:courier new,courier,monospace;">()setOnClickListener</span> مع الزر للاستجابة عند الضغط عليه سنقوم هنا باستخدام التابع<span style="font-family:courier new,courier,monospace;"> ()setOnItemClickListener</span> للاستجابة عند الضغط على عناصر القائمة، وبداخله نجد الدالة <span style="font-family:courier new,courier,monospace;">()onItemClick</span> وبها العناصر التالية:
</p>

<ul>
<li>
		<span style="font-family:courier new,courier,monospace;">parent</span> وهو يُعبر عن الأب الخاص بالعنصر الذي تم الضغط عليه وفي هذا المثال فهو <span style="font-family:courier new,courier,monospace;">ListView</span>.
	</li>
	<li>
		<span style="font-family:courier new,courier,monospace;">view</span> ويُمثل العنصر نفسه الذي تم الضغط عليه أي <span style="font-family:courier new,courier,monospace;">TextView</span>.
	</li>
	<li>
		<span style="font-family:courier new,courier,monospace;">position</span> ويُعبر عن رقم العنصر في القائمة.
	</li>
	<li>
		<span style="font-family:courier new,courier,monospace;">Id</span> وهو رقم مميز يتم تحديده لعنصر الواجهة الذي يعرض النص.
	</li>
</ul>
<p>
	لتصبح الشفرة النهائية الخاصة بهذا التطبيق:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_7906_15">
<span class="pln">package apps</span><span class="pun">.</span><span class="pln">noby</span><span class="pun">.</span><span class="pln">listviewexample</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">app</span><span class="pun">.</span><span class="typ">Activity</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">os</span><span class="pun">.</span><span class="typ">Bundle</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">view</span><span class="pun">.</span><span class="typ">View</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">widget</span><span class="pun">.</span><span class="typ">AdapterView</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">widget</span><span class="pun">.</span><span class="typ">ArrayAdapter</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">widget</span><span class="pun">.</span><span class="typ">ListView</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> java</span><span class="pun">.</span><span class="pln">util</span><span class="pun">.</span><span class="typ">ArrayList</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">MainActivity</span><span class="pln"> extends </span><span class="typ">Activity</span><span class="pln"> </span><span class="pun">{</span><span class="pln">

	</span><span class="kwd">private</span><span class="pln"> </span><span class="typ">ListView</span><span class="pln"> lv</span><span class="pun">;</span><span class="pln">
	</span><span class="typ">ArrayList</span><span class="pun">&lt;</span><span class="typ">String</span><span class="pun">&gt;</span><span class="pln"> colorsList</span><span class="pun">;</span><span class="pln">

	</span><span class="lit">@Override</span><span class="pln">
	</span><span class="kwd">protected</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> onCreate</span><span class="pun">(</span><span class="typ">Bundle</span><span class="pln"> savedInstanceState</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
		super</span><span class="pun">.</span><span class="pln">onCreate</span><span class="pun">(</span><span class="pln">savedInstanceState</span><span class="pun">);</span><span class="pln">
		setContentView</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">layout</span><span class="pun">.</span><span class="pln">activity_main</span><span class="pun">);</span><span class="pln">

      	colorsList </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">ArrayList</span><span class="pun">&lt;</span><span class="typ">String</span><span class="pun">&gt;();</span><span class="pln">
		colorsList</span><span class="pun">.</span><span class="pln">add</span><span class="pun">(</span><span class="str">"Red"</span><span class="pun">);</span><span class="pln">
		colorsList</span><span class="pun">.</span><span class="pln">add</span><span class="pun">(</span><span class="str">"Yellow"</span><span class="pun">);</span><span class="pln">
		colorsList</span><span class="pun">.</span><span class="pln">add</span><span class="pun">(</span><span class="str">"Blue"</span><span class="pun">);</span><span class="pln">
		colorsList</span><span class="pun">.</span><span class="pln">add</span><span class="pun">(</span><span class="str">"Orange"</span><span class="pun">);</span><span class="pln">
		colorsList</span><span class="pun">.</span><span class="pln">add</span><span class="pun">(</span><span class="str">"Black"</span><span class="pun">);</span><span class="pln">
		colorsList</span><span class="pun">.</span><span class="pln">add</span><span class="pun">(</span><span class="str">"Green"</span><span class="pun">);</span><span class="pln">
		colorsList</span><span class="pun">.</span><span class="pln">add</span><span class="pun">(</span><span class="str">"Brown"</span><span class="pun">);</span><span class="pln">
		colorsList</span><span class="pun">.</span><span class="pln">add</span><span class="pun">(</span><span class="str">"Grey"</span><span class="pun">);</span><span class="pln">

		lv </span><span class="pun">=(</span><span class="typ">ListView</span><span class="pun">)</span><span class="pln"> findViewById</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">id</span><span class="pun">.</span><span class="pln">listview</span><span class="pun">);</span><span class="pln">
		final </span><span class="typ">ArrayAdapter</span><span class="pun">&lt;</span><span class="typ">String</span><span class="pun">&gt;</span><span class="pln"> adapter </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">ArrayAdapter</span><span class="pun">&lt;</span><span class="typ">String</span><span class="pun">&gt;(</span><span class="kwd">this</span><span class="pun">,</span><span class="pln">R</span><span class="pun">.</span><span class="pln">layout</span><span class="pun">.</span><span class="pln">row_item</span><span class="pun">,</span><span class="pln">colorsList</span><span class="pun">);</span><span class="pln">
		lv</span><span class="pun">.</span><span class="pln">setAdapter</span><span class="pun">(</span><span class="pln">adapter</span><span class="pun">);</span><span class="pln">
      
		lv</span><span class="pun">.</span><span class="pln">setOnItemClickListener</span><span class="pun">(</span><span class="kwd">new</span><span class="pln"> </span><span class="typ">ListView</span><span class="pun">.</span><span class="typ">OnItemClickListener</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        	</span><span class="lit">@Override</span><span class="pln">
			</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> onItemClick</span><span class="pun">(</span><span class="typ">AdapterView</span><span class="pun">&lt;?&gt;</span><span class="pln"> parent</span><span class="pun">,</span><span class="pln"> </span><span class="typ">View</span><span class="pln"> view</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> position</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">long</span><span class="pln"> id</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
				</span><span class="typ">String</span><span class="pln"> item </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="typ">String</span><span class="pun">)</span><span class="pln"> parent</span><span class="pun">.</span><span class="pln">getItemAtPosition</span><span class="pun">(</span><span class="pln">position</span><span class="pun">);</span><span class="pln">
				colorsList</span><span class="pun">.</span><span class="pln">remove</span><span class="pun">(</span><span class="pln">item</span><span class="pun">);</span><span class="pln">
				adapter</span><span class="pun">.</span><span class="pln">notifyDataSetChanged</span><span class="pun">();</span><span class="pln">
			</span><span class="pun">}</span><span class="pln">
		</span><span class="pun">});</span><span class="pln">
	</span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	بداخل التابع<span style="font-family:courier new,courier,monospace;"> ()onItemClick</span> نستخدم الكائن <span style="font-family:courier new,courier,monospace;">parent</span> لاستدعاء التابع<span style="font-family:courier new,courier,monospace;"> ()getItemAtPosition</span> وتمرير رقم العنصر له حتى يُعيد لنا النص المخزن في ذلك العنصر.
</p>

<p>
	ثم بعد ذلك نقوم بإزالة العنصر من القائمة واستدعاء التابع <span style="font-family:courier new,courier,monospace;">()notifyDataSetChanged</span> باستخدام الكائن <span style="font-family:courier new,courier,monospace;">adapter</span> وذلك لتنفيذ التغيير الذي حدث على عناصر قائمة العرض.
</p>

<p>
	الآن نقوم بتجربة التطبيق على المحاكي، نجد أنه عند الضغط على أحد العناصر تختفي في الحال.
</p>

<p>
	يمكنك تطوير هذا التطبيق لجعله يستدعي نشاطًا جديدًا عند الضغط على أحد العناصر.
</p>

<h2>
	البحث داخل عناصر قائمة العرض
</h2>

<h3>
	تطبيق 4
</h3>

<p>
	في هذا التطبيق سنقوم بالبحث عن العناصر التي تحتوي على نص معين وعرضها هي فقط وذلك لسهولة الوصول لعنصر محدد.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="18180" href="https://academy.hsoub.com/uploads/monthly_2016_06/4.png.ca93b02453727ecc77d6257ffaef8960.png" rel=""><img alt="4.png" class="ipsImage ipsImage_thumbnailed" data-fileid="18180" data-unique="smtmioxga" src="https://academy.hsoub.com/uploads/monthly_2016_06/4.thumb.png.30a015f8a6f1816538e6d7a5f8cb816d.png"></a>
</p>

<p>
	كتطوير على التطبيق السابق سنقوم بإضافة الخاصية <span style="font-family:courier new,courier,monospace;">Orientation</span> للعنصر <span style="font-family:courier new,courier,monospace;">LinearLayout</span> في ملف <span style="font-family:courier new,courier,monospace;">activity_main.xml</span>.
</p>

<pre class="ipsCode prettyprint lang-xml prettyprinted" id="ips_uid_3248_9">
<span class="pln">android:orientation="vertical"</span></pre>

<p>
	ثم نضيف عنصر <span style="font-family:courier new,courier,monospace;">EditText</span> قبل <span style="font-family:courier new,courier,monospace;">ListView</span> وهو العنصر الذي سيقوم المستخدم بالتفاعل معه وكتابة النص الذي سيبحث عنه داخل قائمة العرض.
</p>

<pre class="ipsCode prettyprint lang-xml prettyprinted" id="ips_uid_3248_11">
<span class="pun">&lt;?</span><span class="pln">xml version</span><span class="pun">=</span><span class="str">"1.0"</span><span class="pln"> encoding</span><span class="pun">=</span><span class="str">"utf-8"</span><span class="pun">?&gt;</span><span class="pln">
</span><span class="tag">&lt;LinearLayout</span><span class="pln"> </span><span class="atn">xmlns:android</span><span class="pun">=</span><span class="atv">"http://schemas.android.com/apk/res/android"</span><span class="pln">
	</span><span class="atn">android:layout_width</span><span class="pun">=</span><span class="atv">"match_parent"</span><span class="pln">
	</span><span class="atn">android:layout_height</span><span class="pun">=</span><span class="atv">"match_parent"</span><span class="pln">
	</span><span class="atn">android:orientation</span><span class="pun">=</span><span class="atv">"vertical"</span><span class="tag">&gt;</span><span class="pln">

	</span><span class="tag">&lt;EditText</span><span class="pln">
		</span><span class="atn">android:layout_width</span><span class="pun">=</span><span class="atv">"match_parent"</span><span class="pln">
		</span><span class="atn">android:layout_height</span><span class="pun">=</span><span class="atv">"wrap_content"</span><span class="pln">
		</span><span class="atn">android:drawableLeft</span><span class="pun">=</span><span class="atv">"@drawable/ic_search_black_24dp"</span><span class="pln">
		</span><span class="atn">android:hint</span><span class="pun">=</span><span class="atv">"Search..."</span><span class="pln">
		</span><span class="atn">android:id</span><span class="pun">=</span><span class="atv">"@+id/searchedittext"</span><span class="tag">/&gt;</span><span class="pln">

	</span><span class="tag">&lt;ListView</span><span class="pln">
		</span><span class="atn">android:layout_width</span><span class="pun">=</span><span class="atv">"match_parent"</span><span class="pln">
		</span><span class="atn">android:layout_height</span><span class="pun">=</span><span class="atv">"match_parent"</span><span class="pln">
		</span><span class="atn">android:id</span><span class="pun">=</span><span class="atv">"@+id/listview"</span><span class="tag">/&gt;</span><span class="pln">
</span><span class="tag">&lt;/LinearLayout&gt;</span></pre>

<p>
	ولإضافة صورة يسار العنصر <span style="font-family:courier new,courier,monospace;">EditText</span> نستخدم الخاصية <span style="font-family:courier new,courier,monospace;">drawableLeft</span> ثم نضيف الصورة من المجلد <span style="font-family:courier new,courier,monospace;">drawable</span>.
</p>

<p>
	الآن سنربط هذا العنصر بالشيفرة الرئيسية للتطبيق ثم نستدعي التابع <span style="font-family:courier new,courier,monospace;">()addTextChangedListener</span> والذي يستجيب لأي تغير يحدث داخل <span style="font-family:courier new,courier,monospace;">EditText</span>، حيث يوفر ثلاث دوال:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_3248_13">
<span class="pln">searchET</span><span class="pun">.</span><span class="pln">addTextChangedListener</span><span class="pun">(</span><span class="kwd">new</span><span class="pln"> </span><span class="typ">TextWatcher</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
	</span><span class="lit">@Override</span><span class="pln">
	</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> beforeTextChanged</span><span class="pun">(</span><span class="typ">CharSequence</span><span class="pln"> s</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> start</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> count</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> after</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">

	</span><span class="pun">}</span><span class="pln">

	</span><span class="lit">@Override</span><span class="pln">
	</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> onTextChanged</span><span class="pun">(</span><span class="typ">CharSequence</span><span class="pln"> s</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> start</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> before</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> count</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
		adapter</span><span class="pun">.</span><span class="pln">getFilter</span><span class="pun">().</span><span class="pln">filter</span><span class="pun">(</span><span class="pln">s</span><span class="pun">);</span><span class="pln">
	</span><span class="pun">}</span><span class="pln">

	</span><span class="lit">@Override</span><span class="pln">
	</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> afterTextChanged</span><span class="pun">(</span><span class="typ">Editable</span><span class="pln"> s</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">

	</span><span class="pun">}</span><span class="pln">
</span><span class="pun">});</span></pre>

<p>
	كل دالة تختص بفترة محددة، وهنا نهتم بالدالة <span style="font-family:courier new,courier,monospace;">()onTextChanged</span> والتي يتم استدعاؤها لحظة تغير النص المكتوب بداخل <span style="font-family:courier new,courier,monospace;">EditText</span>.
</p>

<p>
	أخيرًا لتنقية القائمة وترك فقط العناصر التي يتم البحث عنها نستدعي التابع <span style="font-family:courier new,courier,monospace;">()getFilter</span> باستخدام الكائن الخاص بالـ <span style="font-family:courier new,courier,monospace;">ArrayAdapter</span> ثم نستدعي بعده مباشرة التابع <span style="font-family:courier new,courier,monospace;">()filters</span> ونمرر له المتغير s الذي يحمل بداخله النص الذي قمنا بكتابته في <span style="font-family:courier new,courier,monospace;">EditText</span>.
</p>

<p>
	لتصبح الشيفرة النهائية كما يلي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_3248_15">
<span class="pln">package apps</span><span class="pun">.</span><span class="pln">noby</span><span class="pun">.</span><span class="pln">listviewexample</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">app</span><span class="pun">.</span><span class="typ">Activity</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">os</span><span class="pun">.</span><span class="typ">Bundle</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">text</span><span class="pun">.</span><span class="typ">Editable</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">text</span><span class="pun">.</span><span class="typ">TextWatcher</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">view</span><span class="pun">.</span><span class="typ">View</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">widget</span><span class="pun">.</span><span class="typ">AdapterView</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">widget</span><span class="pun">.</span><span class="typ">ArrayAdapter</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">widget</span><span class="pun">.</span><span class="typ">EditText</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">widget</span><span class="pun">.</span><span class="typ">ListView</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> java</span><span class="pun">.</span><span class="pln">util</span><span class="pun">.</span><span class="typ">ArrayList</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">MainActivity</span><span class="pln"> extends </span><span class="typ">Activity</span><span class="pln"> </span><span class="pun">{</span><span class="pln">

	</span><span class="kwd">private</span><span class="pln"> </span><span class="typ">ListView</span><span class="pln"> lv</span><span class="pun">;</span><span class="pln">
	</span><span class="kwd">private</span><span class="pln"> </span><span class="typ">ArrayList</span><span class="pun">&lt;</span><span class="typ">String</span><span class="pun">&gt;</span><span class="pln"> colorsList</span><span class="pun">;</span><span class="pln">
	</span><span class="typ">EditText</span><span class="pln"> searchET</span><span class="pun">;</span><span class="pln">

	</span><span class="lit">@Override</span><span class="pln">
	</span><span class="kwd">protected</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> onCreate</span><span class="pun">(</span><span class="typ">Bundle</span><span class="pln"> savedInstanceState</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
		super</span><span class="pun">.</span><span class="pln">onCreate</span><span class="pun">(</span><span class="pln">savedInstanceState</span><span class="pun">);</span><span class="pln">
		setContentView</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">layout</span><span class="pun">.</span><span class="pln">activity_main</span><span class="pun">);</span><span class="pln">
		colorsList </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">ArrayList</span><span class="pun">&lt;</span><span class="typ">String</span><span class="pun">&gt;();</span><span class="pln">
      
		colorsList</span><span class="pun">.</span><span class="pln">add</span><span class="pun">(</span><span class="str">"Red"</span><span class="pun">);</span><span class="pln">
		colorsList</span><span class="pun">.</span><span class="pln">add</span><span class="pun">(</span><span class="str">"Yellow"</span><span class="pun">);</span><span class="pln">
		colorsList</span><span class="pun">.</span><span class="pln">add</span><span class="pun">(</span><span class="str">"Blue"</span><span class="pun">);</span><span class="pln">
		colorsList</span><span class="pun">.</span><span class="pln">add</span><span class="pun">(</span><span class="str">"Orange"</span><span class="pun">);</span><span class="pln">
		colorsList</span><span class="pun">.</span><span class="pln">add</span><span class="pun">(</span><span class="str">"Black"</span><span class="pun">);</span><span class="pln">
		colorsList</span><span class="pun">.</span><span class="pln">add</span><span class="pun">(</span><span class="str">"Green"</span><span class="pun">);</span><span class="pln">
		colorsList</span><span class="pun">.</span><span class="pln">add</span><span class="pun">(</span><span class="str">"Brown"</span><span class="pun">);</span><span class="pln">
		colorsList</span><span class="pun">.</span><span class="pln">add</span><span class="pun">(</span><span class="str">"Grey"</span><span class="pun">);</span><span class="pln">

		searchET </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="typ">EditText</span><span class="pun">)</span><span class="pln"> findViewById</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">id</span><span class="pun">.</span><span class="pln">searchedittext</span><span class="pun">);</span><span class="pln">
		lv </span><span class="pun">=(</span><span class="typ">ListView</span><span class="pun">)</span><span class="pln"> findViewById</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">id</span><span class="pun">.</span><span class="pln">listview</span><span class="pun">);</span><span class="pln">
		final </span><span class="typ">ArrayAdapter</span><span class="pun">&lt;</span><span class="typ">String</span><span class="pun">&gt;</span><span class="pln"> adapter </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">ArrayAdapter</span><span class="pun">&lt;</span><span class="typ">String</span><span class="pun">&gt;(</span><span class="kwd">this</span><span class="pun">,</span><span class="pln">R</span><span class="pun">.</span><span class="pln">layout</span><span class="pun">.</span><span class="pln">row_item</span><span class="pun">,</span><span class="pln">colorsList</span><span class="pun">);</span><span class="pln">
		lv</span><span class="pun">.</span><span class="pln">setAdapter</span><span class="pun">(</span><span class="pln">adapter</span><span class="pun">);</span><span class="pln">

		lv</span><span class="pun">.</span><span class="pln">setOnItemClickListener</span><span class="pun">(</span><span class="kwd">new</span><span class="pln"> </span><span class="typ">ListView</span><span class="pun">.</span><span class="typ">OnItemClickListener</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
       		</span><span class="lit">@Override</span><span class="pln">
			</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> onItemClick</span><span class="pun">(</span><span class="typ">AdapterView</span><span class="pun">&lt;?&gt;</span><span class="pln"> parent</span><span class="pun">,</span><span class="pln"> </span><span class="typ">View</span><span class="pln"> view</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> position</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">long</span><span class="pln"> id</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
				</span><span class="typ">String</span><span class="pln"> item </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="typ">String</span><span class="pun">)</span><span class="pln"> parent</span><span class="pun">.</span><span class="pln">getItemAtPosition</span><span class="pun">(</span><span class="pln">position</span><span class="pun">);</span><span class="pln">
				colorsList</span><span class="pun">.</span><span class="pln">remove</span><span class="pun">(</span><span class="pln">item</span><span class="pun">);</span><span class="pln">
				adapter</span><span class="pun">.</span><span class="pln">notifyDataSetChanged</span><span class="pun">();</span><span class="pln">
			</span><span class="pun">}</span><span class="pln">
		</span><span class="pun">});</span><span class="pln">

		searchET</span><span class="pun">.</span><span class="pln">addTextChangedListener</span><span class="pun">(</span><span class="kwd">new</span><span class="pln"> </span><span class="typ">TextWatcher</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
			</span><span class="lit">@Override</span><span class="pln">
			</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> beforeTextChanged</span><span class="pun">(</span><span class="typ">CharSequence</span><span class="pln"> s</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> start</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> count</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> after</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
			</span><span class="pun">}</span><span class="pln">

			</span><span class="lit">@Override</span><span class="pln">
			</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> onTextChanged</span><span class="pun">(</span><span class="typ">CharSequence</span><span class="pln"> s</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> start</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> before</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> count</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
				adapter</span><span class="pun">.</span><span class="pln">getFilter</span><span class="pun">().</span><span class="pln">filter</span><span class="pun">(</span><span class="pln">s</span><span class="pun">);</span><span class="pln">
			</span><span class="pun">}</span><span class="pln">

			</span><span class="lit">@Override</span><span class="pln">
			</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> afterTextChanged</span><span class="pun">(</span><span class="typ">Editable</span><span class="pln"> s</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
			</span><span class="pun">}</span><span class="pln">
		</span><span class="pun">});</span><span class="pln">
	</span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	بعد ذلك نقوم بتجربة التطبيق على المحاكي لنتأكد من عمله كما ينبغي.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="18181" href="https://academy.hsoub.com/uploads/monthly_2016_06/5.png.11d3b5b10bf6171f972b3336f237a883.png" rel=""><img alt="5.png" class="ipsImage ipsImage_thumbnailed" data-fileid="18181" data-unique="mfwu1j5ut" src="https://academy.hsoub.com/uploads/monthly_2016_06/5.thumb.png.003b347785b15b43fcacf33a3ac18c0c.png"></a>
</p>

<h2>
	تخصيص واجهة قائمة العرض
</h2>

<h3>
	تطبيق 5
</h3>

<p>
	تُتيح قائمة العرض ميزة تخصيص العناصر، فيمكن صنع قائمة عرض تتكون من نص وصورة في كل صف بدلًا من نص فقط كالأمثلة السابقة.
</p>

<p>
	في هذا التطبيق سنقوم بصنع تطبيق يعرض قائمة كما في الصورة التالية، وعند الضغط على العنصر يعرض نشاطًا جديدًا.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="18182" href="https://academy.hsoub.com/uploads/monthly_2016_06/6.png.2e74fe32b55da76c1f0fcded4c06a1d4.png" rel=""><img alt="6.png" class="ipsImage ipsImage_thumbnailed" data-fileid="18182" data-unique="9l7sljh4h" src="https://academy.hsoub.com/uploads/monthly_2016_06/6.thumb.png.29af8e800e681f0e60bd1b3b00d9a43d.png"></a>
</p>

<ul>
<li>
		من Android Studio نقوم بعمل مشروع جديد، نبدأ أولًا بصنع واجهة المستخدم الرئيسية والمتكونة من <span style="font-family:courier new,courier,monospace;">ListView</span>.
	</li>
</ul>
<pre class="ipsCode prettyprint lang-xml prettyprinted" id="ips_uid_3248_17">
<span class="pun">&lt;?</span><span class="pln">xml version</span><span class="pun">=</span><span class="str">"1.0"</span><span class="pln"> encoding</span><span class="pun">=</span><span class="str">"utf-8"</span><span class="pun">?&gt;</span><span class="pln">
</span><span class="tag">&lt;LinearLayout</span><span class="pln"> </span><span class="atn">xmlns:android</span><span class="pun">=</span><span class="atv">"http://schemas.android.com/apk/res/android"</span><span class="pln">
	</span><span class="atn">android:layout_width</span><span class="pun">=</span><span class="atv">"match_parent"</span><span class="pln">
	</span><span class="atn">android:layout_height</span><span class="pun">=</span><span class="atv">"match_parent"</span><span class="tag">&gt;</span><span class="pln">

	</span><span class="tag">&lt;ListView</span><span class="pln">
		</span><span class="atn">android:layout_width</span><span class="pun">=</span><span class="atv">"match_parent"</span><span class="pln">
		</span><span class="atn">android:layout_height</span><span class="pun">=</span><span class="atv">"match_parent"</span><span class="pln">
		</span><span class="atn">android:id</span><span class="pun">=</span><span class="atv">"@+id/listview"</span><span class="tag">/&gt;</span><span class="pln">
</span><span class="tag">&lt;/LinearLayout&gt;</span></pre>

<ul>
<li>
		نصنع ملف واجهة جديد يُعبر عن الصف ويدعى <span style="font-family:courier new,courier,monospace;">row_item</span> وبداخله نكون الشكل المطلوب للصف في قائمة العرض كما في المخطط التالي:
	</li>
</ul>
<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="18183" href="https://academy.hsoub.com/uploads/monthly_2016_06/7.png.95f2c490d17c5660fd67bd73f1e6e828.png" rel=""><img alt="7.png" class="ipsImage ipsImage_thumbnailed" data-fileid="18183" data-unique="c98y26wiq" src="https://academy.hsoub.com/uploads/monthly_2016_06/7.thumb.png.6dfac17d21823232f8ae9cca8ef635e3.png"></a>
</p>

<pre class="ipsCode prettyprint lang-xml prettyprinted" id="ips_uid_3248_19">
<span class="pun">&lt;?</span><span class="pln">xml version</span><span class="pun">=</span><span class="str">"1.0"</span><span class="pln"> encoding</span><span class="pun">=</span><span class="str">"utf-8"</span><span class="pun">?&gt;</span><span class="pln">
</span><span class="tag">&lt;LinearLayout</span><span class="pln"> </span><span class="atn">xmlns:android</span><span class="pun">=</span><span class="atv">"http://schemas.android.com/apk/res/android"</span><span class="pln">
	</span><span class="atn">android:layout_width</span><span class="pun">=</span><span class="atv">"match_parent"</span><span class="pln">
	</span><span class="atn">android:layout_height</span><span class="pun">=</span><span class="atv">"match_parent"</span><span class="pln">
	</span><span class="atn">android:orientation</span><span class="pun">=</span><span class="atv">"horizontal"</span><span class="tag">&gt;</span><span class="pln">

	</span><span class="tag">&lt;ImageView</span><span class="pln">
		</span><span class="atn">android:layout_width</span><span class="pun">=</span><span class="atv">"wrap_content"</span><span class="pln">
		</span><span class="atn">android:layout_height</span><span class="pun">=</span><span class="atv">"wrap_content"</span><span class="pln">
		</span><span class="atn">android:src</span><span class="pun">=</span><span class="atv">"@drawable/blue"</span><span class="pln">
		</span><span class="atn">android:id</span><span class="pun">=</span><span class="atv">"@+id/imgview"</span><span class="tag">/&gt;</span><span class="pln">

	</span><span class="tag">&lt;LinearLayout</span><span class="pln">
		</span><span class="atn">android:layout_width</span><span class="pun">=</span><span class="atv">"wrap_content"</span><span class="pln">
		</span><span class="atn">android:layout_height</span><span class="pun">=</span><span class="atv">"wrap_content"</span><span class="pln">
		</span><span class="atn">android:orientation</span><span class="pun">=</span><span class="atv">"vertical"</span><span class="tag">&gt;</span><span class="pln">

		</span><span class="tag">&lt;TextView</span><span class="pln">
			</span><span class="atn">android:layout_width</span><span class="pun">=</span><span class="atv">"wrap_content"</span><span class="pln">
			</span><span class="atn">android:layout_height</span><span class="pun">=</span><span class="atv">"wrap_content"</span><span class="pln">
			</span><span class="atn">android:text</span><span class="pun">=</span><span class="atv">"Title Example"</span><span class="pln">
			</span><span class="atn">android:textSize</span><span class="pun">=</span><span class="atv">"20sp"</span><span class="pln">
			</span><span class="atn">android:textStyle</span><span class="pun">=</span><span class="atv">"bold"</span><span class="pln">
			</span><span class="atn">android:id</span><span class="pun">=</span><span class="atv">"@+id/titleview"</span><span class="tag">/&gt;</span><span class="pln">

		</span><span class="tag">&lt;TextView</span><span class="pln">
			</span><span class="atn">android:layout_width</span><span class="pun">=</span><span class="atv">"wrap_content"</span><span class="pln">
			</span><span class="atn">android:layout_height</span><span class="pun">=</span><span class="atv">"wrap_content"</span><span class="pln">
			</span><span class="atn">android:text</span><span class="pun">=</span><span class="atv">"Description Example"</span><span class="pln">
			</span><span class="atn">android:textSize</span><span class="pun">=</span><span class="atv">"15sp"</span><span class="pln">
			</span><span class="atn">android:id</span><span class="pun">=</span><span class="atv">"@+id/descview"</span><span class="tag">/&gt;</span><span class="pln">
	</span><span class="tag">&lt;/LinearLayout&gt;</span><span class="pln">
</span><span class="tag">&lt;/LinearLayout&gt;</span></pre>

<ul>
<li>
		يتكون الصف في قائمة العرض من صورة، نص العنوان ونص الوصف لذا سنصنع صنفًا جديدًا يحتوي بداخله على هذه المعلومات الخاصة بالعنصر ثم نكوّن مصفوفة أو قائمة من هذه الصنف.
	</li>
</ul>
<p>
	لصنع صنفًا جديدًا من داخل المجلد java اضغط بالزر الأيمن على اسم الحزمة الخاصة بالمشروع واختر<strong> New &gt; Java Class</strong> ثم اكتب اسم الصنف الجديد <span style="font-family:courier new,courier,monospace;">ListItem</span>.
</p>

<p>
	بداخل هذا الصنف الجديد نعرّف ثلاث متغيرات،
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_3248_21">
<span class="pln">package apps</span><span class="pun">.</span><span class="pln">noby</span><span class="pun">.</span><span class="pln">customlistviewexample</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">ListItem</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
	</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> imgSrc</span><span class="pun">;</span><span class="pln">
	</span><span class="kwd">public</span><span class="pln"> </span><span class="typ">String</span><span class="pln"> title</span><span class="pun">;</span><span class="pln">
	</span><span class="kwd">public</span><span class="pln"> </span><span class="typ">String</span><span class="pln"> desc</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<ul>
<li>
		في ملف <span style="font-family:courier new,courier,monospace;">MainActivity.java</span> نكتب الشيفرة الخاصة بالمشروع.
	</li>
</ul>
<p>
	أولًا نصنع كائنًا من الصنف <span style="font-family:courier new,courier,monospace;">ArrayList</span> ليكون هو مصدر البيانات التي ستُعرض في قائمة العرض، ويتكون الكائن من مجموعة من الكائنات الأخرى من الصنف <span style="font-family:courier new,courier,monospace;">ListItem</span> لكل منها صورة خاصة به، نص العنوان ونص الوصف.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_3248_23">
<span class="kwd">private</span><span class="pln"> </span><span class="typ">ArrayList</span><span class="pun">&lt;</span><span class="typ">ListItem</span><span class="pun">&gt;</span><span class="pln"> items</span><span class="pun">;</span><span class="pln">
</span><span class="typ">String</span><span class="pln"> </span><span class="pun">[]</span><span class="pln"> colorsArray </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="str">"Red"</span><span class="pun">,</span><span class="str">"Yellow"</span><span class="pun">,</span><span class="str">"Blue"</span><span class="pun">,</span><span class="str">"Black"</span><span class="pun">,</span><span class="str">"Green"</span><span class="pun">,</span><span class="str">"Brown"</span><span class="pun">,</span><span class="str">"Grey"</span><span class="pun">};</span><span class="pln">
</span><span class="kwd">int</span><span class="pln"> </span><span class="pun">[]</span><span class="pln"> colorsImage </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln">R</span><span class="pun">.</span><span class="pln">drawable</span><span class="pun">.</span><span class="pln">red</span><span class="pun">,</span><span class="pln">R</span><span class="pun">.</span><span class="pln">drawable</span><span class="pun">.</span><span class="pln">yellow</span><span class="pun">,</span><span class="pln">R</span><span class="pun">.</span><span class="pln">drawable</span><span class="pun">.</span><span class="pln">blue</span><span class="pun">,</span><span class="pln">R</span><span class="pun">.</span><span class="pln">drawable</span><span class="pun">.</span><span class="pln">black</span><span class="pun">,</span><span class="pln">R</span><span class="pun">.</span><span class="pln">drawable</span><span class="pun">.</span><span class="pln">green</span><span class="pun">,</span><span class="pln">R</span><span class="pun">.</span><span class="pln">drawable</span><span class="pun">.</span><span class="pln">brown</span><span class="pun">,</span><span class="pln">R</span><span class="pun">.</span><span class="pln">drawable</span><span class="pun">.</span><span class="pln">grey</span><span class="pun">};</span><span class="pln">

items </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">ArrayList</span><span class="pun">&lt;</span><span class="typ">ListItem</span><span class="pun">&gt;();</span><span class="pln">

</span><span class="kwd">for</span><span class="pun">(</span><span class="kwd">int</span><span class="pln"> i</span><span class="pun">=</span><span class="lit">0</span><span class="pun">;</span><span class="pln">i</span><span class="pun">&lt;</span><span class="pln">colorsArray</span><span class="pun">.</span><span class="pln">length</span><span class="pun">;</span><span class="pln">i</span><span class="pun">++){</span><span class="pln">
	</span><span class="typ">ListItem</span><span class="pln"> item</span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">ListItem</span><span class="pun">();</span><span class="pln">

  	item</span><span class="pun">.</span><span class="pln">imgSrc</span><span class="pun">=</span><span class="pln">colorsImage</span><span class="pun">;</span><span class="pln">
	item</span><span class="pun">.</span><span class="pln">title </span><span class="pun">=</span><span class="pln"> colorsArray</span><span class="pun">;</span><span class="pln">
	item</span><span class="pun">.</span><span class="pln">desc </span><span class="pun">=</span><span class="pln"> colorsArray </span><span class="pun">+</span><span class="pln"> </span><span class="str">" Color!"</span><span class="pun">;</span><span class="pln">
	items</span><span class="pun">.</span><span class="pln">add</span><span class="pun">(</span><span class="pln">item</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	ثانيًا بعد ذلك نصنع الكائن الخاص بالـ <span style="font-family:courier new,courier,monospace;">ArrayAdapter</span> ولكننا لا يمكننا استخدام الصنف الأساسي من <span style="font-family:courier new,courier,monospace;">ArrayAdapter</span> حيث أنه لا يعمل إلا مع نص واحد فقط ولن يمكننا تغيير الصورة أو النص الثاني، لذا ينبغي علينا صنع الصنف <span style="font-family:courier new,courier,monospace;">ArrayAdapter</span> الخاص بنا.
</p>

<p>
	بنفس الطريقة السابقة نصنع صنف جديد من داخل المجلد Java، اضغط بالزر الأيمن على اسم الحزمة الخاصة بالمشروع واختر<strong> New &gt; Java Class </strong>ثم اكتب اسم الصنف الجديد <span style="font-family:courier new,courier,monospace;">CustomArrayAdapter</span>.
</p>

<p>
	يجب أن يرث هذا الصنف الفرعي من الصنف الأساسي <span style="font-family:courier new,courier,monospace;">ArrayAdapter</span>.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_3248_25">
<span class="kwd">public</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">CustomArrayAdapter</span><span class="pln"> extends </span><span class="typ">ArrayAdapter</span></pre>

<p>
	ثم نقوم بكتابة دالة البناء الخاصة بهذا الصنف ونستدعى في بدايتها دالة البناء الخاصة بالصنف الأب، وتحتاج دالة البناء لكائن من الصنف <span style="font-family:courier new,courier,monospace;">Context</span> وهو السياق الذي سيعمل فيه هذا الـ <span style="font-family:courier new,courier,monospace;">Adapter</span> أي النشاط الذي سيعمل به، كما يحتاج إلى واجهة المستخدم التي تكون شكل الصف، وقائمة البيانات التي سيتم عرضها.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_3248_47">
<span class="kwd">private</span><span class="pln"> </span><span class="typ">Context</span><span class="pln"> con</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">private</span><span class="pln"> </span><span class="typ">ArrayList</span><span class="pun">&lt;</span><span class="typ">ListItem</span><span class="pun">&gt;</span><span class="pln"> data</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">private</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> resLayout</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">public</span><span class="pln"> </span><span class="typ">CustomArrayAdapter</span><span class="pun">(</span><span class="typ">Context</span><span class="pln"> context</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> resource</span><span class="pun">,</span><span class="pln"> </span><span class="typ">List</span><span class="pln"> objects</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
	super</span><span class="pun">(</span><span class="pln">context</span><span class="pun">,</span><span class="pln"> resource</span><span class="pun">,</span><span class="pln">objects</span><span class="pun">);</span><span class="pln">
	con </span><span class="pun">=</span><span class="pln"> context</span><span class="pun">;</span><span class="pln">
	resLayout </span><span class="pun">=</span><span class="pln"> resource</span><span class="pun">;</span><span class="pln">
	data </span><span class="pun">=(</span><span class="typ">ArrayList</span><span class="pun">)</span><span class="pln"> objects</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	يوجد تابع داخل <span style="font-family:courier new,courier,monospace;">ArrayAdapter</span> يُدعى <span style="font-family:courier new,courier,monospace;">()getCount</span> ويتم استخدامه بشكل تلقائي عندما يريد الكائن الذي سنصنعه من <span style="font-family:courier new,courier,monospace;">CustomArrayAdapter</span> معرفة عدد العناصر التي سيقوم بعرضها داخل قائمة العرض، لذا فهو يستدعي التابع <span style="font-family:courier new,courier,monospace;">()size</span> باستخدام الكائن الخاص بالبيانات.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_3248_49">
<span class="lit">@Override</span><span class="pln">
</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> getCount</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
	</span><span class="kwd">return</span><span class="pln"> data</span><span class="pun">.</span><span class="pln">size</span><span class="pun">();</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	وبداخل الصنف الأب <span style="font-family:courier new,courier,monospace;">ArrayAdapter</span> يوجد أيضًا تابع يُدعى <span style="font-family:courier new,courier,monospace;">()getView</span>، وهو المسؤول عن تكوين الشكل الخاص بالصف المعروض في قائمة العرض لذا كي نصنع الصف الخاص بنا يجب علينا تعديل هذا التابع.
</p>

<p>
	ولتعديل التابع نقوم بكتابته بطريقتنا الخاصة كما يلي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_3248_51">
<span class="lit">@Override</span><span class="pln">
</span><span class="kwd">public</span><span class="pln"> </span><span class="typ">View</span><span class="pln"> getView</span><span class="pun">(</span><span class="kwd">int</span><span class="pln"> position</span><span class="pun">,</span><span class="pln"> </span><span class="typ">View</span><span class="pln"> convertView</span><span class="pun">,</span><span class="pln"> </span><span class="typ">ViewGroup</span><span class="pln"> parent</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">

	inflater </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="typ">LayoutInflater</span><span class="pun">)</span><span class="pln"> con</span><span class="pun">.</span><span class="pln">getSystemService</span><span class="pun">(</span><span class="typ">Context</span><span class="pun">.</span><span class="pln">LAYOUT_INFLATER_SERVICE</span><span class="pun">);</span><span class="pln">

	</span><span class="typ">View</span><span class="pln"> rootView </span><span class="pun">=</span><span class="pln"> inflater</span><span class="pun">.</span><span class="pln">inflate</span><span class="pun">(</span><span class="pln">resLayout</span><span class="pun">,</span><span class="kwd">null</span><span class="pun">);</span><span class="pln">
	</span><span class="typ">ImageView</span><span class="pln"> img </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="typ">ImageView</span><span class="pun">)</span><span class="pln"> rootView</span><span class="pun">.</span><span class="pln">findViewById</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">id</span><span class="pun">.</span><span class="pln">imgview</span><span class="pun">);</span><span class="pln">
	</span><span class="typ">TextView</span><span class="pln"> title </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="typ">TextView</span><span class="pun">)</span><span class="pln"> rootView</span><span class="pun">.</span><span class="pln">findViewById</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">id</span><span class="pun">.</span><span class="pln">titleview</span><span class="pun">);</span><span class="pln">
	</span><span class="typ">TextView</span><span class="pln"> desc </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="typ">TextView</span><span class="pun">)</span><span class="pln"> rootView</span><span class="pun">.</span><span class="pln">findViewById</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">id</span><span class="pun">.</span><span class="pln">descview</span><span class="pun">);</span><span class="pln">

	</span><span class="typ">ListItem</span><span class="pln"> item </span><span class="pun">=</span><span class="pln"> data</span><span class="pun">.</span><span class="kwd">get</span><span class="pun">(</span><span class="pln">position</span><span class="pun">);</span><span class="pln">
	img</span><span class="pun">.</span><span class="pln">setImageResource</span><span class="pun">(</span><span class="pln">item</span><span class="pun">.</span><span class="pln">imgSrc</span><span class="pun">);</span><span class="pln">
	title</span><span class="pun">.</span><span class="pln">setText</span><span class="pun">(</span><span class="pln">item</span><span class="pun">.</span><span class="pln">title</span><span class="pun">);</span><span class="pln">
	desc</span><span class="pun">.</span><span class="pln">setText</span><span class="pun">(</span><span class="pln">item</span><span class="pun">.</span><span class="pln">desc</span><span class="pun">);</span><span class="pln">

	</span><span class="kwd">return</span><span class="pln"> rootView</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	داخل التابع نبدأ أولًا بطلب الكائن <span style="font-family:courier new,courier,monospace;">LayoutInflater</span> وهو المسؤول عن تحويل ملف XML إلى كائن من النوع <span style="font-family:courier new,courier,monospace;">View</span> وللحصول عليه نستخدم التابع <span style="font-family:courier new,courier,monospace;">()getSystemService </span>والذي يوفر مجموعة مختلفة من الخدمات منها الكائن <span style="font-family:courier new,courier,monospace;">LayoutInflater</span>، ويتم تحديد نوع الخدمة المطلوبة عن طريق تمرير ثابت محدد وفي هذه الحالة هو <span style="font-family:courier new,courier,monospace;">Context.LAYOUT_INFLATER_SERVICE</span>.
</p>

<p>
	بعد الحصول على هذا الكائن نستدعي التابع <span style="font-family:courier new,courier,monospace;">()inflate</span> ونمرر له ملف XML الذي نرغب في تحويله إلى كائن في ملف الجافا.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_3248_53">
<span class="pln">inflater </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="typ">LayoutInflater</span><span class="pun">)</span><span class="pln"> con</span><span class="pun">.</span><span class="pln">getSystemService</span><span class="pun">(</span><span class="typ">Context</span><span class="pun">.</span><span class="pln">LAYOUT_INFLATER_SERVICE</span><span class="pun">);</span><span class="pln">
</span><span class="typ">View</span><span class="pln"> rootView </span><span class="pun">=</span><span class="pln"> inflater</span><span class="pun">.</span><span class="pln">inflate</span><span class="pun">(</span><span class="pln">resLayout</span><span class="pun">,</span><span class="kwd">null</span><span class="pun">);</span></pre>

<p>
	الآن لربط عناصر الواجهة بالشيفرة نستخدم التابع <span style="font-family:courier new,courier,monospace;">()findViewById</span> ولكنا هنا لا نستطيع استخدامه مباشرة كما كنا نفعل عند وجودنا داخل شيفرة النشاط، لذا يجب أن نستدعي التابع باستخدام الكائن من الصنف <span style="font-family:courier new,courier,monospace;">View</span> الذي حصلنا عليه من التابع <span style="font-family:courier new,courier,monospace;">()inflate</span>.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_3248_55">
<span class="typ">ImageView</span><span class="pln"> img </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="typ">ImageView</span><span class="pun">)</span><span class="pln"> rootView</span><span class="pun">.</span><span class="pln">findViewById</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">id</span><span class="pun">.</span><span class="pln">imgview</span><span class="pun">);</span><span class="pln">
</span><span class="typ">TextView</span><span class="pln"> title </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="typ">TextView</span><span class="pun">)</span><span class="pln"> rootView</span><span class="pun">.</span><span class="pln">findViewById</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">id</span><span class="pun">.</span><span class="pln">titleview</span><span class="pun">);</span><span class="pln">
</span><span class="typ">TextView</span><span class="pln"> desc </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="typ">TextView</span><span class="pun">)</span><span class="pln"> rootView</span><span class="pun">.</span><span class="pln">findViewById</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">id</span><span class="pun">.</span><span class="pln">descview</span><span class="pun">);</span></pre>

<p>
	أخيرًا نأتي بالبيانات المناسبة للعنصر من داخل الـ <span style="font-family:courier new,courier,monospace;">ArrayList</span> ثم نضع بداخل كل عنصر من عناصر الواجهة البيانات الخاصة به.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_3248_57">
<span class="typ">ListItem</span><span class="pln"> item </span><span class="pun">=</span><span class="pln"> data</span><span class="pun">.</span><span class="kwd">get</span><span class="pun">(</span><span class="pln">position</span><span class="pun">);</span><span class="pln">
img</span><span class="pun">.</span><span class="pln">setImageResource</span><span class="pun">(</span><span class="pln">item</span><span class="pun">.</span><span class="pln">imgSrc</span><span class="pun">);</span><span class="pln">
title</span><span class="pun">.</span><span class="pln">setText</span><span class="pun">(</span><span class="pln">item</span><span class="pun">.</span><span class="pln">title</span><span class="pun">);</span><span class="pln">
desc</span><span class="pun">.</span><span class="pln">setText</span><span class="pun">(</span><span class="pln">item</span><span class="pun">.</span><span class="pln">desc</span><span class="pun">);</span></pre>

<p>
	لتصبح الشيفرة النهائية داخل الصنف <span style="font-family:courier new,courier,monospace;">CustomArrayAdapter:</span>
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_3248_45">
<span class="pln">package apps</span><span class="pun">.</span><span class="pln">noby</span><span class="pun">.</span><span class="pln">customlistviewexample</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">content</span><span class="pun">.</span><span class="typ">Context</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">view</span><span class="pun">.</span><span class="typ">LayoutInflater</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">view</span><span class="pun">.</span><span class="typ">View</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">view</span><span class="pun">.</span><span class="typ">ViewGroup</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">widget</span><span class="pun">.</span><span class="typ">ArrayAdapter</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">widget</span><span class="pun">.</span><span class="typ">ImageView</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">widget</span><span class="pun">.</span><span class="typ">TextView</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">import</span><span class="pln"> java</span><span class="pun">.</span><span class="pln">util</span><span class="pun">.</span><span class="typ">ArrayList</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> java</span><span class="pun">.</span><span class="pln">util</span><span class="pun">.</span><span class="typ">List</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">CustomArrayAdapter</span><span class="pln"> extends </span><span class="typ">ArrayAdapter</span><span class="pln"> </span><span class="pun">{</span><span class="pln">

	</span><span class="kwd">private</span><span class="pln"> </span><span class="typ">Context</span><span class="pln"> con</span><span class="pun">;</span><span class="pln">
	</span><span class="kwd">private</span><span class="pln"> </span><span class="typ">ArrayList</span><span class="pun">&lt;</span><span class="typ">ListItem</span><span class="pun">&gt;</span><span class="pln"> data</span><span class="pun">;</span><span class="pln">
	</span><span class="kwd">private</span><span class="pln"> </span><span class="typ">LayoutInflater</span><span class="pln"> inflater</span><span class="pun">;</span><span class="pln">
	</span><span class="kwd">private</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> resLayout</span><span class="pun">;</span><span class="pln">

	</span><span class="kwd">public</span><span class="pln"> </span><span class="typ">CustomArrayAdapter</span><span class="pun">(</span><span class="typ">Context</span><span class="pln"> context</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> resource</span><span class="pun">,</span><span class="pln"> </span><span class="typ">List</span><span class="pln"> objects</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
		super</span><span class="pun">(</span><span class="pln">context</span><span class="pun">,</span><span class="pln"> resource</span><span class="pun">,</span><span class="pln">objects</span><span class="pun">);</span><span class="pln">
		con </span><span class="pun">=</span><span class="pln"> context</span><span class="pun">;</span><span class="pln">
		data </span><span class="pun">=(</span><span class="typ">ArrayList</span><span class="pun">)</span><span class="pln"> objects</span><span class="pun">;</span><span class="pln">
		resLayout </span><span class="pun">=</span><span class="pln"> resource</span><span class="pun">;</span><span class="pln">
	</span><span class="pun">}</span><span class="pln">

	</span><span class="lit">@Override</span><span class="pln">
	</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> getCount</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
		</span><span class="kwd">return</span><span class="pln"> data</span><span class="pun">.</span><span class="pln">size</span><span class="pun">();</span><span class="pln">
	</span><span class="pun">}</span><span class="pln">

	</span><span class="lit">@Override</span><span class="pln">
	</span><span class="kwd">public</span><span class="pln"> </span><span class="typ">View</span><span class="pln"> getView</span><span class="pun">(</span><span class="kwd">int</span><span class="pln"> position</span><span class="pun">,</span><span class="pln"> </span><span class="typ">View</span><span class="pln"> convertView</span><span class="pun">,</span><span class="pln"> </span><span class="typ">ViewGroup</span><span class="pln"> parent</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
		inflater </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="typ">LayoutInflater</span><span class="pun">)</span><span class="pln"> con</span><span class="pun">.</span><span class="pln">getSystemService</span><span class="pun">(</span><span class="typ">Context</span><span class="pun">.</span><span class="pln">LAYOUT_INFLATER_SERVICE</span><span class="pun">);</span><span class="pln">

		</span><span class="typ">View</span><span class="pln"> rootView </span><span class="pun">=</span><span class="pln"> inflater</span><span class="pun">.</span><span class="pln">inflate</span><span class="pun">(</span><span class="pln">resLayout</span><span class="pun">,</span><span class="kwd">null</span><span class="pun">);</span><span class="pln">
		</span><span class="typ">ImageView</span><span class="pln"> img </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="typ">ImageView</span><span class="pun">)</span><span class="pln"> rootView</span><span class="pun">.</span><span class="pln">findViewById</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">id</span><span class="pun">.</span><span class="pln">imgview</span><span class="pun">);</span><span class="pln">
		</span><span class="typ">TextView</span><span class="pln"> title </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="typ">TextView</span><span class="pun">)</span><span class="pln"> rootView</span><span class="pun">.</span><span class="pln">findViewById</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">id</span><span class="pun">.</span><span class="pln">titleview</span><span class="pun">);</span><span class="pln">
		</span><span class="typ">TextView</span><span class="pln"> desc </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="typ">TextView</span><span class="pun">)</span><span class="pln"> rootView</span><span class="pun">.</span><span class="pln">findViewById</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">id</span><span class="pun">.</span><span class="pln">descview</span><span class="pun">);</span><span class="pln">

		</span><span class="typ">ListItem</span><span class="pln"> item </span><span class="pun">=</span><span class="pln"> data</span><span class="pun">.</span><span class="kwd">get</span><span class="pun">(</span><span class="pln">position</span><span class="pun">);</span><span class="pln">
		img</span><span class="pun">.</span><span class="pln">setImageResource</span><span class="pun">(</span><span class="pln">item</span><span class="pun">.</span><span class="pln">imgSrc</span><span class="pun">);</span><span class="pln">
		title</span><span class="pun">.</span><span class="pln">setText</span><span class="pun">(</span><span class="pln">item</span><span class="pun">.</span><span class="pln">title</span><span class="pun">);</span><span class="pln">
		desc</span><span class="pun">.</span><span class="pln">setText</span><span class="pun">(</span><span class="pln">item</span><span class="pun">.</span><span class="pln">desc</span><span class="pun">);</span><span class="pln">

		</span><span class="kwd">return</span><span class="pln"> rootView</span><span class="pun">;</span><span class="pln">
	</span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	  نعود مجددًا إلى ملف <span style="font-family:courier new,courier,monospace;">MainActivity.java</span> لإنشاء كائن من الصنف الذي صنعناه:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_3248_59">
<span class="kwd">private</span><span class="pln"> </span><span class="typ">CustomArrayAdapter</span><span class="pln"> adapter</span><span class="pun">;</span><span class="pln">

adapter </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">CustomArrayAdapter</span><span class="pun">(</span><span class="kwd">this</span><span class="pun">,</span><span class="pln">R</span><span class="pun">.</span><span class="pln">layout</span><span class="pun">.</span><span class="pln">row_item</span><span class="pun">,</span><span class="pln">items</span><span class="pun">);</span></pre>

<p>
	ثالثًا نربط قائمة العرض بالشيفرة ونستدعي التابع <span style="font-family:courier new,courier,monospace;">()setAdapter</span>:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_3248_61">
<span class="kwd">private</span><span class="pln"> </span><span class="typ">ListView</span><span class="pln"> customLV</span><span class="pun">;</span><span class="pln">

customLV </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="typ">ListView</span><span class="pun">)</span><span class="pln"> findViewById</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">id</span><span class="pun">.</span><span class="pln">listview</span><span class="pun">);</span><span class="pln">
customLV</span><span class="pun">.</span><span class="pln">setAdapter</span><span class="pun">(</span><span class="pln">adapter</span><span class="pun">);</span></pre>

<p>
	بهذا نكون قد انتهينا من تكوين قائمة العرض المطلوبة، يتبقى أن نجعل عناصر قائمة العرض تستجيب عند الضغط عليها وتقوم بفتح نشاط جديد، لذا أولًا نقوم بعمل نشاط جديد بالضغط بالزر اليمن على اسم الحزمة واختيار:
</p>

<p style="text-align: center;">
	<strong>New &gt; Activity &gt; Empty Activity </strong>
</p>

<p>
	ونسميها <span style="font-family:courier new,courier,monospace;">DescriptionActivity</span>.
</p>

<p>
	ولفتح هذا النشاط عند الضغط على عناصر قائمة العرض نقوم باستدعاء التابع<span style="font-family:courier new,courier,monospace;"> ()setOnItemClickListener</span> وبداخله نفتح النشاط الجديد ونرسل إليه اسم العنصر الذي قام بفتحه حتى يعرضه.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_3248_43">
<span class="pln">package apps</span><span class="pun">.</span><span class="pln">noby</span><span class="pun">.</span><span class="pln">customlistviewexample</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">app</span><span class="pun">.</span><span class="typ">Activity</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">content</span><span class="pun">.</span><span class="typ">Intent</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">os</span><span class="pun">.</span><span class="typ">Bundle</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">view</span><span class="pun">.</span><span class="typ">View</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">widget</span><span class="pun">.</span><span class="typ">AdapterView</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">widget</span><span class="pun">.</span><span class="typ">ListView</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> java</span><span class="pun">.</span><span class="pln">util</span><span class="pun">.</span><span class="typ">ArrayList</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">MainActivity</span><span class="pln"> extends </span><span class="typ">Activity</span><span class="pln"> </span><span class="pun">{</span><span class="pln">

	</span><span class="kwd">private</span><span class="pln"> </span><span class="typ">ListView</span><span class="pln"> customLV</span><span class="pun">;</span><span class="pln">
	</span><span class="kwd">private</span><span class="pln"> </span><span class="typ">CustomArrayAdapter</span><span class="pln"> adapter</span><span class="pun">;</span><span class="pln">
	</span><span class="kwd">private</span><span class="pln"> </span><span class="typ">ArrayList</span><span class="pun">&lt;</span><span class="typ">ListItem</span><span class="pun">&gt;</span><span class="pln"> items</span><span class="pun">;</span><span class="pln">
	</span><span class="typ">String</span><span class="pln"> </span><span class="pun">[]</span><span class="pln"> colorsArray </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="str">"Red"</span><span class="pun">,</span><span class="str">"Yellow"</span><span class="pun">,</span><span class="str">"Blue"</span><span class="pun">,</span><span class="str">"Black"</span><span class="pun">,</span><span class="str">"Green"</span><span class="pun">,</span><span class="str">"Brown"</span><span class="pun">,</span><span class="str">"Grey"</span><span class="pun">};</span><span class="pln">
	</span><span class="kwd">int</span><span class="pln"> </span><span class="pun">[]</span><span class="pln"> colorsImage </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln">R</span><span class="pun">.</span><span class="pln">drawable</span><span class="pun">.</span><span class="pln">red</span><span class="pun">,</span><span class="pln">R</span><span class="pun">.</span><span class="pln">drawable</span><span class="pun">.</span><span class="pln">yellow</span><span class="pun">,</span><span class="pln">R</span><span class="pun">.</span><span class="pln">drawable</span><span class="pun">.</span><span class="pln">blue</span><span class="pun">,</span><span class="pln">R</span><span class="pun">.</span><span class="pln">drawable</span><span class="pun">.</span><span class="pln">black</span><span class="pun">,</span><span class="pln">R</span><span class="pun">.</span><span class="pln">drawable</span><span class="pun">.</span><span class="pln">green</span><span class="pun">,</span><span class="pln">R</span><span class="pun">.</span><span class="pln">drawable</span><span class="pun">.</span><span class="pln">brown</span><span class="pun">,</span><span class="pln">R</span><span class="pun">.</span><span class="pln">drawable</span><span class="pun">.</span><span class="pln">grey</span><span class="pun">};</span><span class="pln">
	</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">static</span><span class="pln"> final </span><span class="typ">String</span><span class="pln"> COLOR_KEY </span><span class="pun">=</span><span class="pln"> </span><span class="str">"colorName"</span><span class="pun">;</span><span class="pln">

	</span><span class="lit">@Override</span><span class="pln">
	</span><span class="kwd">protected</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> onCreate</span><span class="pun">(</span><span class="typ">Bundle</span><span class="pln"> savedInstanceState</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
		super</span><span class="pun">.</span><span class="pln">onCreate</span><span class="pun">(</span><span class="pln">savedInstanceState</span><span class="pun">);</span><span class="pln">
		setContentView</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">layout</span><span class="pun">.</span><span class="pln">activity_main</span><span class="pun">);</span><span class="pln">
		items </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">ArrayList</span><span class="pun">&lt;</span><span class="typ">ListItem</span><span class="pun">&gt;();</span><span class="pln">

		</span><span class="kwd">for</span><span class="pun">(</span><span class="kwd">int</span><span class="pln"> i</span><span class="pun">=</span><span class="lit">0</span><span class="pun">;</span><span class="pln">i</span><span class="pun">&lt;</span><span class="pln">colorsArray</span><span class="pun">.</span><span class="pln">length</span><span class="pun">;</span><span class="pln">i</span><span class="pun">++){</span><span class="pln">
			</span><span class="typ">ListItem</span><span class="pln"> item</span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">ListItem</span><span class="pun">();</span><span class="pln">
			item</span><span class="pun">.</span><span class="pln">imgSrc</span><span class="pun">=</span><span class="pln">colorsImage</span><span class="pun">;</span><span class="pln">
			item</span><span class="pun">.</span><span class="pln">title </span><span class="pun">=</span><span class="pln"> colorsArray</span><span class="pun">;</span><span class="pln">
			item</span><span class="pun">.</span><span class="pln">desc </span><span class="pun">=</span><span class="pln"> colorsArray </span><span class="pun">+</span><span class="pln"> </span><span class="str">" Color!"</span><span class="pun">;</span><span class="pln">
			items</span><span class="pun">.</span><span class="pln">add</span><span class="pun">(</span><span class="pln">item</span><span class="pun">);</span><span class="pln">
		</span><span class="pun">}</span><span class="pln">

		customLV </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="typ">ListView</span><span class="pun">)</span><span class="pln"> findViewById</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">id</span><span class="pun">.</span><span class="pln">listview</span><span class="pun">);</span><span class="pln">
		adapter </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">CustomArrayAdapter</span><span class="pun">(</span><span class="kwd">this</span><span class="pun">,</span><span class="pln">R</span><span class="pun">.</span><span class="pln">layout</span><span class="pun">.</span><span class="pln">row_item</span><span class="pun">,</span><span class="pln">items</span><span class="pun">);</span><span class="pln">
		customLV</span><span class="pun">.</span><span class="pln">setAdapter</span><span class="pun">(</span><span class="pln">adapter</span><span class="pun">);</span><span class="pln">

		customLV</span><span class="pun">.</span><span class="pln">setOnItemClickListener</span><span class="pun">(</span><span class="kwd">new</span><span class="pln"> </span><span class="typ">AdapterView</span><span class="pun">.</span><span class="typ">OnItemClickListener</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
			</span><span class="lit">@Override</span><span class="pln">
			</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> onItemClick</span><span class="pun">(</span><span class="typ">AdapterView</span><span class="pun">&lt;?&gt;</span><span class="pln"> parent</span><span class="pun">,</span><span class="pln"> </span><span class="typ">View</span><span class="pln"> view</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> position</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">long</span><span class="pln"> id</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
				</span><span class="typ">Intent</span><span class="pln"> intent </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Intent</span><span class="pun">(</span><span class="typ">MainActivity</span><span class="pun">.</span><span class="kwd">this</span><span class="pun">,</span><span class="typ">DescriptionActivity</span><span class="pun">.</span><span class="kwd">class</span><span class="pun">);</span><span class="pln">
				intent</span><span class="pun">.</span><span class="pln">putExtra</span><span class="pun">(</span><span class="pln">COLOR_KEY</span><span class="pun">,</span><span class="pln">colorsArray</span><span class="pun">[</span><span class="pln">position</span><span class="pun">]);</span><span class="pln">
				startActivity</span><span class="pun">(</span><span class="pln">intent</span><span class="pun">);</span><span class="pln">
			</span><span class="pun">}</span><span class="pln">
		</span><span class="pun">});</span><span class="pln">
	</span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	  أخيرًا نقوم بتهيئة واجهة المستخدم الخاصة بالنشاط الجديد لتعرض النص المرسل إليها.
</p>

<pre class="ipsCode prettyprint lang-xml prettyprinted" id="ips_uid_3248_41">
<span class="pun">&lt;?</span><span class="pln">xml version</span><span class="pun">=</span><span class="str">"1.0"</span><span class="pln"> encoding</span><span class="pun">=</span><span class="str">"utf-8"</span><span class="pun">?&gt;</span><span class="pln">
</span><span class="tag">&lt;LinearLayout</span><span class="pln"> </span><span class="atn">xmlns:android</span><span class="pun">=</span><span class="atv">"http://schemas.android.com/apk/res/android"</span><span class="pln">
	</span><span class="atn">android:layout_width</span><span class="pun">=</span><span class="atv">"match_parent"</span><span class="pln">
	</span><span class="atn">android:layout_height</span><span class="pun">=</span><span class="atv">"match_parent"</span><span class="pln">
	</span><span class="atn">android:gravity</span><span class="pun">=</span><span class="atv">"center"</span><span class="tag">&gt;</span><span class="pln">

	</span><span class="tag">&lt;TextView</span><span class="pln">
		</span><span class="atn">android:layout_width</span><span class="pun">=</span><span class="atv">"wrap_content"</span><span class="pln">
		</span><span class="atn">android:layout_height</span><span class="pun">=</span><span class="atv">"wrap_content"</span><span class="pln">
		</span><span class="atn">android:id</span><span class="pun">=</span><span class="atv">"@+id/txt"</span><span class="pln">
		</span><span class="atn">android:textSize</span><span class="pun">=</span><span class="atv">"20sp"</span><span class="tag">/&gt;</span><span class="pln">
</span><span class="tag">&lt;/LinearLayout&gt;</span></pre>

<p>
	  ولعرض النص داخل الـ <span style="font-family:courier new,courier,monospace;">TextView</span> نقوم في الشيفرة باستدعاء الـ <span style="font-family:courier new,courier,monospace;">Intent</span> الذي قام بفتح النشاط واستخراج منه البيانات المرسلة وكتابتها على <span style="font-family:courier new,courier,monospace;">TextView</span> كما يلي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_3248_39">
<span class="pln">package apps</span><span class="pun">.</span><span class="pln">noby</span><span class="pun">.</span><span class="pln">customlistviewexample</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">app</span><span class="pun">.</span><span class="typ">Activity</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">os</span><span class="pun">.</span><span class="typ">Bundle</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">widget</span><span class="pun">.</span><span class="typ">TextView</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">DescriptionActivity</span><span class="pln"> extends </span><span class="typ">Activity</span><span class="pln"> </span><span class="pun">{</span><span class="pln">

	</span><span class="lit">@Override</span><span class="pln">
	</span><span class="kwd">protected</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> onCreate</span><span class="pun">(</span><span class="typ">Bundle</span><span class="pln"> savedInstanceState</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
		super</span><span class="pun">.</span><span class="pln">onCreate</span><span class="pun">(</span><span class="pln">savedInstanceState</span><span class="pun">);</span><span class="pln">
		setContentView</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">layout</span><span class="pun">.</span><span class="pln">activity_description</span><span class="pun">);</span><span class="pln">

		</span><span class="typ">String</span><span class="pln"> str </span><span class="pun">=</span><span class="pln"> getIntent</span><span class="pun">().</span><span class="pln">getStringExtra</span><span class="pun">(</span><span class="typ">MainActivity</span><span class="pun">.</span><span class="pln">COLOR_KEY</span><span class="pun">);</span><span class="pln">
		</span><span class="typ">TextView</span><span class="pln"> tv </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="typ">TextView</span><span class="pun">)</span><span class="pln"> findViewById</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">id</span><span class="pun">.</span><span class="pln">txt</span><span class="pun">);</span><span class="pln">
		tv</span><span class="pun">.</span><span class="pln">setText</span><span class="pun">(</span><span class="str">"Welcome to "</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> str </span><span class="pun">+</span><span class="pln"> </span><span class="str">" Color Home!!"</span><span class="pun">);</span><span class="pln">
	</span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	  والآن نقوم بتجربة التطبيق على المحاكي حتى نتأكد من عمله بالشكل المطلوب.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="18184" href="https://academy.hsoub.com/uploads/monthly_2016_06/8.png.1624a3f2765603650ad1100798aa290c.png" rel=""><img alt="8.png" class="ipsImage ipsImage_thumbnailed" data-fileid="18184" data-unique="mgwansii9" src="https://academy.hsoub.com/uploads/monthly_2016_06/8.thumb.png.8b620588f4952614d1187726efb07ecd.png"></a>
</p>

<h2>
	البحث داخل عناصر قائمة العرض التي تم تخصيصها
</h2>

<h3>
	تطبيق 6
</h3>

<p>
	في هذا التطبيق سنكرر ما قمنا به سابقًا من بحث عن نص معين داخل قائمة العرض ولكن الاختلاف هنا سيكون أن قائمة العرض ليست بهذه البساطة وتتكون من عنصر واحد فقط وهو النص، ولكنها تتكون من صور وعدة نصوص مختلفة لذا ينبغي علينا أن نصنع بأنفسنا طريقتنا الخاصة للبحث وتنقية العناصر من القائمة وترك العناصر التي يتم البحث عنها.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="18185" href="https://academy.hsoub.com/uploads/monthly_2016_06/9.png.a629209b123d9e68026cf3a9eec6a3ee.png" rel=""><img alt="9.png" class="ipsImage ipsImage_thumbnailed" data-fileid="18185" data-unique="u081tihes" src="https://academy.hsoub.com/uploads/monthly_2016_06/9.thumb.png.3c50956393e5a008d5c294bd650d6008.png"></a>
</p>

<p>
	أولًا نقوم بتغيير ملف الواجهة <span style="font-family:courier new,courier,monospace;">activity_main.xml</span> وإضافة عنصر <span style="font-family:courier new,courier,monospace;">EditText</span>.
</p>

<pre class="ipsCode prettyprint lang-xml prettyprinted" id="ips_uid_3248_37">
<span class="pun">&lt;?</span><span class="pln">xml version</span><span class="pun">=</span><span class="str">"1.0"</span><span class="pln"> encoding</span><span class="pun">=</span><span class="str">"utf-8"</span><span class="pun">?&gt;</span><span class="pln">
</span><span class="tag">&lt;LinearLayout</span><span class="pln"> </span><span class="atn">xmlns:android</span><span class="pun">=</span><span class="atv">"http://schemas.android.com/apk/res/android"</span><span class="pln">
	</span><span class="atn">android:layout_width</span><span class="pun">=</span><span class="atv">"match_parent"</span><span class="pln">
	</span><span class="atn">android:layout_height</span><span class="pun">=</span><span class="atv">"match_parent"</span><span class="pln">
	</span><span class="atn">android:orientation</span><span class="pun">=</span><span class="atv">"vertical"</span><span class="tag">&gt;</span><span class="pln">
  
	</span><span class="tag">&lt;EditText</span><span class="pln">
		</span><span class="atn">android:layout_width</span><span class="pun">=</span><span class="atv">"match_parent"</span><span class="pln">
		</span><span class="atn">android:layout_height</span><span class="pun">=</span><span class="atv">"wrap_content"</span><span class="pln">
		</span><span class="atn">android:drawableLeft</span><span class="pun">=</span><span class="atv">"@drawable/ic_search_black_24dp"</span><span class="pln">
		</span><span class="atn">android:hint</span><span class="pun">=</span><span class="atv">"Search..."</span><span class="pln">
		</span><span class="atn">android:id</span><span class="pun">=</span><span class="atv">"@+id/searchedittext"</span><span class="tag">/&gt;</span><span class="pln">

	</span><span class="tag">&lt;ListView</span><span class="pln">
		</span><span class="atn">android:layout_width</span><span class="pun">=</span><span class="atv">"match_parent"</span><span class="pln">
		</span><span class="atn">android:layout_height</span><span class="pun">=</span><span class="atv">"match_parent"</span><span class="pln">
		</span><span class="atn">android:id</span><span class="pun">=</span><span class="atv">"@+id/listview"</span><span class="tag">/&gt;</span><span class="pln">
</span><span class="tag">&lt;/LinearLayout&gt;</span></pre>

<p>
	ثانيًا نربط عنصر <span style="font-family:courier new,courier,monospace;">EditText</span> في الشيفرة الأساسية ونستدعي التابع<span style="font-family:courier new,courier,monospace;"> ()addTextChangedListener</span> وبداخل الدالة <span style="font-family:courier new,courier,monospace;">()onTextChanged </span>نستدعي التابع الخاص بالتنقية كما سبق.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_3248_35">
<span class="pln">package apps</span><span class="pun">.</span><span class="pln">noby</span><span class="pun">.</span><span class="pln">customlistviewexample</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">app</span><span class="pun">.</span><span class="typ">Activity</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">content</span><span class="pun">.</span><span class="typ">Intent</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">os</span><span class="pun">.</span><span class="typ">Bundle</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">text</span><span class="pun">.</span><span class="typ">Editable</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">text</span><span class="pun">.</span><span class="typ">TextWatcher</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">view</span><span class="pun">.</span><span class="typ">View</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">widget</span><span class="pun">.</span><span class="typ">AdapterView</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">widget</span><span class="pun">.</span><span class="typ">EditText</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">widget</span><span class="pun">.</span><span class="typ">ListView</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> java</span><span class="pun">.</span><span class="pln">util</span><span class="pun">.</span><span class="typ">ArrayList</span><span class="pun">;</span><span class="pln">


</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">MainActivity</span><span class="pln"> extends </span><span class="typ">Activity</span><span class="pln"> </span><span class="pun">{</span><span class="pln">

	</span><span class="kwd">private</span><span class="pln"> </span><span class="typ">ListView</span><span class="pln"> customLV</span><span class="pun">;</span><span class="pln">
	</span><span class="kwd">private</span><span class="pln"> </span><span class="typ">CustomArrayAdapter</span><span class="pln"> adapter</span><span class="pun">;</span><span class="pln">
	</span><span class="kwd">private</span><span class="pln"> </span><span class="typ">ArrayList</span><span class="pun">&lt;</span><span class="typ">ListItem</span><span class="pun">&gt;</span><span class="pln"> items</span><span class="pun">;</span><span class="pln">
	</span><span class="typ">String</span><span class="pun">[]</span><span class="pln"> colorsArray </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="str">"Red"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Yellow"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Blue"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Black"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Green"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Brown"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Grey"</span><span class="pun">};</span><span class="pln">
	</span><span class="kwd">int</span><span class="pun">[]</span><span class="pln"> colorsImage </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln">R</span><span class="pun">.</span><span class="pln">drawable</span><span class="pun">.</span><span class="pln">red</span><span class="pun">,</span><span class="pln"> R</span><span class="pun">.</span><span class="pln">drawable</span><span class="pun">.</span><span class="pln">yellow</span><span class="pun">,</span><span class="pln"> R</span><span class="pun">.</span><span class="pln">drawable</span><span class="pun">.</span><span class="pln">blue</span><span class="pun">,</span><span class="pln"> R</span><span class="pun">.</span><span class="pln">drawable</span><span class="pun">.</span><span class="pln">black</span><span class="pun">,</span><span class="pln"> R</span><span class="pun">.</span><span class="pln">drawable</span><span class="pun">.</span><span class="pln">green</span><span class="pun">,</span><span class="pln"> R</span><span class="pun">.</span><span class="pln">drawable</span><span class="pun">.</span><span class="pln">brown</span><span class="pun">,</span><span class="pln"> 	R</span><span class="pun">.</span><span class="pln">drawable</span><span class="pun">.</span><span class="pln">grey</span><span class="pun">};</span><span class="pln">
	</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">static</span><span class="pln"> final </span><span class="typ">String</span><span class="pln"> COLOR_KEY </span><span class="pun">=</span><span class="pln"> </span><span class="str">"colorName"</span><span class="pun">;</span><span class="pln">
	</span><span class="typ">EditText</span><span class="pln"> searchET</span><span class="pun">;</span><span class="pln">

	</span><span class="lit">@Override</span><span class="pln">
	</span><span class="kwd">protected</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> onCreate</span><span class="pun">(</span><span class="typ">Bundle</span><span class="pln"> savedInstanceState</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
		super</span><span class="pun">.</span><span class="pln">onCreate</span><span class="pun">(</span><span class="pln">savedInstanceState</span><span class="pun">);</span><span class="pln">
		setContentView</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">layout</span><span class="pun">.</span><span class="pln">activity_main</span><span class="pun">);</span><span class="pln">
		items </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">ArrayList</span><span class="pun">&lt;</span><span class="typ">ListItem</span><span class="pun">&gt;();</span><span class="pln">

		</span><span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">int</span><span class="pln"> i </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln"> i </span><span class="pun">&lt;</span><span class="pln"> colorsArray</span><span class="pun">.</span><span class="pln">length</span><span class="pun">;</span><span class="pln"> i</span><span class="pun">++)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
			</span><span class="typ">ListItem</span><span class="pln"> item </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">ListItem</span><span class="pun">();</span><span class="pln">
			item</span><span class="pun">.</span><span class="pln">imgSrc </span><span class="pun">=</span><span class="pln"> colorsImage</span><span class="pun">;</span><span class="pln">
			item</span><span class="pun">.</span><span class="pln">title </span><span class="pun">=</span><span class="pln"> colorsArray</span><span class="pun">;</span><span class="pln">
			item</span><span class="pun">.</span><span class="pln">desc </span><span class="pun">=</span><span class="pln"> colorsArray </span><span class="pun">+</span><span class="pln"> </span><span class="str">" Color!"</span><span class="pun">;</span><span class="pln">
			items</span><span class="pun">.</span><span class="pln">add</span><span class="pun">(</span><span class="pln">item</span><span class="pun">);</span><span class="pln">
		</span><span class="pun">}</span><span class="pln">
		searchET </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="typ">EditText</span><span class="pun">)</span><span class="pln"> findViewById</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">id</span><span class="pun">.</span><span class="pln">searchedittext</span><span class="pun">);</span><span class="pln">

		customLV </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="typ">ListView</span><span class="pun">)</span><span class="pln"> findViewById</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">id</span><span class="pun">.</span><span class="pln">listview</span><span class="pun">);</span><span class="pln">
		adapter </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">CustomArrayAdapter</span><span class="pun">(</span><span class="kwd">this</span><span class="pun">,</span><span class="pln"> R</span><span class="pun">.</span><span class="pln">layout</span><span class="pun">.</span><span class="pln">row_item</span><span class="pun">,</span><span class="pln"> items</span><span class="pun">);</span><span class="pln">
		customLV</span><span class="pun">.</span><span class="pln">setAdapter</span><span class="pun">(</span><span class="pln">adapter</span><span class="pun">);</span><span class="pln">

		customLV</span><span class="pun">.</span><span class="pln">setOnItemClickListener</span><span class="pun">(</span><span class="kwd">new</span><span class="pln"> </span><span class="typ">AdapterView</span><span class="pun">.</span><span class="typ">OnItemClickListener</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
			</span><span class="lit">@Override</span><span class="pln">
			</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> onItemClick</span><span class="pun">(</span><span class="typ">AdapterView</span><span class="pun">&lt;?&gt;</span><span class="pln"> parent</span><span class="pun">,</span><span class="pln"> </span><span class="typ">View</span><span class="pln"> view</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> position</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">long</span><span class="pln"> id</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
				</span><span class="typ">Intent</span><span class="pln"> intent </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Intent</span><span class="pun">(</span><span class="typ">MainActivity</span><span class="pun">.</span><span class="kwd">this</span><span class="pun">,</span><span class="pln"> </span><span class="typ">DescriptionActivity</span><span class="pun">.</span><span class="kwd">class</span><span class="pun">);</span><span class="pln">
				intent</span><span class="pun">.</span><span class="pln">putExtra</span><span class="pun">(</span><span class="pln">COLOR_KEY</span><span class="pun">,</span><span class="pln"> colorsArray</span><span class="pun">[</span><span class="pln">position</span><span class="pun">]);</span><span class="pln">
				startActivity</span><span class="pun">(</span><span class="pln">intent</span><span class="pun">);</span><span class="pln">
			</span><span class="pun">}</span><span class="pln">
		</span><span class="pun">});</span><span class="pln">

		searchET</span><span class="pun">.</span><span class="pln">addTextChangedListener</span><span class="pun">(</span><span class="kwd">new</span><span class="pln"> </span><span class="typ">TextWatcher</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
			</span><span class="lit">@Override</span><span class="pln">
			</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> beforeTextChanged</span><span class="pun">(</span><span class="typ">CharSequence</span><span class="pln"> s</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> start</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> count</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> after</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        	</span><span class="pun">}</span><span class="pln">

			</span><span class="lit">@Override</span><span class="pln">
			</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> onTextChanged</span><span class="pun">(</span><span class="typ">CharSequence</span><span class="pln"> s</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> start</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> before</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> count</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
				adapter</span><span class="pun">.</span><span class="pln">getFilter</span><span class="pun">().</span><span class="pln">filter</span><span class="pun">(</span><span class="pln">s</span><span class="pun">);</span><span class="pln">
			</span><span class="pun">}</span><span class="pln">

			</span><span class="lit">@Override</span><span class="pln">
			</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> afterTextChanged</span><span class="pun">(</span><span class="typ">Editable</span><span class="pln"> s</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
			</span><span class="pun">}</span><span class="pln">
		</span><span class="pun">});</span><span class="pln">
	</span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	  أخيرًا يتبقى أن نقوم بكتابة تابع التنقية الخاص بنا، وسنقوم بكتابته داخل الصنف <span style="font-family:courier new,courier,monospace;">CustomArrayAdapter</span>.
</p>

<p>
	داخل <span style="font-family:courier new,courier,monospace;">CustomArrayAdapter</span> نقوم بإنشاء كائن آخر من <span style="font-family:courier new,courier,monospace;">ArrayList</span> ونجعله يساوي البيانات التي سنضعها في قائمة العرض، مثله كالكائن data.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_3248_63">
<span class="kwd">private</span><span class="pln"> </span><span class="typ">ArrayList</span><span class="pun">&lt;</span><span class="typ">ListItem</span><span class="pun">&gt;</span><span class="pln"> dataTemp</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">public</span><span class="pln"> </span><span class="typ">CustomArrayAdapter</span><span class="pun">(</span><span class="typ">Context</span><span class="pln"> context</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> resource</span><span class="pun">,</span><span class="pln"> </span><span class="typ">ArrayList</span><span class="pun">&lt;</span><span class="typ">ListItem</span><span class="pun">&gt;</span><span class="pln"> objects</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
	super</span><span class="pun">(</span><span class="pln">context</span><span class="pun">,</span><span class="pln"> resource</span><span class="pun">,</span><span class="pln">objects</span><span class="pun">);</span><span class="pln">
	con </span><span class="pun">=</span><span class="pln"> context</span><span class="pun">;</span><span class="pln">
	data </span><span class="pun">=</span><span class="pln"> objects</span><span class="pun">;</span><span class="pln">
	resLayout </span><span class="pun">=</span><span class="pln"> resource</span><span class="pun">;</span><span class="pln">
	dataTemp </span><span class="pun">=</span><span class="pln"> objects</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	بعد ذلك نعيد كتابة التابع الخاص بالتنقية والمتواجد أيضًا داخل الأب <span style="font-family:courier new,courier,monospace;">Arrayadapter</span> لذا سنقوم بعمل <span style="font-family:courier new,courier,monospace;">Override</span> لهذا التابع.
</p>

<p>
	والتابع هو<span style="font-family:courier new,courier,monospace;"> ()getFilter</span> ويعيد كائن من الصنف <span style="font-family:courier new,courier,monospace;">Filter</span> وبداخل هذا الصنف تظهر لدينا دالتين جديدتين كما يلي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_3248_65">
<span class="lit">@Override</span><span class="pln">
</span><span class="kwd">public</span><span class="pln"> </span><span class="typ">Filter</span><span class="pln"> getFilter</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
	</span><span class="kwd">return</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Filter</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
		</span><span class="lit">@Override</span><span class="pln">
		</span><span class="kwd">protected</span><span class="pln"> </span><span class="typ">FilterResults</span><span class="pln"> performFiltering</span><span class="pun">(</span><span class="typ">CharSequence</span><span class="pln"> constraint</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
		</span><span class="pun">}</span><span class="pln">

		</span><span class="lit">@Override</span><span class="pln">
		</span><span class="kwd">protected</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> publishResults</span><span class="pun">(</span><span class="typ">CharSequence</span><span class="pln"> constraint</span><span class="pun">,</span><span class="pln"> </span><span class="typ">FilterResults</span><span class="pln"> results</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
		</span><span class="pun">}</span><span class="pln">
	</span><span class="pun">};</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	الأولى <span style="font-family:courier new,courier,monospace;">()performFiltering</span> هي المسؤولة عن عملية التنقية ونكتب بداخلها كيف تتم تنقية العناصر وما هي العناصر التي ستظهر عند كتابة نص معين ويتم تخزين النص الذي تم كتابته وعلى أساسه تتم عملية التنقية داخل المتغير <span style="font-family:courier new,courier,monospace;">constraint</span>.
</p>

<p>
	الثانية <span style="font-family:courier new,courier,monospace;">()publishResults</span> هي المسؤولة عن تغيير محتوي البيانات التي تعرضها قائمة العرض حيث تأتي النتائج بعد التنقية داخل الكائن <span style="font-family:courier new,courier,monospace;">results</span>.
</p>

<p>
	سنبدأ أولًا بكتابة طريقة التنقية التي سنتبعها وهي،
</p>

<p>
	نتأكد أن النص الذي ستتم التنقية على أساسه وممثل في المتغير <span style="font-family:courier new,courier,monospace;">constraint</span> ليس فارغًا وذلك عن طريق الجملة المنطقية التالية:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_3248_33">
<span class="pln">constraint </span><span class="pun">==</span><span class="pln"> </span><span class="kwd">null</span><span class="pln"> </span><span class="pun">||</span><span class="pln"> constraint</span><span class="pun">.</span><span class="pln">length</span><span class="pun">()</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> </span><span class="lit">0</span></pre>

<p>
	وتعني هل المتغير <span style="font-family:courier new,courier,monospace;">constraint</span> لم يُخزن بداخله أي بيانات أو تم تخزين نص فارغ، لذا سنضع هذه الجملة داخل الجملة الشرطية if وإن تحققت فذلك يعني أنه لا داعي للتنقية وستظل عناصر القائمة كما هي، أما إذا كان خلاف ذلك ويوجد نص فسنقوم بعملية التنقية.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_3248_31">
<span class="typ">FilterResults</span><span class="pln"> results </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">FilterResults</span><span class="pun">();</span><span class="pln">

</span><span class="kwd">if</span><span class="pun">(</span><span class="pln">constraint </span><span class="pun">==</span><span class="pln"> </span><span class="kwd">null</span><span class="pln"> </span><span class="pun">||</span><span class="pln"> constraint</span><span class="pun">.</span><span class="pln">length</span><span class="pun">()</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> </span><span class="lit">0</span><span class="pun">){</span><span class="pln">
	results</span><span class="pun">.</span><span class="pln">values </span><span class="pun">=</span><span class="pln"> dataTemp</span><span class="pun">;</span><span class="pln">
	results</span><span class="pun">.</span><span class="pln">count </span><span class="pun">=</span><span class="pln"> dataTemp</span><span class="pun">.</span><span class="pln">size</span><span class="pun">();</span><span class="pln">
</span><span class="pun">}</span><span class="pln"> </span><span class="kwd">else</span><span class="pun">{</span><span class="pln">

</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">return</span><span class="pln"> results</span><span class="pun">;</span></pre>

<p>
	لاحظ أن الكائن <span style="font-family:courier new,courier,monospace;">results</span> هو المتغير الذي سنخزن بداخله ناتج التنقية، ويتكون من عنصرين مهمين الأول <span style="font-family:courier new,courier,monospace;">results.values</span> وهنا يتم تخزين البيانات الجديدة و <span style="font-family:courier new,courier,monospace;">results.count</span> ويتم تخزين عددهم.
</p>

<p>
	طريقة التنقية ستكون كالتالي:
</p>

<ul>
<li>
		نصنع حاوية جديدة لتخزين العناصر الناتجة من التنقية.
	</li>
	<li>
		لكل عنصر من العناصر القديمة في قائمة العرض نقوم بمقارنته بالنص المكتوب لنرى هل يحتوي على حروفه.
	</li>
	<li>
		إن كان يحتوي على أحد حروفه ننقله إلى حاوية التخزين الجديدة التي صنعناها.
	</li>
	<li>
		بعد الانتهاء من كافة العناصر نعيد النتيجة ليتم تحديث قائمة العرض بالعناصر الجديدة.
	</li>
</ul>
<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_3248_29">
<span class="typ">ArrayList</span><span class="pun">&lt;</span><span class="typ">ListItem</span><span class="pun">&gt;</span><span class="pln"> filterList </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">ArrayList</span><span class="pun">&lt;</span><span class="typ">ListItem</span><span class="pun">&gt;();</span><span class="pln">

</span><span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">int</span><span class="pln"> i </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln"> i </span><span class="pun">&lt;</span><span class="pln"> dataTemp</span><span class="pun">.</span><span class="pln">size</span><span class="pun">();</span><span class="pln"> i</span><span class="pun">++)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
	</span><span class="typ">ListItem</span><span class="pln"> item </span><span class="pun">=</span><span class="pln"> dataTemp</span><span class="pun">.</span><span class="kwd">get</span><span class="pun">(</span><span class="pln">i</span><span class="pun">);</span><span class="pln">
	</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln"> </span><span class="pun">(</span><span class="pln">item</span><span class="pun">.</span><span class="pln">title</span><span class="pun">.</span><span class="pln">toLowerCase</span><span class="pun">()).</span><span class="pln">contains</span><span class="pun">(</span><span class="pln">constraint</span><span class="pun">.</span><span class="pln">toString</span><span class="pun">().</span><span class="pln">toLowerCase</span><span class="pun">()))</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
		</span><span class="typ">ListItem</span><span class="pln"> filterItem </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">ListItem</span><span class="pun">();</span><span class="pln">
		filterItem</span><span class="pun">.</span><span class="pln">imgSrc </span><span class="pun">=</span><span class="pln"> dataTemp</span><span class="pun">.</span><span class="kwd">get</span><span class="pun">(</span><span class="pln">i</span><span class="pun">).</span><span class="pln">imgSrc</span><span class="pun">;</span><span class="pln">
		filterItem</span><span class="pun">.</span><span class="pln">title </span><span class="pun">=</span><span class="pln"> dataTemp</span><span class="pun">.</span><span class="kwd">get</span><span class="pun">(</span><span class="pln">i</span><span class="pun">).</span><span class="pln">title</span><span class="pun">;</span><span class="pln">
		filterItem</span><span class="pun">.</span><span class="pln">desc </span><span class="pun">=</span><span class="pln"> dataTemp</span><span class="pun">.</span><span class="kwd">get</span><span class="pun">(</span><span class="pln">i</span><span class="pun">).</span><span class="pln">desc</span><span class="pun">;</span><span class="pln">

		filterList</span><span class="pun">.</span><span class="pln">add</span><span class="pun">(</span><span class="pln">filterItem</span><span class="pun">);</span><span class="pln">
	</span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

results</span><span class="pun">.</span><span class="pln">values </span><span class="pun">=</span><span class="pln"> filterList</span><span class="pun">;</span><span class="pln">
results</span><span class="pun">.</span><span class="pln">count </span><span class="pun">=</span><span class="pln"> filterList</span><span class="pun">.</span><span class="pln">size</span><span class="pun">();</span></pre>

<p>
	لاحظ أننا نقوم بالتنقية على أساس النص المخزن داخل <span style="font-family:courier new,courier,monospace;">title</span>، وأننا نقوم بتحويل هذا النص إلى حروف صغيرة ومقارنته بالنص الذي نبحث عنه أيضًا بعد تحويله لحروف صغيرة لتوحيد طريقة كتابة الكلمة.
</p>

<p>
	ونستخدم التابع <span style="font-family:courier new,courier,monospace;">()contains</span> والذي يتأكد هل الكائن الذي قام باستدعاء هذا التابع يحتوي على النص الذي نمرره للتابع أم لا، إن كان يحتويه فسيعيد القيمة المنطقية <span style="font-family:courier new,courier,monospace;">true</span> أما إذا كان لا يحتويه فسيعيد <span style="font-family:courier new,courier,monospace;">false</span>.
</p>

<p>
	بعد ذلك ننتقل إلى الدالة الأخرى لنشر النتائج الجديدة في قائمة العرض، ونقوم بنقل البيانات المخزنة في <span style="font-family:courier new,courier,monospace;">results.values</span> إلى المتغير <span style="font-family:courier new,courier,monospace;">data</span> حتى يتم تحديث قائمة العرض باستدعاء التابع <span style="font-family:courier new,courier,monospace;">()getView</span> بعد استدعاء <span style="font-family:courier new,courier,monospace;">()notifyDataChanged</span>.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_3248_27">
<span class="pln">data </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="typ">ArrayList</span><span class="pun">&lt;</span><span class="typ">ListItem</span><span class="pun">&gt;)</span><span class="pln"> results</span><span class="pun">.</span><span class="pln">values</span><span class="pun">;</span><span class="pln">
notifyDataSetChanged</span><span class="pun">();</span></pre>

<p>
	 لتصبح الشيفرة النهائية للصنف <span style="font-family:courier new,courier,monospace;">CustomArrayAdapter</span> بعد التعديل:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_7906_18">
<span class="pln">package apps</span><span class="pun">.</span><span class="pln">noby</span><span class="pun">.</span><span class="pln">customlistviewexample</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">content</span><span class="pun">.</span><span class="typ">Context</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">view</span><span class="pun">.</span><span class="typ">LayoutInflater</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">view</span><span class="pun">.</span><span class="typ">View</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">view</span><span class="pun">.</span><span class="typ">ViewGroup</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">widget</span><span class="pun">.</span><span class="typ">ArrayAdapter</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">widget</span><span class="pun">.</span><span class="typ">Filter</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">widget</span><span class="pun">.</span><span class="typ">ImageView</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">widget</span><span class="pun">.</span><span class="typ">TextView</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> java</span><span class="pun">.</span><span class="pln">util</span><span class="pun">.</span><span class="typ">ArrayList</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">CustomArrayAdapter</span><span class="pln"> extends </span><span class="typ">ArrayAdapter</span><span class="pun">{</span><span class="pln">

	</span><span class="kwd">private</span><span class="pln"> </span><span class="typ">Context</span><span class="pln"> con</span><span class="pun">;</span><span class="pln">
	</span><span class="kwd">private</span><span class="pln"> </span><span class="typ">ArrayList</span><span class="pun">&lt;</span><span class="typ">ListItem</span><span class="pun">&gt;</span><span class="pln"> data</span><span class="pun">;</span><span class="pln">
	</span><span class="kwd">private</span><span class="pln"> </span><span class="typ">ArrayList</span><span class="pun">&lt;</span><span class="typ">ListItem</span><span class="pun">&gt;</span><span class="pln"> dataTemp</span><span class="pun">;</span><span class="pln">
	</span><span class="kwd">private</span><span class="pln"> </span><span class="typ">LayoutInflater</span><span class="pln"> inflater</span><span class="pun">;</span><span class="pln">
	</span><span class="kwd">private</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> resLayout</span><span class="pun">;</span><span class="pln">

	</span><span class="kwd">public</span><span class="pln"> </span><span class="typ">CustomArrayAdapter</span><span class="pun">(</span><span class="typ">Context</span><span class="pln"> context</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> resource</span><span class="pun">,</span><span class="pln"> </span><span class="typ">ArrayList</span><span class="pun">&lt;</span><span class="typ">ListItem</span><span class="pun">&gt;</span><span class="pln"> objects</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
		super</span><span class="pun">(</span><span class="pln">context</span><span class="pun">,</span><span class="pln"> resource</span><span class="pun">,</span><span class="pln">objects</span><span class="pun">);</span><span class="pln">
		con </span><span class="pun">=</span><span class="pln"> context</span><span class="pun">;</span><span class="pln">
		data </span><span class="pun">=</span><span class="pln"> objects</span><span class="pun">;</span><span class="pln">
		resLayout </span><span class="pun">=</span><span class="pln"> resource</span><span class="pun">;</span><span class="pln">
		dataTemp </span><span class="pun">=</span><span class="pln"> objects</span><span class="pun">;</span><span class="pln">
	</span><span class="pun">}</span><span class="pln">

	</span><span class="lit">@Override</span><span class="pln">
	</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> getCount</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
		</span><span class="kwd">return</span><span class="pln"> data</span><span class="pun">.</span><span class="pln">size</span><span class="pun">();</span><span class="pln">
	</span><span class="pun">}</span><span class="pln">

	</span><span class="lit">@Override</span><span class="pln">
	</span><span class="kwd">public</span><span class="pln"> </span><span class="typ">View</span><span class="pln"> getView</span><span class="pun">(</span><span class="kwd">int</span><span class="pln"> position</span><span class="pun">,</span><span class="pln"> </span><span class="typ">View</span><span class="pln"> convertView</span><span class="pun">,</span><span class="pln"> </span><span class="typ">ViewGroup</span><span class="pln"> parent</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
		inflater </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="typ">LayoutInflater</span><span class="pun">)</span><span class="pln"> con</span><span class="pun">.</span><span class="pln">getSystemService</span><span class="pun">(</span><span class="typ">Context</span><span class="pun">.</span><span class="pln">LAYOUT_INFLATER_SERVICE</span><span class="pun">);</span><span class="pln">

		</span><span class="typ">View</span><span class="pln"> rootView </span><span class="pun">=</span><span class="pln"> inflater</span><span class="pun">.</span><span class="pln">inflate</span><span class="pun">(</span><span class="pln">resLayout</span><span class="pun">,</span><span class="kwd">null</span><span class="pun">);</span><span class="pln">
		</span><span class="typ">ImageView</span><span class="pln"> img </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="typ">ImageView</span><span class="pun">)</span><span class="pln"> rootView</span><span class="pun">.</span><span class="pln">findViewById</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">id</span><span class="pun">.</span><span class="pln">imgview</span><span class="pun">);</span><span class="pln">
		</span><span class="typ">TextView</span><span class="pln"> title </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="typ">TextView</span><span class="pun">)</span><span class="pln"> rootView</span><span class="pun">.</span><span class="pln">findViewById</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">id</span><span class="pun">.</span><span class="pln">titleview</span><span class="pun">);</span><span class="pln">
		</span><span class="typ">TextView</span><span class="pln"> desc </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="typ">TextView</span><span class="pun">)</span><span class="pln"> rootView</span><span class="pun">.</span><span class="pln">findViewById</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">id</span><span class="pun">.</span><span class="pln">descview</span><span class="pun">);</span><span class="pln">

		</span><span class="typ">ListItem</span><span class="pln"> item </span><span class="pun">=</span><span class="pln"> data</span><span class="pun">.</span><span class="kwd">get</span><span class="pun">(</span><span class="pln">position</span><span class="pun">);</span><span class="pln">
		img</span><span class="pun">.</span><span class="pln">setImageResource</span><span class="pun">(</span><span class="pln">item</span><span class="pun">.</span><span class="pln">imgSrc</span><span class="pun">);</span><span class="pln">
		title</span><span class="pun">.</span><span class="pln">setText</span><span class="pun">(</span><span class="pln">item</span><span class="pun">.</span><span class="pln">title</span><span class="pun">);</span><span class="pln">
		desc</span><span class="pun">.</span><span class="pln">setText</span><span class="pun">(</span><span class="pln">item</span><span class="pun">.</span><span class="pln">desc</span><span class="pun">);</span><span class="pln">

		</span><span class="kwd">return</span><span class="pln"> rootView</span><span class="pun">;</span><span class="pln">
	</span><span class="pun">}</span><span class="pln">

	</span><span class="lit">@Override</span><span class="pln">
	</span><span class="kwd">public</span><span class="pln"> </span><span class="typ">Filter</span><span class="pln"> getFilter</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
		</span><span class="kwd">return</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Filter</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
			</span><span class="lit">@Override</span><span class="pln">
            </span><span class="kwd">protected</span><span class="pln"> </span><span class="typ">FilterResults</span><span class="pln"> performFiltering</span><span class="pun">(</span><span class="typ">CharSequence</span><span class="pln"> constraint</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
              </span><span class="typ">FilterResults</span><span class="pln"> results </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">FilterResults</span><span class="pun">();</span><span class="pln">

              </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">constraint </span><span class="pun">==</span><span class="pln"> </span><span class="kwd">null</span><span class="pln"> </span><span class="pun">||</span><span class="pln"> constraint</span><span class="pun">.</span><span class="pln">length</span><span class="pun">()</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> </span><span class="lit">0</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
                results</span><span class="pun">.</span><span class="pln">values </span><span class="pun">=</span><span class="pln"> dataTemp</span><span class="pun">;</span><span class="pln">
                results</span><span class="pun">.</span><span class="pln">count </span><span class="pun">=</span><span class="pln"> dataTemp</span><span class="pun">.</span><span class="pln">size</span><span class="pun">();</span><span class="pln">
              </span><span class="pun">}</span><span class="pln"> </span><span class="kwd">else</span><span class="pun">{</span><span class="pln">
                </span><span class="typ">ArrayList</span><span class="pun">&lt;</span><span class="typ">ListItem</span><span class="pun">&gt;</span><span class="pln"> filterList </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">ArrayList</span><span class="pun">&lt;</span><span class="typ">ListItem</span><span class="pun">&gt;();</span><span class="pln">
                </span><span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">int</span><span class="pln"> i </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln"> i </span><span class="pun">&lt;</span><span class="pln"> dataTemp</span><span class="pun">.</span><span class="pln">size</span><span class="pun">();</span><span class="pln"> i</span><span class="pun">++)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
                  </span><span class="typ">ListItem</span><span class="pln"> item </span><span class="pun">=</span><span class="pln"> dataTemp</span><span class="pun">.</span><span class="kwd">get</span><span class="pun">(</span><span class="pln">i</span><span class="pun">);</span><span class="pln">
                  </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln"> </span><span class="pun">(</span><span class="pln">item</span><span class="pun">.</span><span class="pln">title</span><span class="pun">.</span><span class="pln">toLowerCase</span><span class="pun">()).</span><span class="pln">contains</span><span class="pun">(</span><span class="pln">constraint</span><span class="pun">.</span><span class="pln">toString</span><span class="pun">().</span><span class="pln">toLowerCase</span><span class="pun">()))</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
                    </span><span class="typ">ListItem</span><span class="pln"> filterItem </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">ListItem</span><span class="pun">();</span><span class="pln">
                    filterItem</span><span class="pun">.</span><span class="pln">imgSrc </span><span class="pun">=</span><span class="pln"> dataTemp</span><span class="pun">.</span><span class="kwd">get</span><span class="pun">(</span><span class="pln">i</span><span class="pun">).</span><span class="pln">imgSrc</span><span class="pun">;</span><span class="pln">
                    filterItem</span><span class="pun">.</span><span class="pln">title </span><span class="pun">=</span><span class="pln"> dataTemp</span><span class="pun">.</span><span class="kwd">get</span><span class="pun">(</span><span class="pln">i</span><span class="pun">).</span><span class="pln">title</span><span class="pun">;</span><span class="pln">
                    filterItem</span><span class="pun">.</span><span class="pln">desc </span><span class="pun">=</span><span class="pln"> dataTemp</span><span class="pun">.</span><span class="kwd">get</span><span class="pun">(</span><span class="pln">i</span><span class="pun">).</span><span class="pln">desc</span><span class="pun">;</span><span class="pln">
                    filterList</span><span class="pun">.</span><span class="pln">add</span><span class="pun">(</span><span class="pln">filterItem</span><span class="pun">);</span><span class="pln">
                  </span><span class="pun">}</span><span class="pln">
                </span><span class="pun">}</span><span class="pln">
                results</span><span class="pun">.</span><span class="pln">values </span><span class="pun">=</span><span class="pln"> filterList</span><span class="pun">;</span><span class="pln">
                results</span><span class="pun">.</span><span class="pln">count </span><span class="pun">=</span><span class="pln"> filterList</span><span class="pun">.</span><span class="pln">size</span><span class="pun">();</span><span class="pln">
              </span><span class="pun">}</span><span class="pln">
              </span><span class="kwd">return</span><span class="pln"> results</span><span class="pun">;</span><span class="pln">
            </span><span class="pun">}</span><span class="pln">

            </span><span class="lit">@Override</span><span class="pln">
            </span><span class="kwd">protected</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> publishResults</span><span class="pun">(</span><span class="typ">CharSequence</span><span class="pln"> constraint</span><span class="pun">,</span><span class="pln"> </span><span class="typ">FilterResults</span><span class="pln"> results</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
                data </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="typ">ArrayList</span><span class="pun">&lt;</span><span class="typ">ListItem</span><span class="pun">&gt;)</span><span class="pln"> results</span><span class="pun">.</span><span class="pln">values</span><span class="pun">;</span><span class="pln">
                notifyDataSetChanged</span><span class="pun">();</span><span class="pln">
            </span><span class="pun">}</span><span class="pln">
		</span><span class="pun">};</span><span class="pln">
	</span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	الآن قم بتجربة التطبيق على المحاكي للتأكد انه يعمل كما ينبغي.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="18186" href="https://academy.hsoub.com/uploads/monthly_2016_06/10.png.aba5d2ad13a24d477b261bbbf29013c0.png" rel=""><img alt="10.png" class="ipsImage ipsImage_thumbnailed" data-fileid="18186" data-unique="nfuf7z0n6" src="https://academy.hsoub.com/uploads/monthly_2016_06/10.thumb.png.61e5ec13b487a8e8e3208c90d4a5890f.png"></a>
</p>

<p>
	بهذا نكون قد وصلنا إلى نهاية هذا الدرس، في انتظار تجربتكم وآرائكم.
</p>
]]></description><guid isPermaLink="false">360</guid><pubDate>Mon, 27 Jun 2016 08:14:00 +0000</pubDate></item><item><title>&#x639;&#x645;&#x644;&#x64A;&#x627;&#x62A; &#x639;&#x644;&#x649; &#x627;&#x644;&#x623;&#x635;&#x646;&#x627;&#x641; &#x648;&#x62F;&#x648;&#x627;&#x644;&#x647;&#x627;&#x60C; &#x622;&#x644;&#x64A;&#x629; &#x639;&#x645;&#x644; &#x645;&#x635;&#x641;&#x648;&#x641;&#x629; ArrayList &#x648;&#x645;&#x62F;&#x62E;&#x644; &#x625;&#x644;&#x649; &#x627;&#x644;&#x648;&#x627;&#x62C;&#x647;&#x627;&#x62A; (Interfaces) &#x641;&#x64A; &#x644;&#x63A;&#x629; &#x62C;&#x627;&#x641;&#x627;</title><link>https://academy.hsoub.com/programming/android/%D8%B9%D9%85%D9%84%D9%8A%D8%A7%D8%AA-%D8%B9%D9%84%D9%89-%D8%A7%D9%84%D8%A3%D8%B5%D9%86%D8%A7%D9%81-%D9%88%D8%AF%D9%88%D8%A7%D9%84%D9%87%D8%A7%D8%8C-%D8%A2%D9%84%D9%8A%D8%A9-%D8%B9%D9%85%D9%84-%D9%85%D8%B5%D9%81%D9%88%D9%81%D8%A9-arraylist-%D9%88%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%A7%D9%84%D9%88%D8%A7%D8%AC%D9%87%D8%A7%D8%AA-interfaces-%D9%81%D9%8A-%D9%84%D8%BA%D8%A9-%D8%AC%D8%A7%D9%81%D8%A7-r351/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2016_06/java-oop.png.e52e32b2e264c08450bf9408fb856b56.png" /></p>

<p>
	فيما سبق من دروس <a href="https://academy.hsoub.com/search/?tags=%D8%A3%D9%86%D8%AF%D8%B1%D9%88%D9%8A%D8%AF+%D9%84%D9%84%D9%85%D8%A8%D8%AA%D8%AF%D8%A6%D9%8A%D9%86" rel="">هذه السلسلة</a>، تعلمنا <a href="https://academy.hsoub.com/programming/android/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D9%83%D8%A7%D8%A6%D9%86%D9%8A%D8%A9-%D8%A7%D9%84%D8%AA%D9%88%D8%AC%D9%87%D8%8C-%D8%A7%D9%84%D9%85%D8%AA%D8%BA%D9%8A%D8%B1%D8%A7%D8%AA%D8%8C-%D8%A7%D9%84%D8%AC%D9%85%D9%84-%D8%A7%D9%84%D8%B4%D8%B1%D8%B7%D9%8A%D8%A9-%D9%88%D8%A7%D9%84%D8%AD%D9%84%D9%82%D8%A7%D8%AA-%D9%81%D9%8A-%D8%AC%D8%A7%D9%81%D8%A7-3-r310/" rel="">أساسيات لغات البرمجة وجافا خاصة</a>، هناك بعض الأمور الهامة في لغة جافا والتي يتم استخدامها بكثرة في تطبيقات الأندرويد، وسنكمل في هذا الدرس ما بدأناه من أساسيات لغة Java.
</p>

<p style="text-align: center;">
	<img alt="java-oop.png" class="ipsImage ipsImage_thumbnailed" data-fileid="17865" data-unique="jgrg8hfs8" src="https://academy.hsoub.com/uploads/monthly_2016_06/java-oop.png.d49ca9e09c7d3d3c9e56a60443df0c47.png"></p>

<h2>
	Method Overriding
</h2>

<p>
	لشرح هذا المفهوم دعنا نوضح هذا المثال والذي يقوم بتعريف صنف جديد يدعى <span style="font-family:courier new,courier,monospace;">Shape</span> وبداخله ثلاث توابع كما يلي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_8872_7">
<span class="kwd">class</span><span class="pln"> </span><span class="typ">Shape</span><span class="pun">{</span><span class="pln">

	</span><span class="kwd">protected</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> width</span><span class="pun">;</span><span class="pln">
	</span><span class="kwd">protected</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> height</span><span class="pun">;</span><span class="pln">

	</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> setWidth</span><span class="pun">(</span><span class="kwd">int</span><span class="pln"> a</span><span class="pun">){</span><span class="pln">
		width </span><span class="pun">=</span><span class="pln"> a</span><span class="pun">;</span><span class="pln">
	</span><span class="pun">}</span><span class="pln">

	</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> setHeight</span><span class="pun">(</span><span class="kwd">int</span><span class="pln"> b</span><span class="pun">){</span><span class="pln">
		height </span><span class="pun">=</span><span class="pln"> b</span><span class="pun">;</span><span class="pln">
	</span><span class="pun">}</span><span class="pln">

	</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> getArea</span><span class="pun">(){</span><span class="pln">
		</span><span class="kwd">return</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
	</span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	وإذا قمنا بعمل كائن جديد يمكننا من خلاله استدعاء التوابع الخاصة به.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_8872_9">
<span class="typ">Shape</span><span class="pln"> sh </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Shape</span><span class="pun">();</span><span class="pln">

sh</span><span class="pun">.</span><span class="pln">setWidth</span><span class="pun">(</span><span class="lit">10</span><span class="pun">);</span><span class="pln">
sh</span><span class="pun">.</span><span class="pln">setHeight</span><span class="pun">(</span><span class="lit">5</span><span class="pun">);</span><span class="pln">

</span><span class="kwd">int</span><span class="pln"> area </span><span class="pun">=</span><span class="pln"> sh</span><span class="pun">.</span><span class="pln">getArea</span><span class="pun">();</span></pre>

<p>
	في المثال السابق سيتم تخزين 0 في المتغير <span style="font-family:courier new,courier,monospace;">area</span> وذلك ما يفعله التابع <span style="font-family:courier new,courier,monospace;">()getArea</span>، حيث يقوم دائمًا بإعادة القيمة 0 أيًا كانت قيمة الطول والعرض وذلك لأننا نعتبر هذا الصنف نوعًا عام غير محدد الشكل ولا يمكننا معرفة مساحته.
</p>

<p>
	سنقوم الآن بصنع صنف جديد يرث من <span style="font-family:courier new,courier,monospace;">Shape</span>:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_8872_11">
<span class="kwd">class</span><span class="pln"> </span><span class="typ">Square</span><span class="pln"> extends </span><span class="typ">Shape</span><span class="pun">{</span><span class="pln">

</span><span class="pun">}</span></pre>

<p>
	كما ذكرنا سابقًا سيرث منه المتغيرات والخصائص كما سيرث منه التوابع الخاصة به فلا داعي لتعريفها بداخله مرة أخرى.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_8872_13">
<span class="typ">Square</span><span class="pln"> sq </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Square</span><span class="pun">();</span><span class="pln">

sq</span><span class="pun">.</span><span class="pln">setWidth</span><span class="pun">(</span><span class="lit">10</span><span class="pun">);</span><span class="pln">
sq</span><span class="pun">.</span><span class="pln">setHeight</span><span class="pun">(</span><span class="lit">10</span><span class="pun">);</span><span class="pln">

</span><span class="kwd">int</span><span class="pln"> area </span><span class="pun">=</span><span class="pln"> sq</span><span class="pun">.</span><span class="pln">getArea</span><span class="pun">();</span></pre>

<p>
	ستظل في هذه الحالة قيمة المتغير <span style="font-family:courier new,courier,monospace;">area</span> كما هي تساوي 0 حيث ورث الصنف Square التابع <span style="font-family:courier new,courier,monospace;">()getArea</span> كما هو دون أي تغيير.
</p>

<p>
	إذا أردنا تغيير القيمة التي يعيدها هذا التابع نستخدم مفهوم Method Overriding، وهو ببساطة يعني تجاوز المحتوى السابق لهذا التابع والذي تم استخدامه داخل الأب لهذا الصنف واستخدام محتوى جديد بدلًا منه عند استدعاء التابع.
</p>

<p>
	ولتطبيق هذا المفهوم نقوم بكتابة التابع والحفاظ على اسمه ونوع البيانات التي يُعيدها وتغيير المحتوى الداخلي له لتنفيذ الوظيفة الجديدة.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_8872_15">
<span class="kwd">class</span><span class="pln"> </span><span class="typ">Square</span><span class="pln"> extends </span><span class="typ">Shape</span><span class="pun">{</span><span class="pln">

	</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> getArea</span><span class="pun">(){</span><span class="pln">
		</span><span class="kwd">return</span><span class="pln"> width </span><span class="pun">*</span><span class="pln"> height</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	والآن عند كتابة الكائن السابق سنجد أن المتغير <span style="font-family:courier new,courier,monospace;">area</span> تغيرت قيمته ليقوم بتخزين حاصل ضرب الطول والعرض وحساب المساحة، ولن يتغير المحتوى الخاص بالتابع الأصلي <span style="font-family:courier new,courier,monospace;">()getArea</span> المتواجد داخل الصنف <span style="font-family:courier new,courier,monospace;">Shape</span>.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_8872_17">
<span class="typ">Square</span><span class="pln"> sq </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Square</span><span class="pun">();</span><span class="pln">

sq</span><span class="pun">.</span><span class="pln">setWidth</span><span class="pun">(</span><span class="lit">10</span><span class="pun">);</span><span class="pln">
sq</span><span class="pun">.</span><span class="pln">setHeight</span><span class="pun">(</span><span class="lit">10</span><span class="pun">);</span><span class="pln">

</span><span class="kwd">int</span><span class="pln"> area </span><span class="pun">=</span><span class="pln"> sq</span><span class="pun">.</span><span class="pln">getArea</span><span class="pun">();</span><span class="pln"> </span><span class="com">//area = 10</span></pre>

<p>
	والميزة الرئيسية لهذا المفهوم أنه يجعل للصنف الذي يرث من صنف آخر القدرة على صنع خطواته الخاصة لتنفيذ أحد التوابع التي يرثها دون التغيير في التابع الأصلي للأب.
</p>

<h3>
	قواعد تطبيق مفهوم Method Overriding
</h3>

<ol>
<li>
		يجب كتابة التابع دون تغيير في الاسم الخاص به أو تغيير نوع البيانات التي تُمرر له أو تغيير ترتيبها الأصلي كما لا يمكن تغيير نوع البيانات التي يُعيدها.
	</li>
	<li>
		غير مسموح بتقليل القيود المتواجدة في التابع والتي يتم تحديدها عن طريق Access Modifiers. فمثلًا إذا تم تعريف التابع على أنه public فلا يمكن تقييده وجعله <span style="font-family:courier new,courier,monospace;">protected</span> أو <span style="font-family:courier new,courier,monospace;">private</span> لأن ذلك أقل في صلاحيات الوصول لهذا التابع، أما إذا كان التابع الأصلي <span style="font-family:courier new,courier,monospace;">protected</span> وتم تغييرها إلى <span style="font-family:courier new,courier,monospace;">public</span> فهذا مسموح به لأنه أعطى صلاحية وصول أكبر للتابع.
	</li>
	<li>
		لا يمكن تجاوز التابع المُعرف على أنه <span style="font-family:courier new,courier,monospace;">final</span>. ولاحظ أن <span style="font-family:courier new,courier,monospace;">final</span> عند تعريف المتغيرات تعني ثابت لا يمكن تغيير قيمته، وعند تعريف التوابع تعني تابع لا يمكن تجاوزه وتغيير محتواه.
	</li>
	<li>
		إذا أردت تنفيذ محتوى التابع الأصلي لتابع تم تجاوزه يمكنك ذلك عن طريق استخدام <span style="font-family:courier new,courier,monospace;">super</span>، وبتطبيق ذلك على المثال السابق:
	</li>
</ol>
<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_8872_19">
<span class="kwd">class</span><span class="pln"> </span><span class="typ">Square</span><span class="pln"> extends </span><span class="typ">Shape</span><span class="pun">{</span><span class="pln">

	</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> getArea</span><span class="pun">(){</span><span class="pln">
		</span><span class="kwd">int</span><span class="pln"> a </span><span class="pun">=</span><span class="pln"> super</span><span class="pun">.</span><span class="pln">getArea</span><span class="pun">();</span><span class="pln">
		</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln"> a </span><span class="pun">==</span><span class="pln"> </span><span class="lit">0</span><span class="pln"> </span><span class="pun">){</span><span class="pln">
			</span><span class="kwd">return</span><span class="pln"> width </span><span class="pun">*</span><span class="pln"> height</span><span class="pun">;</span><span class="pln">
		</span><span class="pun">}</span><span class="pln">
		</span><span class="kwd">else</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
			</span><span class="kwd">return</span><span class="pln"> a</span><span class="pun">;</span><span class="pln">
		</span><span class="pun">}</span><span class="pln">
	</span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<h2>
	الحواشي Annotations
</h2>

<p>
	هي طريقة لتقديم معلومات معينة عن الشيفرة المكتوبة والتي تشير إليها هذه الملاحظة ولا يتم اعتبارها أنها جزء من الشيفرة ولا تؤثر بشكل مباشرة فيها.
</p>

<p>
	هناك استخدامات مختلفة للحواشي annotations منها إعطاء أوامر للمترجم الخاص بالبرنامج، ولهذا الاستخدام يوجد عدة حواشي مبنية داخل جافا وهي:
</p>

<h3>
	Override@
</h3>

<p>
	ويتم استخدامها عند تجاوز تابع وذلك لجعل المترجم يقوم بالتأكد أننا نقوم حقًا بتجاوز تابع متواجد داخل الأب ونكتبه بشكل صحيح غير مخالف للقواعد.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_8872_21">
<span class="kwd">class</span><span class="pln"> </span><span class="typ">Square</span><span class="pln"> extends </span><span class="typ">Shape</span><span class="pun">{</span><span class="pln">

	</span><span class="lit">@Override</span><span class="pln">
	</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> getArea</span><span class="pun">(){</span><span class="pln">
		</span><span class="kwd">return</span><span class="pln"> width </span><span class="pun">*</span><span class="pln"> height</span><span class="pun">;</span><span class="pln">
	</span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<h3>
	Deprecated@
</h3>

<p>
	ويتم استخدامها لإشارة إلى أن هذا التابع أو الصنف تم إزالته من اللغة وأصبح قديمًا لذا لا يجوز استعماله مرة أخرى ويجب استبداله، وعند كتابة هذه الملاحظة يقوم المترجم بكتابة تحذير للمطور بذلك حتى يُذكّره.
</p>

<p>
	وتعتبر الحواشي من الأشياء المهمة عند كتابة الشيفرات ومن الجيد التعود على استخدامها.
</p>

<h2>
	Method Overloading
</h2>

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

<ol>
<li>
		عدد المعاملات Parameters التي يتمر تمريرها.
	</li>
	<li>
		نوع المعاملات التي يتم تمريرها.
	</li>
	<li>
		ترتيب المُعاملات التي يتم تمريرها.
	</li>
</ol>
<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_8872_23">
<span class="kwd">class</span><span class="pln"> </span><span class="typ">Exampe</span><span class="pun">{</span><span class="pln">

	</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> add</span><span class="pun">(</span><span class="kwd">int</span><span class="pln"> x</span><span class="pun">,</span><span class="kwd">int</span><span class="pln"> y</span><span class="pun">){</span><span class="pln">
		</span><span class="kwd">return</span><span class="pln"> x</span><span class="pun">+</span><span class="pln">y</span><span class="pun">;</span><span class="pln">
	</span><span class="pun">}</span><span class="pln">

	</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> add</span><span class="pun">(</span><span class="kwd">int</span><span class="pln"> x</span><span class="pun">,</span><span class="kwd">int</span><span class="pln"> y</span><span class="pun">,</span><span class="kwd">int</span><span class="pln"> z</span><span class="pun">){</span><span class="pln">
		</span><span class="kwd">return</span><span class="pln"> x</span><span class="pun">+</span><span class="pln">y</span><span class="pun">+</span><span class="pln">z</span><span class="pun">;</span><span class="pln">
	</span><span class="pun">}</span><span class="pln">

	</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">float</span><span class="pln"> add</span><span class="pun">(</span><span class="kwd">float</span><span class="pln"> x</span><span class="pun">,</span><span class="kwd">float</span><span class="pln"> y</span><span class="pun">){</span><span class="pln">
		</span><span class="kwd">return</span><span class="pln"> x</span><span class="pun">+</span><span class="pln">y</span><span class="pun">;</span><span class="pln">
	</span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	في المثال السابق استخدمنا نفس التابع <span style="font-family:courier new,courier,monospace;">()add</span> ولكن بأشكال مختلفة وقمنا بتطبيق إحدى القواعد المطلوبة في كل تابع لتحقيق شرط هذا المفهوم.
</p>

<p>
	ولاحظ أنه لا يمكننا كتابة هذا الشكل:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_8872_25">
<span class="kwd">public</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> add</span><span class="pun">(</span><span class="kwd">int</span><span class="pln"> y</span><span class="pun">,</span><span class="kwd">int</span><span class="pln"> x</span><span class="pun">){</span><span class="pln">
	</span><span class="kwd">return</span><span class="pln"> x</span><span class="pun">+</span><span class="pln">y</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	حيث أنه لا يوجد فرق بينه وبين الشكل الأول فلا يمكننا التمييز بتغيير اسم المتغيرات.
</p>

<h2>
	ArrayList
</h2>

<p>
	يوجد داخل لغة جافا صنف يدعى <span style="font-family:courier new,courier,monospace;">ArrayList</span> وهو يعبر عن قائمة من البيانات تتميز بالمرونة والقدرة على القيام بوظائف عديدة، ويتم تفضيلها عادة على استخدام مصفوفة البيانات التقليدية وذلك لأن المصفوفة يتم تحديدها بعدد من البيانات لا يمكن تغييره، فلا يمكن إضافة عناصر جديدة لها كما لا يمكن إزالة عناصر منها وتقليل العدد.
</p>

<p>
	وهذا ما يميز <span style="font-family:courier new,courier,monospace;">ArrayList</span> لقدرتها على تغيير حجمها والتكييف حسب البيانات المخزنة بداخلها.
</p>

<p>
	كما تتميز <span style="font-family:courier new,courier,monospace;">ArrayList</span> عن <span style="font-family:courier new,courier,monospace;">Array</span> أو المصفوفة التقليدية بوجود توابع مختلفة تقوم بوظائف عديدة على عكس <span style="font-family:courier new,courier,monospace;">Array</span> الذي يملك توابع.
</p>

<p>
	لتعريف كائن جديد من الصنف <span style="font-family:courier new,courier,monospace;">ArrayList:</span>
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_8872_43">
<span class="typ">ArrayList</span><span class="pun">&lt;</span><span class="typ">String</span><span class="pun">&gt;</span><span class="pln"> strObject </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">ArrayList</span><span class="pun">&lt;</span><span class="typ">String</span><span class="pun">&gt;();</span></pre>

<p>
	في المثال السابق قمنا بتعريف كائن من الصنف <span style="font-family:courier new,courier,monospace;">ArrayList</span> يدعى <span style="font-family:courier new,courier,monospace;">strObject</span> ويستطيع تخزين بداخله بيانات من النوع <span style="font-family:courier new,courier,monospace;">String</span>.
</p>

<p>
	الآن بعد أن قمنا بتعريف الكائن هناك عدة توابع يمكننا استخدامها مثل:
</p>

<h3>
	(add(o
</h3>

<p>
	وهو يقوم بإضافة العنصر (o) إلى القائمة.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_8872_45">
<span class="pln">strObject</span><span class="pun">.</span><span class="pln">add</span><span class="pun">(“</span><span class="typ">Ahmed</span><span class="pun">”);</span><span class="pln"> </span><span class="com">// [“Ahmed”]</span><span class="pln">
strObject</span><span class="pun">(“</span><span class="typ">Mohamed</span><span class="pun">”);</span><span class="pln"> </span><span class="com">// [“Ahmed”,”Mohamed”]</span><span class="pln">
strObject</span><span class="pun">(“</span><span class="typ">Mariam</span><span class="pun">”);</span><span class="pln"> </span><span class="com">// [“Ahmed”,”Mohamed”,”Mariam”]</span></pre>

<p>
	في المثال السابق نضيف عناصر من النوع <span style="font-family:courier new,courier,monospace;">String</span> إلى القائمة باستدعاء التابع <span style="font-family:courier new,courier,monospace;">()add </span>وتمرير له العنصر الذي نريد إضافته، وفي كل مرة يتم استدعاء التابع يتم تغيير حجم القائمة بشكل مرن.
</p>

<h3>
	(add(I ,o
</h3>

<p>
	يختلف عن التابع السابق بأنه يقوم بتحديد المكان (I) الذي يرغب بتخزين العنصر فيه، ففي التابع السابق يتم إضافة العناصر في ذيل القائمة.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_8872_47">
<span class="pln">strObject</span><span class="pun">.</span><span class="pln">add</span><span class="pun">(</span><span class="lit">2</span><span class="pun">,“</span><span class="typ">Sara</span><span class="pun">”);</span><span class="pln"> </span><span class="com">// [“Ahmed”,”Mohamed”,”Sara”,”Mariam”]</span></pre>

<h3>
	(set(I,O
</h3>

<p>
	تقوم بتبديل العنصر المتواجد في المكان (I) بالعنصر (O).
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_8872_49">
<span class="pln">strObject</span><span class="pun">.</span><span class="kwd">set</span><span class="pun">(</span><span class="lit">1</span><span class="pun">,“</span><span class="typ">Tarek</span><span class="pun">”);</span><span class="pln"> </span><span class="com">// [“Ahmed”,”Tarek”,”Sara”,”Mariam”]</span></pre>

<p>
	في المثال السابق سيتم استبدال العنصر "Mohamed" بالعنصر "Tarek".
</p>

<p>
	لاحظ أنه يبدأ الترقيم الخاص بالعناصر من صفر.
</p>

<h3>
	(get(I
</h3>

<p>
	يُعيد هذا التابع العنصر المخزن في المكان (I).
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_8872_51">
<span class="typ">String</span><span class="pln"> name </span><span class="pun">=</span><span class="pln"> strObject</span><span class="pun">.</span><span class="kwd">get</span><span class="pun">(</span><span class="lit">0</span><span class="pun">);</span><span class="pln"> </span><span class="com">//nama = “Ahmed”</span></pre>

<p>
	في المثال السابق نحصل على العنصر "Ahmed" والمتواجد في المكان 0 (رأس القائمة).
</p>

<h3>
	()size
</h3>

<p>
	لمعرفة عدد العناصر المخزنة داخل القائمة.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_8872_53">
<span class="kwd">int</span><span class="pln"> numberOfElements </span><span class="pun">=</span><span class="pln"> strObject</span><span class="pun">.</span><span class="pln">size</span><span class="pun">();</span><span class="pln"> </span><span class="com">// numberOfElements = 4</span></pre>

<h3>
	(remove(O
</h3>

<p>
	لإزالة عنصر محدد من القائمة.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_8872_55">
<span class="pln">strObject</span><span class="pun">.</span><span class="pln">remove</span><span class="pun">(“</span><span class="typ">Mariam</span><span class="pun">”);</span><span class="pln"> </span><span class="com">// [“Ahmed”,”Tarek”,”Sara”]</span></pre>

<h3>
	(remove(I
</h3>

<p>
	لإزالة عنصر المتواجد في المكان (I).
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_8872_57">
<span class="pln">strObject</span><span class="pun">.</span><span class="pln">remove</span><span class="pun">(</span><span class="lit">1</span><span class="pun">);</span><span class="pln"> </span><span class="com">// [“Ahmed”,”Sara”]</span></pre>

<h3>
	()clear
</h3>

<p>
	لإزالة كافة عناصر القائمة.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_8872_39">
<span class="pln">strObject</span><span class="pun">.</span><span class="pln">clear</span><span class="pun">();</span><span class="pln"> </span><span class="com">// []</span></pre>

<p>
	وكما قمنا باستخدام <span style="font-family:courier new,courier,monospace;">ArrayList</span> مع النصوص يمكننا استخدامها مع أي صنف أخر فمثلا يمكنا عمل قائمة من المربعات (صنف <span style="font-family:courier new,courier,monospace;">Square</span>)، وهو الصنف الذي قمنا بصناعته في أول الدرس.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_8872_37">
<span class="typ">ArrayList</span><span class="pun">&lt;</span><span class="typ">Square</span><span class="pun">&gt;</span><span class="pln"> obj </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">ArrayList</span><span class="pun">&lt;</span><span class="typ">Square</span><span class="pun">&gt;();</span></pre>

<p>
	ولإضافة مربع جديد للقائمة.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_8872_35">
<span class="typ">Obj</span><span class="pun">.</span><span class="pln">add</span><span class="pun">(</span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Square</span><span class="pun">());</span></pre>

<p>
	ولتغيير الطول والعرض الخاصين بهذا المربع.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_8872_33">
<span class="typ">Obj</span><span class="pun">.</span><span class="kwd">get</span><span class="pun">(</span><span class="lit">0</span><span class="pun">).</span><span class="pln">setWidth</span><span class="pun">(</span><span class="lit">15</span><span class="pun">);</span><span class="pln">
</span><span class="typ">Obj</span><span class="pun">.</span><span class="kwd">get</span><span class="pun">(</span><span class="lit">0</span><span class="pun">).</span><span class="pln">setHeight</span><span class="pun">(</span><span class="lit">15</span><span class="pun">);</span></pre>

<p>
	وهكذا يمكننا التعامل مع عناصر القائمة بنفس الطريقة، فكل عنصر داخل القائمة هو كائن من <span style="font-family:courier new,courier,monospace;">Square</span>.
</p>

<p>
	لاحظ أنه هناك توابع خاصة بالصنف <span style="font-family:courier new,courier,monospace;">ArrayList</span> وأخرى خاصة بالصنف <span style="font-family:courier new,courier,monospace;">Square</span>.
</p>

<h2>
	Interface
</h2>

<p>
	تتشابه الواجهات (Interface) في بينتها مع الأصناف (Class)، فيمكننا بداخله تعريف توابع ومتغيرات لكنها ذات طبيعة خاصة.
</p>

<p>
	فجميع التوابع داخل الواجهة تتكون من تعريف فقط ولا يوجد لها محتوى، وعلى الصنف الذي يُنفذ الواجهة أن يكتب المحتوى الخاص بالتابع.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_8872_31">
<span class="kwd">public</span><span class="pln"> interface </span><span class="typ">MyInterface</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
	</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> method1</span><span class="pun">();</span><span class="pln">
	</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> method2</span><span class="pun">();</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	ولا يمكن إنشاء كائنات من الواجهة (Interface).
</p>

<p>
	ولتنفيذ الواجهة نستخدم <span style="font-family:courier new,courier,monospace;">implements</span>، ويمكن للأصناف (Classes) فقط أن تُنفذ الواجهات (Interfaces).
</p>

<p>
	وبداخل الصنف يجب كتابة المحتوى الخاص بالتوابع التي تم تعريفها داخل الواجهة، كما يمكننا أن نكتب التوابع الخاصة بالصنف كما سبق.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_8872_29">
<span class="kwd">public</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> X implements </span><span class="typ">MyInterface</span><span class="pun">{</span><span class="pln">

	</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> method1</span><span class="pun">(){</span><span class="pln">
		</span><span class="kwd">return</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
	</span><span class="pun">}</span><span class="pln">

	</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> method2</span><span class="pun">(){</span><span class="pln">
	</span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	بعد ذلك يمكننا إنشاء كائنات من الصنف X واستدعاء التوابع كما فعلنا سابقًا.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_8872_27">
<span class="pln">X obj </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> X</span><span class="pun">();</span><span class="pln">
</span><span class="typ">Obj</span><span class="pun">.</span><span class="pln">method2</span><span class="pun">();</span></pre>

<p>
	واستخدام الواجهة هو الطريقة المثالية لتزويد المطور بالتوابع اللازم كتابتها لأداء مهمة ما، فهي تضمن أن الصنف الذي يُنفذ الواجهة قد قام بكتابة كافة التوابع الخاصة به.
</p>
]]></description><guid isPermaLink="false">351</guid><pubDate>Thu, 16 Jun 2016 10:25:00 +0000</pubDate></item><item><title>&#x627;&#x644;&#x62A;&#x646;&#x642;&#x644; &#x628;&#x64A;&#x646; &#x634;&#x627;&#x634;&#x627;&#x62A; &#x627;&#x644;&#x62A;&#x637;&#x628;&#x64A;&#x642; &#x628;&#x627;&#x633;&#x62A;&#x62E;&#x62F;&#x627;&#x645; &#x627;&#x644;&#x640; Intents &#x641;&#x64A; &#x623;&#x646;&#x62F;&#x631;&#x648;&#x64A;&#x62F;</title><link>https://academy.hsoub.com/programming/android/%D8%A7%D9%84%D8%AA%D9%86%D9%82%D9%84-%D8%A8%D9%8A%D9%86-%D8%B4%D8%A7%D8%B4%D8%A7%D8%AA-%D8%A7%D9%84%D8%AA%D8%B7%D8%A8%D9%8A%D9%82-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%A7%D9%84%D9%80-intents-%D9%81%D9%8A-%D8%A3%D9%86%D8%AF%D8%B1%D9%88%D9%8A%D8%AF-r347/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2016_06/android-intents-navigation.png.1d775f70fb5227d5b1907c2745667d63.png" /></p>

<p>
	يُتيح نظام تشغيل أندرويد طريقة محددة وبسيطة للتنقل بين المكونات الأساسية للتطبيقات والتي ذكرناها سابقًا وذلك عن طريق استخدام الـ <span style="font-family:courier new,courier,monospace;">Intents</span>.
</p>

<p style="text-align: center;">
	<img alt="android-intents-navigation.png" class="ipsImage ipsImage_thumbnailed" data-fileid="17641" data-unique="kvbxetxbo" src="https://academy.hsoub.com/uploads/monthly_2016_06/android-intents-navigation.png.f322844b65c2a9341370690ba2820774.png"></p>

<h2>
	Intents
</h2>

<p>
	يُعتبر الـ Intent طريقة التواصل بين مكونات التطبيق المختلفة من أجل القيام بشيء ما، فهو يسمح لمكونات التطبيق (كالأنشطة Activities ، الخدمات Services وغيرها) من التفاعل مع بعضها البعض والقيام بإحدى المهام، فباستخدام الـ Intent يمكننا التنقل بين شاشات التطبيق المختلفة أو التطبيقات الأخرى فمثلًا عند الضغط على زر يقوم بفتح نشاط Activity جديد داخل نفس التطبيق وعرض صورة به، كما يسمح بتفاعل التطبيقات الأخرى المتواجدة على الهاتف مع تطبيقك، فيمكن عرض الصورة في تطبيق خارجي كتطبيق المعرض (Gallery).
</p>

<p>
	وعند استخدام الـ Intent في التنقل بين مكونات نفس التطبيق يسمى بالـ Explicit Intent، لذا يستخدم Explicit Intent في ربط مكونات التطبيق الداخلية ببعضها وسنتعرف من خلال الأمثلة القادمة على كيفية استخدام الـ Explicit Intents في التنقل بين الأنشطة وإرسال واستقبال البيانات بينهم.
</p>

<p>
	وعند استخدامه للتنقل إلى التطبيقات الخارجية يسمى بالـ Implicit Intent.
</p>

<h2>
	<span style="line-height: 2em;">المثال الأول</span>
</h2>

<p>
	<span style="line-height: 2em; color: rgb(39, 42, 52); font-size: 14px;">الآن قم بفتح Android Studio وقم بعمل تطبيق جديد اسمه "Explicit Intent Example"، في هذا المثال سنقوم باستخدام زر للتنقل إلى نشاط جديد.</span>
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="17630" href="https://academy.hsoub.com/uploads/monthly_2016_06/01.png.d88632bf4f4cb9bf5705197576c64775.png" rel=""><img alt="01.png" class="ipsImage ipsImage_thumbnailed" data-fileid="17630" data-unique="gtgi8vndr" src="https://academy.hsoub.com/uploads/monthly_2016_06/01.thumb.png.4684ef5a1853fda1fa4dd4d8f4df159a.png"></a>
</p>

<p>
	أولًا نقوم بصنع واجهة المستخدم الخاصة بالنشاط الأول والرئيسي في الملف <span style="font-family:courier new,courier,monospace;">activity_main.xml:</span>
</p>

<pre class="ipsCode prettyprint lang-xml prettyprinted" id="ips_uid_278_7">
<span class="pun">&lt;?</span><span class="pln">xml version</span><span class="pun">=</span><span class="str">"1.0"</span><span class="pln"> encoding</span><span class="pun">=</span><span class="str">"utf-8"</span><span class="pun">?&gt;</span><span class="pln">
</span><span class="tag">&lt;LinearLayout</span><span class="pln"> </span><span class="atn">xmlns:android</span><span class="pun">=</span><span class="atv">"http://schemas.android.com/apk/res/android"</span><span class="pln">
	</span><span class="atn">android:layout_width</span><span class="pun">=</span><span class="atv">"match_parent"</span><span class="pln">
	</span><span class="atn">android:layout_height</span><span class="pun">=</span><span class="atv">"match_parent"</span><span class="pln">
	</span><span class="atn">android:orientation</span><span class="pun">=</span><span class="atv">"vertical"</span><span class="pln">
	</span><span class="atn">android:gravity</span><span class="pun">=</span><span class="atv">"center"</span><span class="tag">&gt;</span><span class="pln">

	</span><span class="tag">&lt;TextView</span><span class="pln">
		</span><span class="atn">android:layout_width</span><span class="pun">=</span><span class="atv">"wrap_content"</span><span class="pln">
		</span><span class="atn">android:layout_height</span><span class="pun">=</span><span class="atv">"wrap_content"</span><span class="pln">
		</span><span class="atn">android:text</span><span class="pun">=</span><span class="atv">"Welcome to The First Activity"</span><span class="pln">
		</span><span class="atn">android:textSize</span><span class="pun">=</span><span class="atv">"21sp"</span><span class="tag">/&gt;</span><span class="pln">

	</span><span class="tag">&lt;Button</span><span class="pln">
		</span><span class="atn">android:layout_width</span><span class="pun">=</span><span class="atv">"wrap_content"</span><span class="pln">
		</span><span class="atn">android:layout_height</span><span class="pun">=</span><span class="atv">"wrap_content"</span><span class="pln">
		</span><span class="atn">android:text</span><span class="pun">=</span><span class="atv">"GO!"</span><span class="pln">
		</span><span class="atn">android:id</span><span class="pun">=</span><span class="atv">"@+id/gobtn"</span><span class="tag">/&gt;</span><span class="pln">
</span><span class="tag">&lt;/LinearLayout&gt;</span></pre>

<p>
	ثانيًا للاستجابة للزر عند الضغط عليه نقوم باستخدام <span style="font-family:courier new,courier,monospace;">onClickListener</span>.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_278_9">
<span class="pln">package apps</span><span class="pun">.</span><span class="pln">noby</span><span class="pun">.</span><span class="pln">explicitintentexample</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">app</span><span class="pun">.</span><span class="typ">Activity</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">os</span><span class="pun">.</span><span class="typ">Bundle</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">view</span><span class="pun">.</span><span class="typ">View</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">widget</span><span class="pun">.</span><span class="typ">Button</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">MainActivity</span><span class="pln"> extends </span><span class="typ">Activity</span><span class="pln"> </span><span class="pun">{</span><span class="pln">

	</span><span class="typ">Button</span><span class="pln"> go</span><span class="pun">;</span><span class="pln">
	</span><span class="lit">@Override</span><span class="pln">
	</span><span class="kwd">protected</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> onCreate</span><span class="pun">(</span><span class="typ">Bundle</span><span class="pln"> savedInstanceState</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
		super</span><span class="pun">.</span><span class="pln">onCreate</span><span class="pun">(</span><span class="pln">savedInstanceState</span><span class="pun">);</span><span class="pln">
		setContentView</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">layout</span><span class="pun">.</span><span class="pln">activity_main</span><span class="pun">);</span><span class="pln">
		go </span><span class="pun">=(</span><span class="typ">Button</span><span class="pun">)</span><span class="pln"> findViewById</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">id</span><span class="pun">.</span><span class="pln">gobtn</span><span class="pun">);</span><span class="pln">

		go</span><span class="pun">.</span><span class="pln">setOnClickListener</span><span class="pun">(</span><span class="kwd">new</span><span class="pln"> </span><span class="typ">View</span><span class="pun">.</span><span class="typ">OnClickListener</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
			</span><span class="lit">@Override</span><span class="pln">
			</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> onClick</span><span class="pun">(</span><span class="typ">View</span><span class="pln"> v</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
				</span><span class="com">//Create your Intent Here</span><span class="pln">
			</span><span class="pun">}</span><span class="pln">
		</span><span class="pun">});</span><span class="pln">
	</span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	وبداخلها سنقوم بكتابة الـ Intent المناسب ولكن قبل ذلك ينبغي أن نقوم بعمل نشاط جديد وربطه بواجهة استخدام جديدة ولعمل ذلك نضغط بالزر الأيمن على المجلد المسمى باسم الحزمة ثم اختر:
</p>

<p style="text-align: center;">
	<strong>New &gt; Activity &gt; Empty Activity</strong>
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="17631" href="https://academy.hsoub.com/uploads/monthly_2016_06/02.png.5bbebd5b776ed899684c9a825de23fea.png" rel=""><img alt="02.png" class="ipsImage ipsImage_thumbnailed" data-fileid="17631" data-unique="fam7m2d3e" src="https://academy.hsoub.com/uploads/monthly_2016_06/02.thumb.png.cf587044f30319e1cf11de5fe67b4923.png"></a>
</p>

<p>
	قم بكتابة اسم النشاط الجديد وتأكد من وجود اسم الحزمة في المكان المخصص لها كما بالصورة التالية:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="17632" href="https://academy.hsoub.com/uploads/monthly_2016_06/03.png.573d2029795cf4f015c9f92555ccb0d9.png" rel=""><img alt="03.png" class="ipsImage ipsImage_thumbnailed" data-fileid="17632" data-unique="1i7w9bsru" src="https://academy.hsoub.com/uploads/monthly_2016_06/03.thumb.png.dfbb7480b80e9135f011cc97e94355c4.png"></a>
</p>

<p>
	بعد أن يقوم البرنامج بصنع ملفات النشاط الجديد من ملف <span style="font-family:courier new,courier,monospace;">activity_second.xml</span> سنقوم بصنع واجهة المستخدم الخاصة بالنشاط الثاني.
</p>

<p>
	وسنضع بداخلها <span style="font-family:courier new,courier,monospace;">TextView</span> يعرض النص "Welcome to The Second Activity":
</p>

<pre class="ipsCode prettyprint lang-xml prettyprinted" id="ips_uid_278_11">
<span class="pun">&lt;?</span><span class="pln">xml version</span><span class="pun">=</span><span class="str">"1.0"</span><span class="pln"> encoding</span><span class="pun">=</span><span class="str">"utf-8"</span><span class="pun">?&gt;</span><span class="pln">
</span><span class="tag">&lt;LinearLayout</span><span class="pln"> </span><span class="atn">xmlns:android</span><span class="pun">=</span><span class="atv">"http://schemas.android.com/apk/res/android"</span><span class="pln">
	</span><span class="atn">android:layout_width</span><span class="pun">=</span><span class="atv">"match_parent"</span><span class="pln">
	</span><span class="atn">android:layout_height</span><span class="pun">=</span><span class="atv">"match_parent"</span><span class="tag">&gt;</span><span class="pln">

	</span><span class="tag">&lt;TextView</span><span class="pln">
		</span><span class="atn">android:layout_width</span><span class="pun">=</span><span class="atv">"wrap_content"</span><span class="pln">
		</span><span class="atn">android:layout_height</span><span class="pun">=</span><span class="atv">"wrap_content"</span><span class="pln">
		</span><span class="atn">android:text</span><span class="pun">=</span><span class="atv">"Welcome to The Second Activity"</span><span class="pln">
		</span><span class="atn">android:textSize</span><span class="pun">=</span><span class="atv">"21sp"</span><span class="tag">/&gt;</span><span class="pln">
</span><span class="tag">&lt;/LinearLayout&gt;</span></pre>

<p>
	والآن نعود مرة أخرى للنشاط الأول لنكمل التابع<span style="font-family:courier new,courier,monospace;"> ()onClick</span>، ولصنع Intent نقوم بعمل كائن من الصنف Intent وتمرير لدالة البناء الخاصة به النشاط الذي سننتقل منه وهو<span style="font-family:courier new,courier,monospace;"> MainActivity.this</span> وتمرير النشاط الذي نريد الانتقال إليه وهو<span style="font-family:courier new,courier,monospace;"> SecondActivity.class.</span>
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_278_13">
<span class="typ">Intent</span><span class="pln"> i </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Intent</span><span class="pun">(</span><span class="typ">MainActivity</span><span class="pun">.</span><span class="kwd">this</span><span class="pun">,</span><span class="typ">SecondActivity</span><span class="pun">.</span><span class="kwd">class</span><span class="pun">);</span></pre>

<p>
	بهذا السطر نكون قد صنعنا الهدف ولكن يتبقى أن نقوم بتفعيل هذا الهدف ليستجيب له التطبيق وذلك عن طريق التابع <span style="font-family:courier new,courier,monospace;">()startActivity</span> وتمرير الـ Intent الذي قمنا بصناعته إليه.
</p>

<p>
	لتصبح الشيفرة النهائية هي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_278_15">
<span class="pln">package apps</span><span class="pun">.</span><span class="pln">noby</span><span class="pun">.</span><span class="pln">explicitintentexample</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">app</span><span class="pun">.</span><span class="typ">Activity</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">content</span><span class="pun">.</span><span class="typ">Intent</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">os</span><span class="pun">.</span><span class="typ">Bundle</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">view</span><span class="pun">.</span><span class="typ">View</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">widget</span><span class="pun">.</span><span class="typ">Button</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">MainActivity</span><span class="pln"> extends </span><span class="typ">Activity</span><span class="pln"> </span><span class="pun">{</span><span class="pln">

	</span><span class="typ">Button</span><span class="pln"> go</span><span class="pun">;</span><span class="pln">
	</span><span class="lit">@Override</span><span class="pln">
	</span><span class="kwd">protected</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> onCreate</span><span class="pun">(</span><span class="typ">Bundle</span><span class="pln"> savedInstanceState</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
		super</span><span class="pun">.</span><span class="pln">onCreate</span><span class="pun">(</span><span class="pln">savedInstanceState</span><span class="pun">);</span><span class="pln">
		setContentView</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">layout</span><span class="pun">.</span><span class="pln">activity_main</span><span class="pun">);</span><span class="pln">
		go </span><span class="pun">=(</span><span class="typ">Button</span><span class="pun">)</span><span class="pln"> findViewById</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">id</span><span class="pun">.</span><span class="pln">gobtn</span><span class="pun">);</span><span class="pln">

		go</span><span class="pun">.</span><span class="pln">setOnClickListener</span><span class="pun">(</span><span class="kwd">new</span><span class="pln"> </span><span class="typ">View</span><span class="pun">.</span><span class="typ">OnClickListener</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
			</span><span class="lit">@Override</span><span class="pln">
			</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> onClick</span><span class="pun">(</span><span class="typ">View</span><span class="pln"> v</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
				</span><span class="com">//Create your Intent Here</span><span class="pln">
				</span><span class="typ">Intent</span><span class="pln"> i </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Intent</span><span class="pun">(</span><span class="typ">MainActivity</span><span class="pun">.</span><span class="kwd">this</span><span class="pun">,</span><span class="typ">SecondActivity</span><span class="pun">.</span><span class="kwd">class</span><span class="pun">);</span><span class="pln">
				startActivity</span><span class="pun">(</span><span class="pln">i</span><span class="pun">);</span><span class="pln">
			</span><span class="pun">}</span><span class="pln">
		</span><span class="pun">});</span><span class="pln">
	</span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	والآن نقوم بتجربة التطبيق على المحاكي والتأكد من قيامه بالوظيفة المطلوبة.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="17633" href="https://academy.hsoub.com/uploads/monthly_2016_06/04.png.7608ec22787636aaac794c77a9c5130e.png" rel=""><img alt="04.png" class="ipsImage ipsImage_thumbnailed" data-fileid="17633" data-unique="0obahcsio" src="https://academy.hsoub.com/uploads/monthly_2016_06/04.thumb.png.ada465888aae2f9f21764401305bb67f.png"></a>
</p>

<p>
	عند النظر إلى ملف <span style="font-family:courier new,courier,monospace;">AndroidManifest.xml</span> نجد أنه تم إضافة تعريف لعنصر جديد من النوع <span style="font-family:courier new,courier,monospace;">Activity</span>، ولاحظ أن بدون تعريف العنصر الجديد لن يعمل التطبيق بشكل سليم ولن يتعرف نظام التشغيل عليه.
</p>

<pre class="ipsCode prettyprint lang-xml prettyprinted" id="ips_uid_278_17">
<span class="tag">&lt;application</span><span class="pln">
	</span><span class="atn">android:allowBackup</span><span class="pun">=</span><span class="atv">"true"</span><span class="pln">
	</span><span class="atn">android:icon</span><span class="pun">=</span><span class="atv">"@mipmap/ic_launcher"</span><span class="pln">
	</span><span class="atn">android:label</span><span class="pun">=</span><span class="atv">"@string/app_name"</span><span class="pln">
	</span><span class="atn">android:supportsRtl</span><span class="pun">=</span><span class="atv">"true"</span><span class="pln">
	</span><span class="atn">android:theme</span><span class="pun">=</span><span class="atv">"@style/AppTheme"</span><span class="tag">&gt;</span><span class="pln">
  
	</span><span class="tag">&lt;activity</span><span class="pln"> </span><span class="atn">android:name</span><span class="pun">=</span><span class="atv">".MainActivity"</span><span class="tag">&gt;</span><span class="pln">
		</span><span class="tag">&lt;intent-filter&gt;</span><span class="pln">
			</span><span class="tag">&lt;action</span><span class="pln"> </span><span class="atn">android:name</span><span class="pun">=</span><span class="atv">"android.intent.action.MAIN"</span><span class="pln"> </span><span class="tag">/&gt;</span><span class="pln">
			</span><span class="tag">&lt;category</span><span class="pln"> </span><span class="atn">android:name</span><span class="pun">=</span><span class="atv">"android.intent.category.LAUNCHER"</span><span class="pln"> </span><span class="tag">/&gt;</span><span class="pln">
		</span><span class="tag">&lt;/intent-filter&gt;</span><span class="pln">
	</span><span class="tag">&lt;/activity&gt;</span><span class="pln">
  
	</span><span class="tag">&lt;activity</span><span class="pln"> </span><span class="atn">android:name</span><span class="pun">=</span><span class="atv">".SecondActivity"</span><span class="tag">&gt;&lt;/activity&gt;</span><span class="pln">
</span><span class="tag">&lt;/application&gt;</span><span class="pln">

…</span></pre>

<h2>
	المثال الثاني
</h2>

<p>
	سنقوم في هذا المثال بإرسال بيانات من نشاط وعرضها في نشاط آخر.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="17634" href="https://academy.hsoub.com/uploads/monthly_2016_06/05.png.bf5c44e23b74e641f087e13ab2925d8c.png" rel=""><img alt="05.png" class="ipsImage ipsImage_thumbnailed" data-fileid="17634" data-unique="fc1hcxfu7" src="https://academy.hsoub.com/uploads/monthly_2016_06/05.thumb.png.b1bf75fbca7341309fe1ff3618148fbc.png"></a>
</p>

<p>
	أولًا نقوم بصنع النشاط الجديد الذي سيتم عرض البيانات بداخله.
</p>

<p>
	ثانيا نبدأ بصنع واجهة المستخدم في ملف<span style="font-family:courier new,courier,monospace;"> activity_main.xml:</span>
</p>

<pre class="ipsCode prettyprint lang-xml prettyprinted" id="ips_uid_278_19">
<span class="pun">&lt;?</span><span class="pln">xml version</span><span class="pun">=</span><span class="str">"1.0"</span><span class="pln"> encoding</span><span class="pun">=</span><span class="str">"utf-8"</span><span class="pun">?&gt;</span><span class="pln">
</span><span class="tag">&lt;LinearLayout</span><span class="pln"> </span><span class="atn">xmlns:android</span><span class="pun">=</span><span class="atv">"http://schemas.android.com/apk/res/android"</span><span class="pln">
	</span><span class="atn">android:layout_width</span><span class="pun">=</span><span class="atv">"match_parent"</span><span class="pln">
	</span><span class="atn">android:layout_height</span><span class="pun">=</span><span class="atv">"match_parent"</span><span class="pln">
	</span><span class="atn">android:orientation</span><span class="pun">=</span><span class="atv">"vertical"</span><span class="pln">
	</span><span class="atn">android:gravity</span><span class="pun">=</span><span class="atv">"center"</span><span class="tag">&gt;</span><span class="pln">
  
	</span><span class="tag">&lt;EditText</span><span class="pln">
		</span><span class="atn">android:layout_width</span><span class="pun">=</span><span class="atv">"match_parent"</span><span class="pln">
		</span><span class="atn">android:layout_height</span><span class="pun">=</span><span class="atv">"wrap_content"</span><span class="pln">
		</span><span class="atn">android:hint</span><span class="pun">=</span><span class="atv">"Your Name"</span><span class="pln">
		</span><span class="atn">android:textSize</span><span class="pun">=</span><span class="atv">"21sp"</span><span class="pln">
		</span><span class="atn">android:id</span><span class="pun">=</span><span class="atv">"@+id/editt"</span><span class="tag">/&gt;</span><span class="pln">

	</span><span class="tag">&lt;Button</span><span class="pln">
		</span><span class="atn">android:layout_width</span><span class="pun">=</span><span class="atv">"wrap_content"</span><span class="pln">
		</span><span class="atn">android:layout_height</span><span class="pun">=</span><span class="atv">"wrap_content"</span><span class="pln">
		</span><span class="atn">android:text</span><span class="pun">=</span><span class="atv">"Send"</span><span class="pln">
		</span><span class="atn">android:id</span><span class="pun">=</span><span class="atv">"@+id/sendbtn"</span><span class="tag">/&gt;</span><span class="pln">
</span><span class="tag">&lt;/LinearLayout&gt;</span></pre>

<p>
	ثم سنقوم بالاستجابة لضغط الزر كما سبق وبداخل التابع <span style="font-family:courier new,courier,monospace;">()onClick</span> يتم تعريف الـ Intent وحفظ البيانات المكتوبة في الـ <span style="font-family:courier new,courier,monospace;">EditText</span> بداخله ثم استدعاء النشاط الجديد.
</p>

<p>
	ولإرسال البيانات داخل الـ Intent يتم ذلك عن طريق التابع <span style="font-family:courier new,courier,monospace;">()putExtra</span> ونمرر له عنصرين وهما المفتاح و القيمة.
</p>

<p>
	المفتاح هو نص نميز به القيمة التي يتم إرسالها عبر الـ Intent ويُستخدم مرة أخرى لاستعادة البيانات التي أرسلناها.
</p>

<p>
	والقيمة هي البيانات التي نرغب في إرسالها.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_278_27">
<span class="pln">package apps</span><span class="pun">.</span><span class="pln">noby</span><span class="pun">.</span><span class="pln">explicitintentexample</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">app</span><span class="pun">.</span><span class="typ">Activity</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">content</span><span class="pun">.</span><span class="typ">Intent</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">os</span><span class="pun">.</span><span class="typ">Bundle</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">view</span><span class="pun">.</span><span class="typ">View</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">widget</span><span class="pun">.</span><span class="typ">Button</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">widget</span><span class="pun">.</span><span class="typ">EditText</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">MainActivity</span><span class="pln"> extends </span><span class="typ">Activity</span><span class="pln"> </span><span class="pun">{</span><span class="pln">

	final </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">static</span><span class="pln"> </span><span class="typ">String</span><span class="pln"> NAME_TAG </span><span class="pun">=</span><span class="pln"> </span><span class="str">"name"</span><span class="pun">;</span><span class="pln">
	</span><span class="kwd">private</span><span class="pln"> </span><span class="typ">Button</span><span class="pln"> send</span><span class="pun">;</span><span class="pln">
	</span><span class="kwd">private</span><span class="pln"> </span><span class="typ">EditText</span><span class="pln"> et</span><span class="pun">;</span><span class="pln">

	</span><span class="lit">@Override</span><span class="pln">
	</span><span class="kwd">protected</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> onCreate</span><span class="pun">(</span><span class="typ">Bundle</span><span class="pln"> savedInstanceState</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
		super</span><span class="pun">.</span><span class="pln">onCreate</span><span class="pun">(</span><span class="pln">savedInstanceState</span><span class="pun">);</span><span class="pln">
		setContentView</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">layout</span><span class="pun">.</span><span class="pln">activity_main</span><span class="pun">);</span><span class="pln">
		send </span><span class="pun">=(</span><span class="typ">Button</span><span class="pun">)</span><span class="pln"> findViewById</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">id</span><span class="pun">.</span><span class="pln">sendbtn</span><span class="pun">);</span><span class="pln">
		et </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="typ">EditText</span><span class="pun">)</span><span class="pln">findViewById</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">id</span><span class="pun">.</span><span class="pln">editt</span><span class="pun">);</span><span class="pln">

		send</span><span class="pun">.</span><span class="pln">setOnClickListener</span><span class="pun">(</span><span class="kwd">new</span><span class="pln"> </span><span class="typ">View</span><span class="pun">.</span><span class="typ">OnClickListener</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
			</span><span class="lit">@Override</span><span class="pln">
			</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> onClick</span><span class="pun">(</span><span class="typ">View</span><span class="pln"> v</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
				</span><span class="com">//Create your Intent Here</span><span class="pln">
				</span><span class="typ">Intent</span><span class="pln"> i </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Intent</span><span class="pun">(</span><span class="typ">MainActivity</span><span class="pun">.</span><span class="kwd">this</span><span class="pun">,</span><span class="pln"> </span><span class="typ">SecondActivity</span><span class="pun">.</span><span class="kwd">class</span><span class="pun">);</span><span class="pln">
				</span><span class="typ">String</span><span class="pln"> name </span><span class="pun">=</span><span class="pln"> et</span><span class="pun">.</span><span class="pln">getText</span><span class="pun">().</span><span class="pln">toString</span><span class="pun">();</span><span class="pln">
				i</span><span class="pun">.</span><span class="pln">putExtra</span><span class="pun">(</span><span class="pln">NAME_TAG</span><span class="pun">,</span><span class="pln">name</span><span class="pun">);</span><span class="pln">
				startActivity</span><span class="pun">(</span><span class="pln">i</span><span class="pun">);</span><span class="pln">
			</span><span class="pun">}</span><span class="pln">
		</span><span class="pun">});</span><span class="pln">
	</span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	قمنا بتعريف المفتاح على هيئة نص ثابت وذلك لتسهيل استخدام المفتاح مرة أخرى عند استعادة البيانات في النشاط الآخر.
</p>

<p>
	ثم بعد ذلك نقوم بصنع واجهة المستخدم الخاصة بالنشاط الثاني:
</p>

<pre class="ipsCode prettyprint lang-xml prettyprinted" id="ips_uid_278_23">
<span class="pun">&lt;?</span><span class="pln">xml version</span><span class="pun">=</span><span class="str">"1.0"</span><span class="pln"> encoding</span><span class="pun">=</span><span class="str">"utf-8"</span><span class="pun">?&gt;</span><span class="pln">
</span><span class="tag">&lt;LinearLayout</span><span class="pln"> </span><span class="atn">xmlns:android</span><span class="pun">=</span><span class="atv">"http://schemas.android.com/apk/res/android"</span><span class="pln">
	</span><span class="atn">android:layout_width</span><span class="pun">=</span><span class="atv">"match_parent"</span><span class="pln">
	</span><span class="atn">android:layout_height</span><span class="pun">=</span><span class="atv">"match_parent"</span><span class="tag">&gt;</span><span class="pln">

	</span><span class="tag">&lt;TextView</span><span class="pln">
		</span><span class="atn">android:layout_width</span><span class="pun">=</span><span class="atv">"wrap_content"</span><span class="pln">
		</span><span class="atn">android:layout_height</span><span class="pun">=</span><span class="atv">"wrap_content"</span><span class="pln">
		</span><span class="atn">android:text</span><span class="pun">=</span><span class="atv">"Hello, "</span><span class="pln">
		</span><span class="atn">android:textSize</span><span class="pun">=</span><span class="atv">"21sp"</span><span class="pln">
		</span><span class="atn">android:id</span><span class="pun">=</span><span class="atv">"@+id/hellotxt"</span><span class="tag">/&gt;</span><span class="pln">
</span><span class="tag">&lt;/LinearLayout&gt;</span></pre>

<p>
	ولاستقبال النص الذي أرسلناه بداخل الـ Intent يجب علينا أولًا أن نستعيد الـ Intent الذي قام بفتح النشاط باستخدام التابع <span style="font-family:courier new,courier,monospace;">()getIntent</span>.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_278_25">
<span class="typ">Intent</span><span class="pln"> actIntent </span><span class="pun">=</span><span class="pln"> getIntent</span><span class="pun">();</span></pre>

<p>
	ولاستعادة النص الذي حفظناه نستخدم <span style="font-family:courier new,courier,monospace;">()getText().toString</span> ونمرر لها المفتاح الذي قمنا بحفظ البيانات به، ثم بعد ذلك نعرض هذا النص بداخل <span style="font-family:courier new,courier,monospace;">TextView</span>.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_278_29">
<span class="pln">package apps</span><span class="pun">.</span><span class="pln">noby</span><span class="pun">.</span><span class="pln">explicitintentexample</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">content</span><span class="pun">.</span><span class="typ">Intent</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">support</span><span class="pun">.</span><span class="pln">v7</span><span class="pun">.</span><span class="pln">app</span><span class="pun">.</span><span class="typ">AppCompatActivity</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">os</span><span class="pun">.</span><span class="typ">Bundle</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">widget</span><span class="pun">.</span><span class="typ">TextView</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">SecondActivity</span><span class="pln"> extends </span><span class="typ">AppCompatActivity</span><span class="pln"> </span><span class="pun">{</span><span class="pln">

	</span><span class="kwd">private</span><span class="pln"> </span><span class="typ">TextView</span><span class="pln"> tv</span><span class="pun">;</span><span class="pln">
	</span><span class="lit">@Override</span><span class="pln">
	</span><span class="kwd">protected</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> onCreate</span><span class="pun">(</span><span class="typ">Bundle</span><span class="pln"> savedInstanceState</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
		super</span><span class="pun">.</span><span class="pln">onCreate</span><span class="pun">(</span><span class="pln">savedInstanceState</span><span class="pun">);</span><span class="pln">
		setContentView</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">layout</span><span class="pun">.</span><span class="pln">activity_second</span><span class="pun">);</span><span class="pln">
		tv </span><span class="pun">=(</span><span class="typ">TextView</span><span class="pun">)</span><span class="pln"> findViewById</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">id</span><span class="pun">.</span><span class="pln">hellotxt</span><span class="pun">);</span><span class="pln">
		</span><span class="typ">Intent</span><span class="pln"> actIntent </span><span class="pun">=</span><span class="pln"> getIntent</span><span class="pun">();</span><span class="pln">
		</span><span class="typ">String</span><span class="pln"> name </span><span class="pun">=</span><span class="pln"> actIntent</span><span class="pun">.</span><span class="pln">getExtras</span><span class="pun">().</span><span class="pln">getString</span><span class="pun">(</span><span class="typ">MainActivity</span><span class="pun">.</span><span class="pln">NAME_TAG</span><span class="pun">);</span><span class="pln">
		tv</span><span class="pun">.</span><span class="pln">setText</span><span class="pun">(</span><span class="str">"Hello, "</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> name</span><span class="pun">);</span><span class="pln">
	</span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	ثم نقوم بتجربة التطبيق على المحاكي.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="17635" href="https://academy.hsoub.com/uploads/monthly_2016_06/06.png.fe9debb6de435e1b8173837d9a18e572.png" rel=""><img alt="06.png" class="ipsImage ipsImage_thumbnailed" data-fileid="17635" data-unique="liaxi7kv2" src="https://academy.hsoub.com/uploads/monthly_2016_06/06.thumb.png.e3bf0b82188cc9e4f2bca3445cbd721a.png"></a>
</p>

<h2>
	<br>
	المثال الثالث
</h2>

<p>
	سنقوم في هذا المثال بإعادة البيانات من النشاط الثاني إلى النشاط الأول عند الانتهاء من التفاعل مع النشاط الثاني.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="17636" href="https://academy.hsoub.com/uploads/monthly_2016_06/07.png.87bf23d5a072ae164b40bef6fc440def.png" rel=""><img alt="07.png" class="ipsImage ipsImage_thumbnailed" data-fileid="17636" data-unique="pew4p71my" src="https://academy.hsoub.com/uploads/monthly_2016_06/07.thumb.png.2692f76849a4369eec8c92242fe5c345.png"></a>
</p>

<p>
	أولًا نُنشئ تطبيقًا جديدًا به نشاطان كما في الأمثلة السابقة ونبدأ بصنع واجهة المستخدم الخاصة بالنشاط الأول.
</p>

<pre class="ipsCode prettyprint lang-xml prettyprinted" id="ips_uid_278_31">
<span class="pun">&lt;?</span><span class="pln">xml version</span><span class="pun">=</span><span class="str">"1.0"</span><span class="pln"> encoding</span><span class="pun">=</span><span class="str">"utf-8"</span><span class="pun">?&gt;</span><span class="pln">
</span><span class="tag">&lt;LinearLayout</span><span class="pln"> </span><span class="atn">xmlns:android</span><span class="pun">=</span><span class="atv">"http://schemas.android.com/apk/res/android"</span><span class="pln">
	</span><span class="atn">android:layout_width</span><span class="pun">=</span><span class="atv">"match_parent"</span><span class="pln">
	</span><span class="atn">android:layout_height</span><span class="pun">=</span><span class="atv">"match_parent"</span><span class="pln">
	</span><span class="atn">android:orientation</span><span class="pun">=</span><span class="atv">"vertical"</span><span class="tag">&gt;</span><span class="pln">
  
	</span><span class="tag">&lt;Button</span><span class="pln">
		</span><span class="atn">android:layout_width</span><span class="pun">=</span><span class="atv">"wrap_content"</span><span class="pln">
		</span><span class="atn">android:layout_height</span><span class="pun">=</span><span class="atv">"wrap_content"</span><span class="pln">
		</span><span class="atn">android:text</span><span class="pun">=</span><span class="atv">"Register"</span><span class="pln">
		</span><span class="atn">android:id</span><span class="pun">=</span><span class="atv">"@+id/regbtn"</span><span class="tag">/&gt;</span><span class="pln">

	</span><span class="tag">&lt;TextView</span><span class="pln">
		</span><span class="atn">android:layout_width</span><span class="pun">=</span><span class="atv">"wrap_content"</span><span class="pln">
		</span><span class="atn">android:layout_height</span><span class="pun">=</span><span class="atv">"wrap_content"</span><span class="pln">
		</span><span class="atn">android:text</span><span class="pun">=</span><span class="atv">"NO Name"</span><span class="pln">
		</span><span class="atn">android:textSize</span><span class="pun">=</span><span class="atv">"30sp"</span><span class="pln">
		</span><span class="atn">android:id</span><span class="pun">=</span><span class="atv">"@+id/regtxt"</span><span class="tag">/&gt;</span><span class="pln">
</span><span class="tag">&lt;/LinearLayout&gt;</span></pre>

<p>
	وبداخل النشاط الأول نقوم باستدعاء النشاط الثاني عند الضغط على الزر المتواجد بالواجهة ولكن في هذا المثال لإخبار نظام التشغيل بأننا ننتظر بيانات من النشاط الآخر سنقوم بفتح النشاط الآخر بالتابع <span style="font-family:courier new,courier,monospace;">()startActivityForResult </span>بدلًا من التابع <span style="font-family:courier new,courier,monospace;">()startActivity</span>.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_278_33">
<span class="kwd">private</span><span class="pln"> </span><span class="kwd">static</span><span class="pln"> final </span><span class="kwd">int</span><span class="pln"> ACTIVITY_REQUEST_CODE </span><span class="pun">=</span><span class="pln"> </span><span class="lit">6</span><span class="pln"> </span><span class="pun">;</span><span class="pln">
</span><span class="kwd">private</span><span class="pln"> </span><span class="typ">Button</span><span class="pln"> reg</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">private</span><span class="pln"> </span><span class="typ">TextView</span><span class="pln"> tv</span><span class="pun">;</span><span class="pln">

</span><span class="lit">@Override</span><span class="pln">
</span><span class="kwd">protected</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> onCreate</span><span class="pun">(</span><span class="typ">Bundle</span><span class="pln"> savedInstanceState</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
	super</span><span class="pun">.</span><span class="pln">onCreate</span><span class="pun">(</span><span class="pln">savedInstanceState</span><span class="pun">);</span><span class="pln">
	setContentView</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">layout</span><span class="pun">.</span><span class="pln">activity_main</span><span class="pun">);</span><span class="pln">
	reg </span><span class="pun">=(</span><span class="typ">Button</span><span class="pun">)</span><span class="pln"> findViewById</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">id</span><span class="pun">.</span><span class="pln">regbtn</span><span class="pun">);</span><span class="pln">
	tv </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="typ">TextView</span><span class="pun">)</span><span class="pln">findViewById</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">id</span><span class="pun">.</span><span class="pln">regtxt</span><span class="pun">);</span><span class="pln">

	reg</span><span class="pun">.</span><span class="pln">setOnClickListener</span><span class="pun">(</span><span class="kwd">new</span><span class="pln"> </span><span class="typ">View</span><span class="pun">.</span><span class="typ">OnClickListener</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
		</span><span class="lit">@Override</span><span class="pln">
		</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> onClick</span><span class="pun">(</span><span class="typ">View</span><span class="pln"> v</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
			</span><span class="com">//Create your Intent Here</span><span class="pln">
			</span><span class="typ">Intent</span><span class="pln"> i </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Intent</span><span class="pun">(</span><span class="typ">MainActivity</span><span class="pun">.</span><span class="kwd">this</span><span class="pun">,</span><span class="pln"> </span><span class="typ">SecondActivity</span><span class="pun">.</span><span class="kwd">class</span><span class="pun">);</span><span class="pln">
			startActivityForResult</span><span class="pun">(</span><span class="pln">i</span><span class="pun">,</span><span class="pln">ACTIVITY_REQUEST_CODE</span><span class="pun">);</span><span class="pln">
		</span><span class="pun">}</span><span class="pln">
	</span><span class="pun">});</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	ونمرر للتابع <span style="font-family:courier new,courier,monospace;">()startActivityForResult </span>الـ Intent كالمعتاد والرقم الخاص بالطلب وهذا الرقم هو أي رقم صحيح، وفائدته عند رجوع البيانات للنشاط مرة أخرى التمييز بين أي الأنشطة التي قامت بإرسال هذه البيانات.
</p>

<p>
	وفي هذا المثال قمنا بتعريف رقم ثابت وتمريره للتابع وعند عودة البيانات سنقوم بالتأكد من هذا الرقم مرة أخرى.
</p>

<p>
	والآن نقوم بصنع الواجهة الخاصة بالنشاط الآخر في ملف <span style="font-family:courier new,courier,monospace;">activity_second.xml:</span>
</p>

<pre class="ipsCode prettyprint lang-xml prettyprinted" id="ips_uid_278_35">
<span class="pun">&lt;?</span><span class="pln">xml version</span><span class="pun">=</span><span class="str">"1.0"</span><span class="pln"> encoding</span><span class="pun">=</span><span class="str">"utf-8"</span><span class="pun">?&gt;</span><span class="pln">
</span><span class="tag">&lt;LinearLayout</span><span class="pln"> </span><span class="atn">xmlns:android</span><span class="pun">=</span><span class="atv">"http://schemas.android.com/apk/res/android"</span><span class="pln">
	</span><span class="atn">android:layout_width</span><span class="pun">=</span><span class="atv">"match_parent"</span><span class="pln">
	</span><span class="atn">android:layout_height</span><span class="pun">=</span><span class="atv">"match_parent"</span><span class="pln">
	</span><span class="atn">android:orientation</span><span class="pun">=</span><span class="atv">"vertical"</span><span class="tag">&gt;</span><span class="pln">

	</span><span class="tag">&lt;EditText</span><span class="pln">
		</span><span class="atn">android:layout_width</span><span class="pun">=</span><span class="atv">"match_parent"</span><span class="pln">
		</span><span class="atn">android:layout_height</span><span class="pun">=</span><span class="atv">"wrap_content"</span><span class="pln">
		</span><span class="atn">android:hint</span><span class="pun">=</span><span class="atv">"Enter Your Name"</span><span class="pln">
		</span><span class="atn">android:textSize</span><span class="pun">=</span><span class="atv">"21sp"</span><span class="pln">
		</span><span class="atn">android:id</span><span class="pun">=</span><span class="atv">"@+id/edttxt"</span><span class="tag">/&gt;</span><span class="pln">

	</span><span class="tag">&lt;Button</span><span class="pln">
		</span><span class="atn">android:layout_width</span><span class="pun">=</span><span class="atv">"wrap_content"</span><span class="pln">
		</span><span class="atn">android:layout_height</span><span class="pun">=</span><span class="atv">"wrap_content"</span><span class="pln">
		</span><span class="atn">android:text</span><span class="pun">=</span><span class="atv">"Enter"</span><span class="pln">
		</span><span class="atn">android:id</span><span class="pun">=</span><span class="atv">"@+id/entbtn"</span><span class="pln">
		</span><span class="atn">android:layout_gravity</span><span class="pun">=</span><span class="atv">"right"</span><span class="tag">/&gt;</span><span class="pln">
</span><span class="tag">&lt;/LinearLayout&gt;</span></pre>

<p>
	بعد ذلك نكتب شيفرة التحكم الخاصة بهذا النشاط.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_278_37">
<span class="pln">package apps</span><span class="pun">.</span><span class="pln">noby</span><span class="pun">.</span><span class="pln">explicitintentexample</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">content</span><span class="pun">.</span><span class="typ">Intent</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">app</span><span class="pun">.</span><span class="typ">Activity</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">os</span><span class="pun">.</span><span class="typ">Bundle</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">view</span><span class="pun">.</span><span class="typ">View</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">widget</span><span class="pun">.</span><span class="typ">Button</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">widget</span><span class="pun">.</span><span class="typ">EditText</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">SecondActivity</span><span class="pln"> extends </span><span class="typ">Activity</span><span class="pln"> </span><span class="pun">{</span><span class="pln">

	</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">static</span><span class="pln"> final </span><span class="typ">String</span><span class="pln"> REG_NAME_TAG </span><span class="pun">=</span><span class="str">"name"</span><span class="pln"> </span><span class="pun">;</span><span class="pln">
	</span><span class="kwd">private</span><span class="pln"> </span><span class="typ">EditText</span><span class="pln"> et</span><span class="pun">;</span><span class="pln">
	</span><span class="kwd">private</span><span class="pln"> </span><span class="typ">Button</span><span class="pln"> enter</span><span class="pun">;</span><span class="pln">

	</span><span class="lit">@Override</span><span class="pln">
	</span><span class="kwd">protected</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> onCreate</span><span class="pun">(</span><span class="typ">Bundle</span><span class="pln"> savedInstanceState</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
		super</span><span class="pun">.</span><span class="pln">onCreate</span><span class="pun">(</span><span class="pln">savedInstanceState</span><span class="pun">);</span><span class="pln">
		setContentView</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">layout</span><span class="pun">.</span><span class="pln">activity_second</span><span class="pun">);</span><span class="pln">
		et </span><span class="pun">=(</span><span class="typ">EditText</span><span class="pun">)</span><span class="pln"> findViewById</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">id</span><span class="pun">.</span><span class="pln">edttxt</span><span class="pun">);</span><span class="pln">
		enter </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="typ">Button</span><span class="pun">)</span><span class="pln"> findViewById</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">id</span><span class="pun">.</span><span class="pln">entbtn</span><span class="pun">);</span><span class="pln">

		enter</span><span class="pun">.</span><span class="pln">setOnClickListener</span><span class="pun">(</span><span class="kwd">new</span><span class="pln"> </span><span class="typ">View</span><span class="pun">.</span><span class="typ">OnClickListener</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
			</span><span class="lit">@Override</span><span class="pln">
			</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> onClick</span><span class="pun">(</span><span class="typ">View</span><span class="pln"> v</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
				</span><span class="typ">String</span><span class="pln"> str </span><span class="pun">=</span><span class="pln"> et</span><span class="pun">.</span><span class="pln">getText</span><span class="pun">().</span><span class="pln">toString</span><span class="pun">();</span><span class="pln">
				</span><span class="typ">Intent</span><span class="pln"> in </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Intent</span><span class="pun">();</span><span class="pln">
				in</span><span class="pun">.</span><span class="pln">putExtra</span><span class="pun">(</span><span class="pln">REG_NAME_TAG</span><span class="pun">,</span><span class="pln">str</span><span class="pun">);</span><span class="pln">
				setResult</span><span class="pun">(</span><span class="pln">RESULT_OK</span><span class="pun">,</span><span class="pln">in</span><span class="pun">);</span><span class="pln">
				finish</span><span class="pun">();</span><span class="pln">
			</span><span class="pun">}</span><span class="pln">
		</span><span class="pun">});</span><span class="pln">
	</span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	فعند الضغط على الزر <span style="font-family:courier new,courier,monospace;">Enter</span> نقوم بتسجيل النص المتواجد بداخل العنصر <span style="font-family:courier new,courier,monospace;">EditText</span>، إنشاء Intent جديد وحفظ النص بداخله ثم استدعاء التابع <span style="font-family:courier new,courier,monospace;">()setResult</span> والذي يمكننا من إرسال البيانات التي قمنا بتخزينها داخل Intent إلى من قام باستدعاء هذا النشاط.
</p>

<p>
	ونمرر للتابع <span style="font-family:courier new,courier,monospace;">()setResult</span> الثابت <span style="font-family:courier new,courier,monospace;">RESULT_OK </span>والمعرّف داخل الـ (<abbr title="Application Programming Interface | واجهة برمجية">API</abbr> (android.app.Activity كما نمرر لها الـ Intent الذي قمنا بإنشائه وحفظ البيانات بداخله.
</p>

<p>
	أخيرًا نستخدم التابع<span style="font-family:courier new,courier,monospace;"> ()finish</span> وهو المسؤول عن غلق النشاط.
</p>

<p>
	لاستقبال هذه البيانات في النشاط الأول نقوم بتضمين التابع <span style="font-family:courier new,courier,monospace;">()onActivityResult</span> في النشاط كما يلي.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_278_39">
<span class="pln">package apps</span><span class="pun">.</span><span class="pln">noby</span><span class="pun">.</span><span class="pln">explicitintentexample</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">app</span><span class="pun">.</span><span class="typ">Activity</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">content</span><span class="pun">.</span><span class="typ">Intent</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">os</span><span class="pun">.</span><span class="typ">Bundle</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">view</span><span class="pun">.</span><span class="typ">View</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">widget</span><span class="pun">.</span><span class="typ">Button</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">widget</span><span class="pun">.</span><span class="typ">EditText</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">widget</span><span class="pun">.</span><span class="typ">TextView</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">MainActivity</span><span class="pln"> extends </span><span class="typ">Activity</span><span class="pln"> </span><span class="pun">{</span><span class="pln">

	</span><span class="kwd">private</span><span class="pln"> </span><span class="kwd">static</span><span class="pln"> final </span><span class="kwd">int</span><span class="pln"> ACTIVITY_REQUEST_CODE </span><span class="pun">=</span><span class="pln"> </span><span class="lit">6</span><span class="pln"> </span><span class="pun">;</span><span class="pln">
	</span><span class="kwd">private</span><span class="pln"> </span><span class="typ">Button</span><span class="pln"> reg</span><span class="pun">;</span><span class="pln">
	</span><span class="kwd">private</span><span class="pln"> </span><span class="typ">TextView</span><span class="pln"> tv</span><span class="pun">;</span><span class="pln">


	</span><span class="lit">@Override</span><span class="pln">
	</span><span class="kwd">protected</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> onCreate</span><span class="pun">(</span><span class="typ">Bundle</span><span class="pln"> savedInstanceState</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
		super</span><span class="pun">.</span><span class="pln">onCreate</span><span class="pun">(</span><span class="pln">savedInstanceState</span><span class="pun">);</span><span class="pln">
		setContentView</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">layout</span><span class="pun">.</span><span class="pln">activity_main</span><span class="pun">);</span><span class="pln">
		reg </span><span class="pun">=(</span><span class="typ">Button</span><span class="pun">)</span><span class="pln"> findViewById</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">id</span><span class="pun">.</span><span class="pln">regbtn</span><span class="pun">);</span><span class="pln">
		tv </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="typ">TextView</span><span class="pun">)</span><span class="pln">findViewById</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">id</span><span class="pun">.</span><span class="pln">regtxt</span><span class="pun">);</span><span class="pln">

		reg</span><span class="pun">.</span><span class="pln">setOnClickListener</span><span class="pun">(</span><span class="kwd">new</span><span class="pln"> </span><span class="typ">View</span><span class="pun">.</span><span class="typ">OnClickListener</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
			</span><span class="lit">@Override</span><span class="pln">
			</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> onClick</span><span class="pun">(</span><span class="typ">View</span><span class="pln"> v</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
				</span><span class="com">//Create your Intent Here</span><span class="pln">
				</span><span class="typ">Intent</span><span class="pln"> i </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Intent</span><span class="pun">(</span><span class="typ">MainActivity</span><span class="pun">.</span><span class="kwd">this</span><span class="pun">,</span><span class="pln"> </span><span class="typ">SecondActivity</span><span class="pun">.</span><span class="kwd">class</span><span class="pun">);</span><span class="pln">
				startActivityForResult</span><span class="pun">(</span><span class="pln">i</span><span class="pun">,</span><span class="pln">ACTIVITY_REQUEST_CODE</span><span class="pun">);</span><span class="pln">
			</span><span class="pun">}</span><span class="pln">
		</span><span class="pun">});</span><span class="pln">
	</span><span class="pun">}</span><span class="pln">

	</span><span class="lit">@Override</span><span class="pln">
	</span><span class="kwd">protected</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> onActivityResult</span><span class="pun">(</span><span class="kwd">int</span><span class="pln"> requestCode</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> resultCode</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Intent</span><span class="pln"> data</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
		</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln"> </span><span class="pun">(</span><span class="pln">resultCode </span><span class="pun">==</span><span class="pln"> RESULT_OK</span><span class="pun">)</span><span class="pln"> </span><span class="pun">&amp;&amp;</span><span class="pln"> </span><span class="pun">(</span><span class="pln">requestCode </span><span class="pun">==</span><span class="pln"> ACTIVITY_REQUEST_CODE</span><span class="pun">)){</span><span class="pln">
			</span><span class="typ">String</span><span class="pln"> name </span><span class="pun">=</span><span class="pln"> data</span><span class="pun">.</span><span class="pln">getExtras</span><span class="pun">().</span><span class="pln">getString</span><span class="pun">(</span><span class="typ">SecondActivity</span><span class="pun">.</span><span class="pln">REG_NAME_TAG</span><span class="pun">);</span><span class="pln">
			tv</span><span class="pun">.</span><span class="pln">setText</span><span class="pun">(</span><span class="pln">name</span><span class="pun">);</span><span class="pln">
		</span><span class="pun">}</span><span class="pln">
	</span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	وبداخل هذا التابع نتأكد من أن النشاط السابق تم إغلاقه بشكل صحيح ولم يحدث له مشكلة عن طريق التأكد من أن المتغير <span style="font-family:courier new,courier,monospace;">resultCode</span> يساوي <span style="font-family:courier new,courier,monospace;">RESULT_OK</span> التي قمنا بتمريرها للتابع<span style="font-family:courier new,courier,monospace;"> ()setResult</span> ثم نتأكد أيضًا من أن النشاط الذي يُعيد هذه البيانات له رقم طلب يساوي رقم الطلب الذي قمنا باستخدامه مسبقًا، بعد ذلك نبدأ في استقبال البيانات.
</p>

<p>
	ثم نقوم بتشغيل التطبيق على المحاكي.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="17637" href="https://academy.hsoub.com/uploads/monthly_2016_06/08.png.8d20662f1102cf6d4f7dd192f2e6c665.png" rel=""><img alt="08.png" class="ipsImage ipsImage_thumbnailed" data-fileid="17637" data-unique="qg8rjrwnn" src="https://academy.hsoub.com/uploads/monthly_2016_06/08.thumb.png.cea5e7796f2ff0e12687ac7766145e56.png"></a>
</p>

<p>
	الأمثلة السابقة كانت باستخدام Explicit Intent للقيام بالوظيفة المطلوبة ولربط مكونات التطبيق المختلفة ببعضها فيمكنك من صنع تطبيق متعدد الأنشطة، في الأمثلة القادمة سنقوم باستخدام الـ Implicit Intents والتعامل معها.
</p>

<h2>
	المثال الرابع
</h2>

<p>
	في هذا المثال سنقوم بفتح موقع أكاديمية حسوب في تطبيق المتصفح، وبنفس الطريقة يمكن فتح الروابط الأخرى خارج التطبيق.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="17638" href="https://academy.hsoub.com/uploads/monthly_2016_06/09.png.da87ba7fe8bfe993c79001d0be39fd05.png" rel=""><img alt="09.png" class="ipsImage ipsImage_thumbnailed" data-fileid="17638" data-unique="mctyyejxt" src="https://academy.hsoub.com/uploads/monthly_2016_06/09.thumb.png.0b4839a98550846d64d510c7f41129cf.png"></a>
</p>

<p>
	قم بإنشاء تطبيق جديد يُدعى "Implicit Intent Example" ثم نبدأ بصنع واجهة المستخدم في ملف<span style="font-family:courier new,courier,monospace;"> activity_main.xml:</span>
</p>

<pre class="ipsCode prettyprint lang-xml prettyprinted" id="ips_uid_278_41">
<span class="pun">&lt;?</span><span class="pln">xml version</span><span class="pun">=</span><span class="str">"1.0"</span><span class="pln"> encoding</span><span class="pun">=</span><span class="str">"utf-8"</span><span class="pun">?&gt;</span><span class="pln">
</span><span class="tag">&lt;LinearLayout</span><span class="pln"> </span><span class="atn">xmlns:android</span><span class="pun">=</span><span class="atv">"http://schemas.android.com/apk/res/android"</span><span class="pln">
	</span><span class="atn">android:layout_width</span><span class="pun">=</span><span class="atv">"match_parent"</span><span class="pln">
	</span><span class="atn">android:layout_height</span><span class="pun">=</span><span class="atv">"match_parent"</span><span class="pln">
	</span><span class="atn">android:orientation</span><span class="pun">=</span><span class="atv">"vertical"</span><span class="pln">
	</span><span class="atn">android:gravity</span><span class="pun">=</span><span class="atv">"center"</span><span class="tag">&gt;</span><span class="pln">
  
	</span><span class="tag">&lt;Button</span><span class="pln">
		</span><span class="atn">android:layout_width</span><span class="pun">=</span><span class="atv">"wrap_content"</span><span class="pln">
		</span><span class="atn">android:layout_height</span><span class="pun">=</span><span class="atv">"wrap_content"</span><span class="pln">
		</span><span class="atn">android:text</span><span class="pun">=</span><span class="atv">"Open Hsoub Academy"</span><span class="pln">
		</span><span class="atn">android:id</span><span class="pun">=</span><span class="atv">"@+id/opnbtn"</span><span class="tag">/&gt;</span><span class="pln">
</span><span class="tag">&lt;/LinearLayout&gt;</span></pre>

<p>
	وعند الضغط على الزر نقوم بفتح الرابط.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_278_43">
<span class="typ">Intent</span><span class="pln"> i </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Intent</span><span class="pun">(</span><span class="typ">Intent</span><span class="pun">.</span><span class="pln">ACTION_VIEW</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Uri</span><span class="pun">.</span><span class="pln">parse</span><span class="pun">(</span><span class="str">"http://academy.hsoub.com"</span><span class="pun">));</span><span class="pln">
startActivity</span><span class="pun">(</span><span class="pln">i</span><span class="pun">);</span></pre>

<p>
	ونمرر لدالة البناء الخاصة بالـ Intent نوع الفعل الذي نريده من التطبيق الخارجي وفي هذا المثال نريد تطبيق يستطيع عرض البيانات بداخله، ثم نمرر له نوع البيانات المراد عرضها وهي الرابط الخاص بموقع أكاديمية حسوب.
</p>

<p>
	لتصبح الشيفرة النهائية الخاصة بالبرنامج كما يلي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_278_45">
<span class="pln">package apps</span><span class="pun">.</span><span class="pln">noby</span><span class="pun">.</span><span class="pln">explicitintentexample</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">app</span><span class="pun">.</span><span class="typ">Activity</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">content</span><span class="pun">.</span><span class="typ">Intent</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">net</span><span class="pun">.</span><span class="typ">Uri</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">os</span><span class="pun">.</span><span class="typ">Bundle</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">view</span><span class="pun">.</span><span class="typ">View</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">widget</span><span class="pun">.</span><span class="typ">Button</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">widget</span><span class="pun">.</span><span class="typ">TextView</span><span class="pun">;</span><span class="pln">


</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">MainActivity</span><span class="pln"> extends </span><span class="typ">Activity</span><span class="pln"> </span><span class="pun">{</span><span class="pln">

	</span><span class="kwd">private</span><span class="pln"> </span><span class="typ">Button</span><span class="pln"> open</span><span class="pun">;</span><span class="pln">

	</span><span class="lit">@Override</span><span class="pln">
	</span><span class="kwd">protected</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> onCreate</span><span class="pun">(</span><span class="typ">Bundle</span><span class="pln"> savedInstanceState</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
		super</span><span class="pun">.</span><span class="pln">onCreate</span><span class="pun">(</span><span class="pln">savedInstanceState</span><span class="pun">);</span><span class="pln">
		setContentView</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">layout</span><span class="pun">.</span><span class="pln">activity_main</span><span class="pun">);</span><span class="pln">
		open </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="typ">Button</span><span class="pun">)</span><span class="pln"> findViewById</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">id</span><span class="pun">.</span><span class="pln">opnbtn</span><span class="pun">);</span><span class="pln">

		open</span><span class="pun">.</span><span class="pln">setOnClickListener</span><span class="pun">(</span><span class="kwd">new</span><span class="pln"> </span><span class="typ">View</span><span class="pun">.</span><span class="typ">OnClickListener</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
			</span><span class="lit">@Override</span><span class="pln">
			</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> onClick</span><span class="pun">(</span><span class="typ">View</span><span class="pln"> v</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
				</span><span class="com">//Create your Intent Here</span><span class="pln">
				</span><span class="typ">Intent</span><span class="pln"> i </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Intent</span><span class="pun">(</span><span class="typ">Intent</span><span class="pun">.</span><span class="pln">ACTION_VIEW</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Uri</span><span class="pun">.</span><span class="pln">parse</span><span class="pun">(</span><span class="str">"http://academy.hsoub.com"</span><span class="pun">));</span><span class="pln">
				startActivity</span><span class="pun">(</span><span class="pln">i</span><span class="pun">);</span><span class="pln">
			</span><span class="pun">}</span><span class="pln">
		</span><span class="pun">});</span><span class="pln">
	</span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	ثم نقوم بتجربة التطبيق النهائي على المحاكي.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="17639" href="https://academy.hsoub.com/uploads/monthly_2016_06/10.png.01110a46854b2bc9bca8a26ba8594f93.png" rel=""><img alt="10.png" class="ipsImage ipsImage_thumbnailed" data-fileid="17639" data-unique="ofpjpe8qa" src="https://academy.hsoub.com/uploads/monthly_2016_06/10.thumb.png.a66b86c836b024e65a3118f06f93d4e7.png"></a>
</p>

<h2>
	المثال الخامس
</h2>

<p>
	في هذا التطبيق سنقوم بالاتصال من خلال فتح تطبيق الاتصال من داخل التطبيق الخاص بنا.
</p>

<p>
	نبدأ أولًا بصنع واجهة المستخدم في ملف <span style="font-family:courier new,courier,monospace;">activity_main.xml:</span>
</p>

<pre class="ipsCode prettyprint lang-xml prettyprinted" id="ips_uid_278_47">
<span class="pun">&lt;?</span><span class="pln">xml version</span><span class="pun">=</span><span class="str">"1.0"</span><span class="pln"> encoding</span><span class="pun">=</span><span class="str">"utf-8"</span><span class="pun">?&gt;</span><span class="pln">
</span><span class="tag">&lt;LinearLayout</span><span class="pln"> </span><span class="atn">xmlns:android</span><span class="pun">=</span><span class="atv">"http://schemas.android.com/apk/res/android"</span><span class="pln">
	</span><span class="atn">android:layout_width</span><span class="pun">=</span><span class="atv">"match_parent"</span><span class="pln">
	</span><span class="atn">android:layout_height</span><span class="pun">=</span><span class="atv">"match_parent"</span><span class="pln">
	</span><span class="atn">android:orientation</span><span class="pun">=</span><span class="atv">"vertical"</span><span class="pln">
	</span><span class="atn">android:gravity</span><span class="pun">=</span><span class="atv">"center"</span><span class="tag">&gt;</span><span class="pln">

  	</span><span class="tag">&lt;Button</span><span class="pln">
		</span><span class="atn">android:layout_width</span><span class="pun">=</span><span class="atv">"wrap_content"</span><span class="pln">
		</span><span class="atn">android:layout_height</span><span class="pun">=</span><span class="atv">"wrap_content"</span><span class="pln">
		</span><span class="atn">android:text</span><span class="pun">=</span><span class="atv">"Dial Number"</span><span class="pln">
		</span><span class="atn">android:id</span><span class="pun">=</span><span class="atv">"@+id/dialbtn"</span><span class="tag">/&gt;</span><span class="pln">
</span><span class="tag">&lt;/LinearLayout&gt;</span></pre>

<p>
	وعند الضغط على الزر نقوم بالاتصال بالرقم التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_278_49">
<span class="typ">Intent</span><span class="pln"> i </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Intent</span><span class="pun">(</span><span class="typ">Intent</span><span class="pun">.</span><span class="pln">ACTION_DIAL</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Uri</span><span class="pun">.</span><span class="pln">parse</span><span class="pun">(</span><span class="str">"tel:0123456789"</span><span class="pun">));</span><span class="pln">
startActivity</span><span class="pun">(</span><span class="pln">i</span><span class="pun">);</span></pre>

<p>
	ونمرر لدالة البناء الخاصة بالـ Intent نوع الفعل الذي نريده وهو الاتصال بالرقم، ثم نمرر له الرقم.
</p>

<p>
	ثم نقوم بتجربة التطبيق النهائي على المحاكي.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="17640" href="https://academy.hsoub.com/uploads/monthly_2016_06/11.png.4e517aa39ba8296cbe239bc14b482fd2.png" rel=""><img alt="11.png" class="ipsImage ipsImage_thumbnailed" data-fileid="17640" data-unique="xsgt94xlw" src="https://academy.hsoub.com/uploads/monthly_2016_06/11.thumb.png.386e57a5754be27c2de332510f0edd44.png"></a>
</p>

<p>
	بهذا نكون قد وصلنا إلى نهاية هذا الدرس، في انتظار تجربتكم وآرائكم.
</p>
]]></description><guid isPermaLink="false">347</guid><pubDate>Fri, 10 Jun 2016 07:35:00 +0000</pubDate></item><item><title>&#x627;&#x644;&#x639;&#x646;&#x627;&#x635;&#x631; &#x627;&#x644;&#x623;&#x633;&#x627;&#x633;&#x64A;&#x629; &#x644;&#x628;&#x646;&#x627;&#x621; &#x62A;&#x637;&#x628;&#x64A;&#x642;&#x627;&#x62A; &#x623;&#x646;&#x62F;&#x631;&#x648;&#x64A;&#x62F; &#x648;&#x627;&#x644;&#x62A;&#x62D;&#x643;&#x645; &#x628;&#x648;&#x627;&#x62C;&#x647;&#x629; &#x627;&#x644;&#x645;&#x633;&#x62A;&#x62E;&#x62F;&#x645;</title><link>https://academy.hsoub.com/programming/android/%D8%A7%D9%84%D8%B9%D9%86%D8%A7%D8%B5%D8%B1-%D8%A7%D9%84%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A9-%D9%84%D8%A8%D9%86%D8%A7%D8%A1-%D8%AA%D8%B7%D8%A8%D9%8A%D9%82%D8%A7%D8%AA-%D8%A3%D9%86%D8%AF%D8%B1%D9%88%D9%8A%D8%AF-%D9%88%D8%A7%D9%84%D8%AA%D8%AD%D9%83%D9%85-%D8%A8%D9%88%D8%A7%D8%AC%D9%87%D8%A9-%D8%A7%D9%84%D9%85%D8%B3%D8%AA%D8%AE%D8%AF%D9%85-r339/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2016_05/android-activities.png.520d0d3ab6f45901fc933eff97d7a341.png" /></p>

<h2 dir="rtl">
	العناصر الأساسية في تطبيقات أندرويد
</h2>

<p dir="rtl" style="text-align: center;">
	<img alt="android-activities.png" class="ipsImage ipsImage_thumbnailed" data-fileid="16777" data-unique="t8kh2f6sn" src="https://academy.hsoub.com/uploads/monthly_2016_05/android-activities.png.ad433d3b6f741c1e1526c8265c91dba8.png"></p>

<p dir="rtl">
	تتكون تطبيقات أندرويد من أربعة عناصر أساسية لكل منها دورها الخاص الذي تستطيع القيام به، ويتم استخدامها بناءً على الغرض أو المهمة المطلوب تنفيذها وهي:
</p>

<h3 dir="rtl">
	النشاطات Activities
</h3>

<p dir="rtl">
	يُمثل واجهة واحدة والتي تظهر أمام المستخدم ويتفاعل معها، وقد يتكون التطبيق من عدة واجهات مختلفة وبالتالي عدة Activities مختلفة، فمثلًا تطبيق البريد الإلكتروني لديه واجهة خاصة بعرض البريد الجديد وعند قراءة محتوى رسالة محددة تظهر لك في واجهة أخرى مخصصة لذلك وإذا أردت إرسال رسالة بريد جديدة يظهر لك واجهة جديدة لقيام بهذه المهمة.
</p>

<p dir="rtl">
	فأغلب تطبيقات أندرويد تتكون من عدة نشاطات Activities ولكن عند فتح التطبيق هناك واجهة واحدة دائمًا ما تكون هي الواجهة الرئيسية والتي تُعرض أمام المستخدم وينتقل من خلالها إلى باقي النشاطات Activities الخاصة بالتطبيق.
</p>

<h3 dir="rtl">
	الخدمات Services
</h3>

<p dir="rtl">
	يُستخدم هذا العنصر بشكل أساسي عند القيام بعمليات طويلة ويتم تنفيذها في الخلفية دون تعطيل الواجهة الرئيسية أو تعامل المستخدم مع التطبيق، ومثال على ذلك عند تشغيل تطبيق المتصفح وتحميل ملف من أحد المواقع فيتم تنفيذ هذه المهمة في الخلفية ويتفاعل المستخدم مع المتصفح في ذات الوقت ولا ينتظر انتهاء التحميل، وذلك لأن هذه المهمة تمت من خلال العنصر Service.
</p>

<h3 dir="rtl">
	مستقبلات البث Broadcast Receivers
</h3>

<p dir="rtl">
	هي حلقة الاتصال بين التطبيق ونظام التشغيل. ويستخدم هذا العنصر لاستقبال الرسائل التي يبُثها نظام التشغيل أو تطبيق آخر، فمثلًا عندما يستقبل نظام التشغيل مكالمة هاتفية يقوم ببث رسالة لكل التطبيقات المتواجدة على الهاتف لإعلامهم بوجود مكالمة تحتاج إلى التطبيق الخاص بالاتصال والذي يستطيع التعامل معها وعرض بيناتها أمام المستخدم ويكون في تطبيق الاتصال هذا العنصر لاستقبال الرسالة من نظام التشغيل والتعامل معها، أو عندما ينتهي تطبيق من تحميل صورة يُرسل لباقي لتطبيقات رسالة أن هناك صوة جديدة على الهاتف يمكن للتطبيق المسؤول عنها التعامل معها.
</p>

<p dir="rtl">
	لذا فهذا العنصر هو المسؤول عن استقبال هذا النوع من الرسائل واتخاذ القرار المناسب.
</p>

<h3 dir="rtl">
	مزودو المحتوى Content Providers
</h3>

<p dir="rtl">
	يوفر هذا العنصر طريقة لمشاركة البيانات بين التطبيقات المختلفة، مثال على ذلك قاعدة البيانات الخاصة بجهات الاتصال على هاتفك نجد أن هناك بعض التطبيقات التي تستخدمها في تقديم خدماتها.
</p>

<h2 dir="rtl">
	النشاطات Activities
</h2>

<p dir="rtl">
	نبدأ أولًا بالنشاطات Activities حيث لا يخلو تطبيق من واجهة للمستخدم، لصنع نشاط في التطبيق يتم ذلك عن طريق كتابة صنف جديد Class يرث من صنف آخر اسمه Activity، وهذا الصنف هو الأب دائمًا عند عمل نشاط جديدة ويحتوي على التوابع Methods الخاصة بالنشاط والمكوّنة لها.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2277_7">
<span class="kwd">public</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">MainActivity</span><span class="pln"> extends </span><span class="typ">Activity</span><span class="pln"> </span><span class="pun">{</span><span class="pln">

</span><span class="pun">}</span></pre>

<p dir="rtl">
	إن كانت لديك خبرة سابقة في التعامل مع أي لغة برمجة فمن المؤكد أنك رأيت الدالة <span style="font-family:courier new,courier,monospace;">()main</span> والتي تُمثل نقطة البداية للبرنامج، ولكن في أندرويد هناك نشاط رئيسي يُمثل نقطة البداية للتطبيق ولكل نشاط دورة حياة خاصة به، وتتكون من مجموعة من التوابع methods يتم استدعاؤها لحظة إنشاء النّشاط ومجموعة من التوابع التي يتم استدعاؤها لحظة إزالة النّشاط ونجدها في الصورة التالية.
</p>

<p dir="rtl" style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="16767" href="https://academy.hsoub.com/uploads/monthly_2016_05/5746c2a4e04a0_Activity-Life-Cycle(1).png.a98ecba947e51cddc7000726230f48f6.png" rel=""><img alt="Activity-Life-Cycle (1).png" class="ipsImage ipsImage_thumbnailed" data-fileid="16767" data-unique="8jscrv18v" src="https://academy.hsoub.com/uploads/monthly_2016_05/5746c2a51dae1_Activity-Life-Cycle(1).thumb.png.05dd00232e4933c3151da16862f17fcb.png"></a>
</p>

<h2 dir="rtl">
	دورة حياة النشاط
</h2>

<ul dir="rtl">
<li>
		<span style="font-family:courier new,courier,monospace;">()onCreate</span>: ويتم استدعاؤه عند إنشاء النشاط أول مرة، ويتم بداخلها ربط الواجهة بالشيفرة التي تتحكم في التطبيق.
	</li>
	<li>
		<span style="font-family:courier new,courier,monospace;">()onStart</span>: ويتم استدعاؤه عندما تبدأ الواجهة في الظهور وبعد الانتهاء من <span style="font-family:courier new,courier,monospace;">()onCreate</span>.
	</li>
	<li>
		<span style="font-family:courier new,courier,monospace;">()onResume</span>: ويتم استدعاؤه عندما تظهر الواجهة الخاصة بالـ Activity ويتفاعل معها المستخدم.
	</li>
	<li>
		<span style="font-family:courier new,courier,monospace;">()onPause</span>: ويتم استدعاؤه عندما تبدأ الواجهة في الاختفاء أو تظهر بشكل جزئي ولا يمكن للمستخدم التفاعل معها لوجود شيء ما يحجبها وعند إزالة ما يحجبها يتم استدعاء <span style="font-family:courier new,courier,monospace;">()onResume</span> مرة أخرى.
	</li>
	<li>
		<span style="font-family:courier new,courier,monospace;">()onStop</span>: ويتم استدعاؤه عندما تختفي الواجهة من أمام المستخدم نتيجة للانتقال إلى واجهة أخرى داخل نفس التطبيق أو لغلق التطبيق والانتقال لتطبيق آخر.
	</li>
	<li>
		<span style="font-family:courier new,courier,monospace;">()onRestart</span>: ويتم استدعاؤه عند الرجوع مرة أخرى إلى نفس الواجهة ثم يتم استدعاء <span style="font-family:courier new,courier,monospace;">()onStart</span>.
	</li>
	<li>
		<span style="font-family:courier new,courier,monospace;">()onDestroy</span>: ويتم استدعاؤه قبل تدمير الواجهة وإزالتها من الذاكرة ويتم ذلك عندما يحتاج نظام التشغيل إلى المزيد من المساحة في الذاكرة أو إزالتها برمجيًا من الذاكرة.
	</li>
</ul>
<h2 dir="rtl">
	مثال 1
</h2>

<p dir="rtl">
	الآن قم بفتح Android Studio وسنقوم بعمل تطبيق جديد اسمه "Activity Life Cycle" حتى نرى كيف ينادي النظام التّوابع الخاصة بالنّشاط.
</p>

<p dir="rtl">
	سنختار<strong> Empty Activity</strong> وندع باقي الاختيارات كما هي.
</p>

<p dir="rtl" style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="16776" href="https://academy.hsoub.com/uploads/monthly_2016_05/1.png.81c5297c1d143e5b3c294901b0acda26.png" rel=""><img alt="1.png" class="ipsImage ipsImage_thumbnailed" data-fileid="16776" data-unique="lqgvysqu6" src="https://academy.hsoub.com/uploads/monthly_2016_05/1.thumb.png.185c74937ffc444d34883e0bdfcc776d.png"></a>
</p>

<p dir="rtl">
	بعد الانتهاء ستجد في المجلد java صنف Class يدعى <span style="font-family:courier new,courier,monospace;">MainActivity</span> ويرث من <span style="font-family:courier new,courier,monospace;">Activity</span> (قد تجد الصنف يرث من <span style="font-family:courier new,courier,monospace;">AppCompatActivity</span> يمكنك تغييرها إلى <span style="font-family:courier new,courier,monospace;">Activity</span> أو دعها كما هي فلا يوجد حاليًا فرق بينها).
</p>

<p dir="rtl">
	ستجد داخل الصنف التابع <span style="font-family:courier new,courier,monospace;">()onCreate</span>.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2277_9">
<span class="lit">@Override</span><span class="pln">
</span><span class="kwd">protected</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> onCreate</span><span class="pun">(</span><span class="typ">Bundle</span><span class="pln"> savedInstanceState</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  super</span><span class="pun">.</span><span class="pln">onCreate</span><span class="pun">(</span><span class="pln">savedInstanceState</span><span class="pun">);</span><span class="pln">
  setContentView</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">layout</span><span class="pun">.</span><span class="pln">activity_main</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span></pre>

<p dir="rtl">
	وستجد بداخلها أنها تستدعي <span style="font-family:courier new,courier,monospace;">;(setContentView(R.layout.activity_main</span> وتمرر لها <span style="font-family:courier new,courier,monospace;">R.layout.activity_main</span>، والحرف <span style="font-family:courier new,courier,monospace;">R</span> يعني المجلد <span style="font-family:courier new,courier,monospace;">res</span>، و <span style="font-family:comic sans ms,cursive;">Layout</span> هو المجلد المتواجد داخل <span style="font-family:courier new,courier,monospace;">res</span> بنفس الاسم، وبداخله نجد الملف <span style="font-family:courier new,courier,monospace;">activity_main.xml</span>.
</p>

<p dir="rtl">
	ويقوم هذا التابع بربط الواجهة التي نقوم بصنعها في ملف XML بالشيفرة المتواجدة في ملف الجافا للتحكم بالعناصر المتواجدة في الواجهة.
</p>

<p dir="rtl">
	سنضع هذا السطر بداخل <span style="font-family:courier new,courier,monospace;">()onCreate</span>.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2277_11">
<span class="typ">Toast</span><span class="pun">.</span><span class="pln">makeText</span><span class="pun">(</span><span class="kwd">this</span><span class="pun">,</span><span class="str">"onCreate Method"</span><span class="pun">,</span><span class="typ">Toast</span><span class="pun">.</span><span class="pln">LENGTH_SHORT</span><span class="pun">).</span><span class="pln">show</span><span class="pun">();</span></pre>

<p dir="rtl">
	ومن خلال هذا السطر نقوم بإظهار رسالة للمستخدم لمدة محددة كما في الصورة.
</p>

<p dir="rtl" style="text-align: center;">
	<img alt="2.png" class="ipsImage ipsImage_thumbnailed" data-fileid="16769" data-unique="3iin0axn1" src="https://academy.hsoub.com/uploads/monthly_2016_05/2.png.f31060993b8b27e1280261dcaac73f4f.png"></p>

<p dir="rtl">
	والآن نقوم بنفس الشيء لباقي التوابع:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2277_13">
<span class="pln">package apps</span><span class="pun">.</span><span class="pln">noby</span><span class="pun">.</span><span class="pln">activitylifecycle</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">app</span><span class="pun">.</span><span class="typ">Activity</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">os</span><span class="pun">.</span><span class="typ">Bundle</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">widget</span><span class="pun">.</span><span class="typ">Toast</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">MainActivity</span><span class="pln"> extends </span><span class="typ">Activity</span><span class="pln"> </span><span class="pun">{</span><span class="pln">

  </span><span class="lit">@Override</span><span class="pln">
  </span><span class="kwd">protected</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> onCreate</span><span class="pun">(</span><span class="typ">Bundle</span><span class="pln"> savedInstanceState</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    super</span><span class="pun">.</span><span class="pln">onCreate</span><span class="pun">(</span><span class="pln">savedInstanceState</span><span class="pun">);</span><span class="pln">
    setContentView</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">layout</span><span class="pun">.</span><span class="pln">activity_main</span><span class="pun">);</span><span class="pln">
    </span><span class="typ">Toast</span><span class="pun">.</span><span class="pln">makeText</span><span class="pun">(</span><span class="kwd">this</span><span class="pun">,</span><span class="str">"onCreate Method"</span><span class="pun">,</span><span class="typ">Toast</span><span class="pun">.</span><span class="pln">LENGTH_SHORT</span><span class="pun">).</span><span class="pln">show</span><span class="pun">();</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">

  </span><span class="lit">@Override</span><span class="pln">
  </span><span class="kwd">protected</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> onStart</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    super</span><span class="pun">.</span><span class="pln">onStart</span><span class="pun">();</span><span class="pln">
    </span><span class="typ">Toast</span><span class="pun">.</span><span class="pln">makeText</span><span class="pun">(</span><span class="kwd">this</span><span class="pun">,</span><span class="str">"onStart Method"</span><span class="pun">,</span><span class="typ">Toast</span><span class="pun">.</span><span class="pln">LENGTH_SHORT</span><span class="pun">).</span><span class="pln">show</span><span class="pun">();</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">

  </span><span class="lit">@Override</span><span class="pln">
  </span><span class="kwd">protected</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> onResume</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    super</span><span class="pun">.</span><span class="pln">onResume</span><span class="pun">();</span><span class="pln">
    </span><span class="typ">Toast</span><span class="pun">.</span><span class="pln">makeText</span><span class="pun">(</span><span class="kwd">this</span><span class="pun">,</span><span class="str">"onResume Method"</span><span class="pun">,</span><span class="typ">Toast</span><span class="pun">.</span><span class="pln">LENGTH_SHORT</span><span class="pun">).</span><span class="pln">show</span><span class="pun">();</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">

  </span><span class="lit">@Override</span><span class="pln">
  </span><span class="kwd">protected</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> onStop</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    super</span><span class="pun">.</span><span class="pln">onStop</span><span class="pun">();</span><span class="pln">
    </span><span class="typ">Toast</span><span class="pun">.</span><span class="pln">makeText</span><span class="pun">(</span><span class="kwd">this</span><span class="pun">,</span><span class="str">"onStop Method"</span><span class="pun">,</span><span class="typ">Toast</span><span class="pun">.</span><span class="pln">LENGTH_SHORT</span><span class="pun">).</span><span class="pln">show</span><span class="pun">();</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">

  </span><span class="lit">@Override</span><span class="pln">
  </span><span class="kwd">protected</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> onPause</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    super</span><span class="pun">.</span><span class="pln">onPause</span><span class="pun">();</span><span class="pln">
    </span><span class="typ">Toast</span><span class="pun">.</span><span class="pln">makeText</span><span class="pun">(</span><span class="kwd">this</span><span class="pun">,</span><span class="str">"onPause Method"</span><span class="pun">,</span><span class="typ">Toast</span><span class="pun">.</span><span class="pln">LENGTH_SHORT</span><span class="pun">).</span><span class="pln">show</span><span class="pun">();</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">  

  </span><span class="lit">@Override</span><span class="pln">
  </span><span class="kwd">protected</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> onDestroy</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    super</span><span class="pun">.</span><span class="pln">onDestroy</span><span class="pun">();</span><span class="pln">
    </span><span class="typ">Toast</span><span class="pun">.</span><span class="pln">makeText</span><span class="pun">(</span><span class="kwd">this</span><span class="pun">,</span><span class="str">"onDestroy Method"</span><span class="pun">,</span><span class="typ">Toast</span><span class="pun">.</span><span class="pln">LENGTH_SHORT</span><span class="pun">).</span><span class="pln">show</span><span class="pun">();</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">

  </span><span class="lit">@Override</span><span class="pln">
  </span><span class="kwd">protected</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> onRestart</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    super</span><span class="pun">.</span><span class="pln">onRestart</span><span class="pun">();</span><span class="pln">
    </span><span class="typ">Toast</span><span class="pun">.</span><span class="pln">makeText</span><span class="pun">(</span><span class="kwd">this</span><span class="pun">,</span><span class="str">"onRestart Method"</span><span class="pun">,</span><span class="typ">Toast</span><span class="pun">.</span><span class="pln">LENGTH_SHORT</span><span class="pun">).</span><span class="pln">show</span><span class="pun">();</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p dir="rtl">
	ثم نقوم بتشغيله على المحاكي لنرى التطبيق وهو يعمل.
</p>

<h3 dir="rtl">
	ملاحظات
</h3>

<ol dir="rtl">
<li>
		التابع <span style="font-family:courier new,courier,monospace;">()onCreate</span> هو التابع الوحيد الذي نقوم بداخله بتعريف واجهة المستخدم من داخل المجلد <span style="font-family:courier new,courier,monospace;">layout</span> باستخدام التابع <span style="font-family:courier new,courier,monospace;">()setContentView</span>.
	</li>
	<li>
		لا يشترط عند كتابة التوابع كتابتها بترتيب استدعائها.
	</li>
	<li>
		يجب أن يحتوي النّشاط على التابع <span style="font-family:courier new,courier,monospace;">()onCreate</span> وإلا لن تعمل، وباقي التوابع نستخدم منها فقط ما نحتاجه لأداء مهمة محددة في وقت محدد، فمثلًا إذا كان التطبيق يستخدم الكاميرا وقام المستخدم بغلق التطبيق أو الانتقال إلى تطبيق أخر فيجب عند هذه الحالة قبل اختفاء النّشاط غلق الكاميرا حتى لا يتم إهدار الموارد دون استخدام، فأنسب مكان لذلك هو التابع <span style="font-family:courier new,courier,monospace;">()onStop</span> فهو الذي يُعبر عن هذه الحالة .
	</li>
	<li>
		عند صنع نشاط جديد يجب تعريفه في ملف <span style="font-family:courier new,courier,monospace;">AndroidManifest.xml</span> كما بالشكل، وإذا لم يتم تعريفه فلن تعمل ولن يستطيع نظام التشغيل تشغيلها.
	</li>
</ol>
<pre class="ipsCode prettyprint lang-xml prettyprinted" id="ips_uid_2277_15">
<span class="pln">...
</span><span class="tag">&lt;application</span><span class="pln">
  </span><span class="atn">android:allowBackup</span><span class="pun">=</span><span class="atv">"true"</span><span class="pln">
  </span><span class="atn">android:icon</span><span class="pun">=</span><span class="atv">"@mipmap/ic_launcher"</span><span class="pln">
  </span><span class="atn">android:label</span><span class="pun">=</span><span class="atv">"@string/app_name"</span><span class="pln">
  </span><span class="atn">android:supportsRtl</span><span class="pun">=</span><span class="atv">"true"</span><span class="pln">
  </span><span class="atn">android:theme</span><span class="pun">=</span><span class="atv">"@style/AppTheme"</span><span class="tag">&gt;</span><span class="pln">

  </span><span class="tag">&lt;activity</span><span class="pln"> </span><span class="atn">android:name</span><span class="pun">=</span><span class="atv">".MainActivity"</span><span class="tag">&gt;</span><span class="pln">
    </span><span class="tag">&lt;intent-filter&gt;</span><span class="pln">
      </span><span class="tag">&lt;action</span><span class="pln"> </span><span class="atn">android:name</span><span class="pun">=</span><span class="atv">"android.intent.action.MAIN"</span><span class="pln"> </span><span class="tag">/&gt;</span><span class="pln">
      </span><span class="tag">&lt;category</span><span class="pln"> </span><span class="atn">android:name</span><span class="pun">=</span><span class="atv">"android.intent.category.LAUNCHER"</span><span class="pln"> </span><span class="tag">/&gt;</span><span class="pln">
    </span><span class="tag">&lt;/intent-filter&gt;</span><span class="pln">
  </span><span class="tag">&lt;/activity&gt;</span><span class="pln">
  
</span><span class="tag">&lt;/application&gt;</span><span class="pln">
...</span></pre>

<p dir="rtl">
	يُستخدم ملف <span style="font-family:courier new,courier,monospace;">AndroidManifest.xml</span> لتعريف نظام التشغيل بالمكونات الأساسية التي يتكون منها التطبيق، داخل الوسم <span style="font-family:courier new,courier,monospace;">&lt;application&gt; </span>سنجد وسمًا آخر يدعى<span style="font-family:courier new,courier,monospace;"> &lt;activity&gt;</span> وهو الوسم المستخدم لتعريف نظام التشغيل أن التطبيق يحتوي على <span style="font-family:courier new,courier,monospace;">Activity</span> ولدى هذا الوسم الخاصية <span style="font-family:courier new,courier,monospace;">name</span> لمعرفة ملف جافا الخاص بهذا الـ <span style="font-family:courier new,courier,monospace;">Activity</span>.
</p>

<p dir="rtl">
	وكما ذكرنا أن تطبيقات أندرويد تتكون من <span style="font-family:courier new,courier,monospace;">Activity</span> رئيسية تمثل نقطة البداية للتطبيق لذا لتعريف النظام بأن هذا النّشاط هو الرئيسي نستخدم الوسم <span style="font-family:courier new,courier,monospace;">&lt;intent-filter&gt;</span> وبداخله يتم تعريف <span style="font-family:courier new,courier,monospace;">Action</span> من النوع MAIN وتعريف <span style="font-family:courier new,courier,monospace;">Category</span> من النوع LAUNCHER وإذا لم يتم تعريفهما معًا فلن تظهر الأيقونة الخاصة بالتطبيق مع باقي التطبيقات في قائمة التطبيقات الرئيسية.
</p>

<h2 dir="rtl">
	مثال 2
</h2>

<p dir="rtl">
	سنقوم بصنع تطبيق كما في الصورة التالية يحتوي على نص وزر عند الضغط عليه يتغير النص إلى كلمة أخرى من اختيارنا.
</p>

<p dir="rtl" style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="16770" href="https://academy.hsoub.com/uploads/monthly_2016_05/3.png.09506553fba27a2001faef82acfdf323.png" rel=""><img alt="3.png" class="ipsImage ipsImage_thumbnailed" data-fileid="16770" data-unique="nx9agkgzc" src="https://academy.hsoub.com/uploads/monthly_2016_05/3.thumb.png.688c13fc72b152a4dbcd3db1be9fa669.png"></a>
</p>

<p dir="rtl">
	أولًا نقوم بصنع الواجهة الخاصة بالتطبيق في ملف<span style="font-family:courier new,courier,monospace;"> activity_main.xml:</span>
</p>

<pre class="ipsCode prettyprint lang-xml prettyprinted" id="ips_uid_2277_17">
<span class="pun">&lt;?</span><span class="pln">xml version</span><span class="pun">=”</span><span class="lit">1.0</span><span class="pun">”</span><span class="pln"> encoding</span><span class="pun">=”</span><span class="pln">utf</span><span class="pun">-</span><span class="lit">8</span><span class="pun">”?&gt;</span><span class="pln">
</span><span class="tag">&lt;LinearLayout</span><span class="pln"> </span><span class="atn">xmlns:android</span><span class="pun">=</span><span class="atv">”http://schemas.android.com/apk/res/android”</span><span class="pln">
  </span><span class="atn">android:layout_width</span><span class="pun">=</span><span class="atv">”match_parent”</span><span class="pln">
  </span><span class="atn">android:layout_height</span><span class="pun">=</span><span class="atv">”match_parent”</span><span class="pln">
  </span><span class="atn">android:orientation</span><span class="pun">=</span><span class="atv">”vertical”</span><span class="tag">&gt;</span><span class="pln">

  </span><span class="tag">&lt;TextView</span><span class="pln">
    </span><span class="atn">android:layout_width</span><span class="pun">=</span><span class="atv">”wrap_content”</span><span class="pln">
    </span><span class="atn">android:layout_height</span><span class="pun">=</span><span class="atv">”wrap_content”</span><span class="pln">
    </span><span class="atn">android:text</span><span class="pun">=</span><span class="atv">”Hello</span><span class="pln"> </span><span class="atn">World</span><span class="pln">!”
    </span><span class="atn">android:id</span><span class="pun">=</span><span class="atv">”@+id/txt”</span><span class="tag">/&gt;</span><span class="pln">

  </span><span class="tag">&lt;Button</span><span class="pln">
    </span><span class="atn">android:layout_width</span><span class="pun">=</span><span class="atv">”wrap_content”</span><span class="pln">
    </span><span class="atn">android:layout_height</span><span class="pun">=</span><span class="atv">”wrap_content”</span><span class="pln">
    </span><span class="atn">android:text</span><span class="pun">=</span><span class="atv">”Change</span><span class="pln"> </span><span class="atn">Text</span><span class="pln">”
    </span><span class="atn">android:id</span><span class="pun">=</span><span class="atv">”@+id/chngbtn”</span><span class="tag">/&gt;</span><span class="pln">

</span><span class="tag">&lt;/LinearLayout&gt;</span></pre>

<p dir="rtl">
	لا يوجد اختلاف بينه وبين ما قمنا بعمله سابقًا، واستخدمنا خاصية <span style="font-family:courier new,courier,monospace;">id</span> للتحكم في هذا العنصر من شيفرة الجافا وأعطينا لكل عنصر Id مميز.
</p>

<p dir="rtl">
	ثانيًا الاستجابة للزر برمجيًا وتغيير النص، ولكن يجب أولًا أن نصنع متغير ونربطه بالزر المصنوع في xml، ونقوم بذلك كما في الشكل التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2277_19">
<span class="typ">Button</span><span class="pln"> btn</span><span class="pun">;</span><span class="pln">
</span><span class="pun">...</span><span class="pln">
btn </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="typ">Button</span><span class="pun">)</span><span class="pln"> findViewById</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="typ">Id</span><span class="pun">.</span><span class="pln">chngbtn</span><span class="pun">);</span></pre>

<p dir="rtl">
	قمنا بتعريف متغير من الصنف <span style="font-family:courier new,courier,monospace;">Button</span> وهو صنف موجود في المكتبات الخاصة بأندرويد، وقمنا بربطه باستخدام التابع<span style="font-family:courier new,courier,monospace;"> ()findViewById</span> وتمرير له <span style="font-family:courier new,courier,monospace;">R.Id.chngbtn </span>وتعني من المجلد <span style="font-family:courier new,courier,monospace;">res</span> ستجد عنصر له Id قيمته <span style="font-family:courier new,courier,monospace;">chngbtn</span>.
</p>

<p dir="rtl">
	ويقوم هذا التابع بالبحث عن العناصر بمعرفة Id الخاص بها وإرجاعها، وقمنا باستخدام خاصية التحويل Casting وذلك لأن التابع يرجع عنصرًا من النوع <span style="font-family:courier new,courier,monospace;">View</span> وهو الأب للعنصر <span style="font-family:courier new,courier,monospace;">Button</span> لذا نقوم بتحويله إلى الصنف المحدد عن طريق (<span style="font-family:courier new,courier,monospace;">Button</span>). وبالمثل نقوم بربط <span style="font-family:courier new,courier,monospace;">TextView</span> في شيفرة الجافا.
</p>

<p dir="rtl">
	والآن لجعل الزر يفعل شيئًا عند الضغط عليه نقوم باستخدام Listeners والتي تقوم بدورها بانتظار أن يضغط المستخدم على الزر حتى تقوم بوظيفة ما.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2277_21">
<span class="pln">btn</span><span class="pun">.</span><span class="pln">setOnClickListener</span><span class="pun">(</span><span class="kwd">new</span><span class="pln"> </span><span class="typ">View</span><span class="pun">.</span><span class="typ">OnClickListener</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="lit">@Override</span><span class="pln">
  </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> onClick</span><span class="pun">(</span><span class="typ">View</span><span class="pln"> v</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="com">//Do Something here</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">});</span></pre>

<p dir="rtl">
	باستخدام المتغير <span style="font-family:courier new,courier,monospace;">btn</span> نقوم باستدعاء التابع <span style="font-family:courier new,courier,monospace;">setOnClickListener</span> وتمرير له<span style="font-family:courier new,courier,monospace;"> ()new View.OnClickListener </span>وهو ما يدعى بالصنف المجهول Anonymous class، وبداخله نجد الدالة <span style="font-family:courier new,courier,monospace;">onClick</span> والتي تُستدعى عند الضغط على الزر ويتم تنفيذ الأوامر التي بداخلها.
</p>

<p dir="rtl">
	سنقوم الآن بتغيير الكلمة عند الضغط على الزر من !Hello World إلى Hello Android Developer فداخل <span style="font-family:courier new,courier,monospace;">onClick</span> نكتب:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2277_23">
<span class="typ">String</span><span class="pln"> str </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Hello Android Developer"</span><span class="pun">;</span><span class="pln">
tv</span><span class="pun">.</span><span class="pln">setText</span><span class="pun">(</span><span class="pln">str</span><span class="pun">);</span></pre>

<p dir="rtl">
	قمنا بتعريف متغير من النوع <span style="font-family:courier new,courier,monospace;">String</span> وتخزين النص بداخله، وباستخدام المتغير <span style="font-family:courier new,courier,monospace;">tv</span> نستدعي التابع <span style="font-family:courier new,courier,monospace;">setText</span> وهو المسؤول عن كتابة نص في <span style="font-family:courier new,courier,monospace;">TextView</span> برمجيًا ومساوٍ للخاصية <span style="font-family:courier new,courier,monospace;">android:text</span> في xml ونمرر له النص المراد كتابته.
</p>

<p dir="rtl">
	لتُصبح الشيفرة النهائية هي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2277_25">
<span class="pln">package apps</span><span class="pun">.</span><span class="pln">noby</span><span class="pun">.</span><span class="pln">controlapps</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">app</span><span class="pun">.</span><span class="typ">Activity</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">os</span><span class="pun">.</span><span class="typ">Bundle</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">view</span><span class="pun">.</span><span class="typ">View</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">widget</span><span class="pun">.</span><span class="typ">Button</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">widget</span><span class="pun">.</span><span class="typ">TextView</span><span class="pun">;</span><span class="pln">


</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">MainActivity</span><span class="pln"> extends </span><span class="typ">Activity</span><span class="pln"> </span><span class="pun">{</span><span class="pln">

  </span><span class="typ">Button</span><span class="pln"> btn</span><span class="pun">;</span><span class="pln">
  </span><span class="typ">TextView</span><span class="pln"> tv</span><span class="pun">;</span><span class="pln">

  </span><span class="lit">@Override</span><span class="pln">
  </span><span class="kwd">protected</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> onCreate</span><span class="pun">(</span><span class="typ">Bundle</span><span class="pln"> savedInstanceState</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    super</span><span class="pun">.</span><span class="pln">onCreate</span><span class="pun">(</span><span class="pln">savedInstanceState</span><span class="pun">);</span><span class="pln">
    setContentView</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">layout</span><span class="pun">.</span><span class="pln">activity_main</span><span class="pun">);</span><span class="pln">

    btn </span><span class="pun">=(</span><span class="typ">Button</span><span class="pun">)</span><span class="pln"> findViewById</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">id</span><span class="pun">.</span><span class="pln">chngbtn</span><span class="pun">);</span><span class="pln">
    tv </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="typ">TextView</span><span class="pun">)</span><span class="pln"> findViewById</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">id</span><span class="pun">.</span><span class="pln">txt</span><span class="pun">);</span><span class="pln">

    btn</span><span class="pun">.</span><span class="pln">setOnClickListener</span><span class="pun">(</span><span class="kwd">new</span><span class="pln"> </span><span class="typ">View</span><span class="pun">.</span><span class="typ">OnClickListener</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
      </span><span class="lit">@Override</span><span class="pln">
      </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> onClick</span><span class="pun">(</span><span class="typ">View</span><span class="pln"> v</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        </span><span class="typ">String</span><span class="pln"> str </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Hello Android Developer"</span><span class="pun">;</span><span class="pln">
        tv</span><span class="pun">.</span><span class="pln">setText</span><span class="pun">(</span><span class="pln">str</span><span class="pun">);</span><span class="pln">
      </span><span class="pun">}</span><span class="pln">
    </span><span class="pun">});</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p dir="rtl">
	عند تشغيل التطبيق على المحاكي والضغط على الزر نجد أن التطبيق يعمل بالشكل المطلوب.
</p>

<p dir="rtl" style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="16771" href="https://academy.hsoub.com/uploads/monthly_2016_05/4.png.8007a48f7ef21ad72e2545a32dbd01b1.png" rel=""><img alt="4.png" class="ipsImage ipsImage_thumbnailed" data-fileid="16771" data-unique="xxs2onp52" src="https://academy.hsoub.com/uploads/monthly_2016_05/4.thumb.png.dd3d948db74dff1a5c89075bda5ac65d.png"></a>
</p>

<h3 dir="rtl">
	ملاحظات
</h3>

<ol dir="rtl">
<li>
		يتم تعريف نوع المتغيرات خارج التابع <span style="font-family:courier new,courier,monospace;">onCreate</span>.
	</li>
	<li>
		تستخدم import عندما يكون هناك صنف متواجد في إحدى المكتبات ونريد تضمينه داخل تطبيقنا فنقوم بكتابة بجانب الأمر <span style="font-family:courier new,courier,monospace;">import</span> ومكان تواجد هذا الصنف.
	</li>
	<li>
		يجب ذكر اسم الحزمة في بداية الشيفرة الخاصة بالنّشاط.
	</li>
	<li>
		يمكن تمرير النص للتابع <span style="font-family:courier new,courier,monospace;">setText</span> في سطر واحد مثل:
	</li>
</ol>
<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2277_27">
<span class="pln">tv</span><span class="pun">.</span><span class="pln">setText</span><span class="pun">(</span><span class="str">"Hello Android Developer"</span><span class="pun">);</span></pre>

<p dir="rtl" style="margin-right: 40px;">
	بدلًا من تخزين قيمة النص في متغير ثم تمرير هذا المتغير.
</p>

<h2 dir="rtl">
	مثال 3
</h2>

<p dir="rtl">
	سنضيف في هذا المثال <span style="font-family:courier new,courier,monospace;">EditText</span> ليستطيع المستخدم كتابة نص ثم سنقوم بعرضه له بدلًا من عرض نص محدد مسبقًا.
</p>

<p dir="rtl" style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="16772" href="https://academy.hsoub.com/uploads/monthly_2016_05/5.png.a5c37f3d9835ed4ea57e7641876368e4.png" rel=""><img alt="5.png" class="ipsImage ipsImage_thumbnailed" data-fileid="16772" data-unique="glxj12d6m" src="https://academy.hsoub.com/uploads/monthly_2016_05/5.thumb.png.d471ada4476339e976f5131685c7e90f.png"></a>
</p>

<p dir="rtl">
	أولًا نبدأ بصنع الواجهة ولن تختلف عن واجهة المثال السابق إلا بزيادة عنصر من النوع <span style="font-family:courier new,courier,monospace;">EditText:</span>
</p>

<pre class="ipsCode prettyprint lang-xml prettyprinted" id="ips_uid_2277_30">
<span class="pun">&lt;?</span><span class="pln">xml version</span><span class="pun">=</span><span class="str">"1.0"</span><span class="pln"> encoding</span><span class="pun">=</span><span class="str">"utf-8"</span><span class="pun">?&gt;</span><span class="pln">
</span><span class="tag">&lt;LinearLayout</span><span class="pln"> </span><span class="atn">xmlns:android</span><span class="pun">=</span><span class="atv">"http://schemas.android.com/apk/res/android"</span><span class="pln">
  </span><span class="atn">android:layout_width</span><span class="pun">=</span><span class="atv">"match_parent"</span><span class="pln">
  </span><span class="atn">android:layout_height</span><span class="pun">=</span><span class="atv">"match_parent"</span><span class="pln">
  </span><span class="atn">android:orientation</span><span class="pun">=</span><span class="atv">"vertical"</span><span class="tag">&gt;</span><span class="pln">

  </span><span class="tag">&lt;TextView</span><span class="pln">
    </span><span class="atn">android:layout_width</span><span class="pun">=</span><span class="atv">"wrap_content"</span><span class="pln">
    </span><span class="atn">android:layout_height</span><span class="pun">=</span><span class="atv">"wrap_content"</span><span class="pln">
    </span><span class="atn">android:text</span><span class="pun">=</span><span class="atv">"Hello World!"</span><span class="pln">
    </span><span class="atn">android:id</span><span class="pun">=</span><span class="atv">"@+id/txt"</span><span class="tag">/&gt;</span><span class="pln">

  </span><span class="tag">&lt;EditText</span><span class="pln">
    </span><span class="atn">android:layout_width</span><span class="pun">=</span><span class="atv">"match_parent"</span><span class="pln">
    </span><span class="atn">android:layout_height</span><span class="pun">=</span><span class="atv">"wrap_content"</span><span class="pln">
    </span><span class="atn">android:hint</span><span class="pun">=</span><span class="atv">"Write your Name here"</span><span class="pln">
    </span><span class="atn">android:id</span><span class="pun">=</span><span class="atv">"@+id/edt"</span><span class="tag">/&gt;</span><span class="pln">

  </span><span class="tag">&lt;Button</span><span class="pln">
    </span><span class="atn">android:layout_width</span><span class="pun">=</span><span class="atv">"wrap_content"</span><span class="pln">
    </span><span class="atn">android:layout_height</span><span class="pun">=</span><span class="atv">"wrap_content"</span><span class="pln">
    </span><span class="atn">android:text</span><span class="pun">=</span><span class="atv">"Change Text"</span><span class="pln">
    </span><span class="atn">android:id</span><span class="pun">=</span><span class="atv">"@+id/chngbtn"</span><span class="tag">/&gt;</span><span class="pln">

</span><span class="tag">&lt;/LinearLayout&gt;</span></pre>

<p dir="rtl">
	الآن للتحكم فيما يكتبه المستخدم بداخل <span style="font-family:courier new,courier,monospace;">EditText</span> برمجيًا نعرف متغيرًا جديدًا داخل ملف <span style="font-family:courier new,courier,monospace;">MainActivity.java</span> ونربطه بالعنصر الذي قمنا بتعريف في الواجهة. ولتحديد ما سيتم كتابته عند الضغط على الزر:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2277_32">
<span class="typ">String</span><span class="pln"> str </span><span class="pun">=</span><span class="pln"> et</span><span class="pun">.</span><span class="pln">getText</span><span class="pun">().</span><span class="pln">toString</span><span class="pun">();</span><span class="pln">
tv</span><span class="pun">.</span><span class="pln">setText</span><span class="pun">(</span><span class="str">"Hello "</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> str </span><span class="pun">+</span><span class="pln"> </span><span class="str">"!"</span><span class="pun">);</span></pre>

<p dir="rtl">
	باستخدام المتغير <span style="font-family:courier new,courier,monospace;">get</span> نستدعي التابع <span style="font-family:courier new,courier,monospace;">getText</span> وهو المسؤول عن إعادة البيانات التي قام المستخدم بكتابتها في العنصر <span style="font-family:courier new,courier,monospace;">EditText</span> ثم نستدعي التابع <span style="font-family:courier new,courier,monospace;">toString</span> لتحويلها إلى نص و تخزينه بداخل المتغير <span style="font-family:courier new,courier,monospace;">str</span> ، ثم نمرر هذا المتغير إلى التابع <span style="font-family:courier new,courier,monospace;">setText</span> كما سبق، تستخدم "+" للربط بين نصين ففي هذا المثال نريد الربط بين كلمة Hello والقيمة التي أدخلها المستخدم.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2277_34">
<span class="pln">package apps</span><span class="pun">.</span><span class="pln">noby</span><span class="pun">.</span><span class="pln">controlapps</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">app</span><span class="pun">.</span><span class="typ">Activity</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">os</span><span class="pun">.</span><span class="typ">Bundle</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">view</span><span class="pun">.</span><span class="typ">View</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">widget</span><span class="pun">.</span><span class="typ">Button</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">widget</span><span class="pun">.</span><span class="typ">EditText</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">widget</span><span class="pun">.</span><span class="typ">TextView</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">MainActivity</span><span class="pln"> extends </span><span class="typ">Activity</span><span class="pln"> </span><span class="pun">{</span><span class="pln">

  </span><span class="typ">Button</span><span class="pln"> btn</span><span class="pun">;</span><span class="pln">
  </span><span class="typ">TextView</span><span class="pln"> tv</span><span class="pun">;</span><span class="pln">
  </span><span class="typ">EditText</span><span class="pln"> et</span><span class="pun">;</span><span class="pln">
  
  </span><span class="lit">@Override</span><span class="pln">
  </span><span class="kwd">protected</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> onCreate</span><span class="pun">(</span><span class="typ">Bundle</span><span class="pln"> savedInstanceState</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    super</span><span class="pun">.</span><span class="pln">onCreate</span><span class="pun">(</span><span class="pln">savedInstanceState</span><span class="pun">);</span><span class="pln">
    setContentView</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">layout</span><span class="pun">.</span><span class="pln">activity_main</span><span class="pun">);</span><span class="pln">

    btn </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="typ">Button</span><span class="pun">)</span><span class="pln"> findViewById</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">id</span><span class="pun">.</span><span class="pln">chngbtn</span><span class="pun">);</span><span class="pln">
    tv </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="typ">TextView</span><span class="pun">)</span><span class="pln"> findViewById</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">id</span><span class="pun">.</span><span class="pln">txt</span><span class="pun">);</span><span class="pln">
    et </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="typ">EditText</span><span class="pun">)</span><span class="pln"> findViewById</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">id</span><span class="pun">.</span><span class="pln">edt</span><span class="pun">);</span><span class="pln">

    btn</span><span class="pun">.</span><span class="pln">setOnClickListener</span><span class="pun">(</span><span class="kwd">new</span><span class="pln"> </span><span class="typ">View</span><span class="pun">.</span><span class="typ">OnClickListener</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
      </span><span class="lit">@Override</span><span class="pln">
      </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> onClick</span><span class="pun">(</span><span class="typ">View</span><span class="pln"> v</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        </span><span class="typ">String</span><span class="pln"> str </span><span class="pun">=</span><span class="pln"> et</span><span class="pun">.</span><span class="pln">getText</span><span class="pun">().</span><span class="pln">toString</span><span class="pun">();</span><span class="pln">
        tv</span><span class="pun">.</span><span class="pln">setText</span><span class="pun">(</span><span class="str">"Hello "</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> str </span><span class="pun">+</span><span class="pln"> </span><span class="str">"!"</span><span class="pun">);</span><span class="pln">
      </span><span class="pun">}</span><span class="pln">
    </span><span class="pun">});</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p dir="rtl">
	ثم نقوم بتجربة التطبيق على المحاكي.
</p>

<p dir="rtl" style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="16773" href="https://academy.hsoub.com/uploads/monthly_2016_05/6.png.5672227635318664409794f7cbdcf3dd.png" rel=""><img alt="6.png" class="ipsImage ipsImage_thumbnailed" data-fileid="16773" data-unique="e0fyzaymz" src="https://academy.hsoub.com/uploads/monthly_2016_05/6.thumb.png.7bac4c4a385463ddb1bbb7f8af244e47.png"></a>
</p>

<h2 dir="rtl">
	مثال 4
</h2>

<p dir="rtl">
	سنقوم بصنع تطبيق يظهر صورة عند الضغط على الزر ثم يخفيها عند الضغط عليه مرة أخرى.
</p>

<p dir="rtl" style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="16774" href="https://academy.hsoub.com/uploads/monthly_2016_05/7.png.54cbcff421567051d6abbf2fb935bb04.png" rel=""><img alt="7.png" class="ipsImage ipsImage_thumbnailed" data-fileid="16774" data-unique="mfvvnqqrw" src="https://academy.hsoub.com/uploads/monthly_2016_05/7.thumb.png.d2091ec4e64dfe2cbe4d6c61ccc9296b.png"></a>
</p>

<p dir="rtl">
	أولًا نبدأ بصنع واجهة المستخدم:
</p>

<pre class="ipsCode prettyprint lang-xml prettyprinted" id="ips_uid_2277_46">
<span class="pun">&lt;?</span><span class="pln">xml version</span><span class="pun">=</span><span class="str">"1.0"</span><span class="pln"> encoding</span><span class="pun">=</span><span class="str">"utf-8"</span><span class="pun">?&gt;</span><span class="pln">
</span><span class="com">&lt;!-- activit_main.xml --&gt;</span><span class="pln">
</span><span class="tag">&lt;LinearLayout</span><span class="pln"> </span><span class="atn">xmlns:android</span><span class="pun">=</span><span class="atv">"http://schemas.android.com/apk/res/android"</span><span class="pln">
  </span><span class="atn">android:layout_width</span><span class="pun">=</span><span class="atv">"match_parent"</span><span class="pln">
  </span><span class="atn">android:layout_height</span><span class="pun">=</span><span class="atv">"match_parent"</span><span class="pln">
  </span><span class="atn">android:orientation</span><span class="pun">=</span><span class="atv">"vertical"</span><span class="pln">
  </span><span class="atn">android:gravity</span><span class="pun">=</span><span class="atv">"center"</span><span class="tag">&gt;</span><span class="pln">

  </span><span class="tag">&lt;Button</span><span class="pln">
    </span><span class="atn">android:layout_width</span><span class="pun">=</span><span class="atv">"wrap_content"</span><span class="pln">
    </span><span class="atn">android:layout_height</span><span class="pun">=</span><span class="atv">"wrap_content"</span><span class="pln">
    </span><span class="atn">android:text</span><span class="pun">=</span><span class="atv">"Show"</span><span class="pln">
    </span><span class="atn">android:onClick</span><span class="pun">=</span><span class="atv">"showImage"</span><span class="pln">
    </span><span class="atn">android:id</span><span class="pun">=</span><span class="atv">"@+id/show"</span><span class="tag">/&gt;</span><span class="pln">

  </span><span class="tag">&lt;ImageView</span><span class="pln">
    </span><span class="atn">android:layout_width</span><span class="pun">=</span><span class="atv">"wrap_content"</span><span class="pln">
    </span><span class="atn">android:layout_height</span><span class="pun">=</span><span class="atv">"wrap_content"</span><span class="pln">
    </span><span class="atn">android:src</span><span class="pun">=</span><span class="atv">"@drawable/and_img"</span><span class="pln">
    </span><span class="atn">android:visibility</span><span class="pun">=</span><span class="atv">"invisible"</span><span class="pln">
    </span><span class="atn">android:id</span><span class="pun">=</span><span class="atv">"@+id/ic"</span><span class="tag">/&gt;</span><span class="pln">

</span><span class="tag">&lt;/LinearLayout&gt;</span></pre>

<p dir="rtl">
	قمنا بتغيير أماكن ظهور العناصر إلى المنتصف عن طريق الخاصية:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2277_44">
<span class="pln">android</span><span class="pun">:</span><span class="pln">gravity</span><span class="pun">=</span><span class="str">"center"</span></pre>

<p dir="rtl">
	وجعلنا الصورة عند بداية استخدام التطبيق غير ظاهرة باستخدام الخاصية:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2277_42">
<span class="pln">android</span><span class="pun">:</span><span class="pln">visibility</span><span class="pun">=</span><span class="str">"invisible"</span></pre>

<p dir="rtl">
	واستخدمنا خاصية جديدة للزر تدعى:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2277_40">
<span class="pln">android</span><span class="pun">:</span><span class="pln">onClick</span><span class="pun">=</span><span class="str">"showImage"</span></pre>

<p dir="rtl">
	وتستخدم كطريقة أخرى لصنع Listener ينتظر ضغط المستخدم على الزر ولكن عن طريق xml.
</p>

<p dir="rtl">
	ثانيًا للتحكم بهذه الواجهة نقوم في ملف <span style="font-family:courier new,courier,monospace;">MainActivity.java</span> بربط <span style="font-family:courier new,courier,monospace;">ImageView</span> بمتغير كما سبق.
</p>

<p dir="rtl">
	ولظهور واختفاء الصورة عند الضغط على الزر:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2277_38">
<span class="kwd">public</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> showImage</span><span class="pun">(</span><span class="typ">View</span><span class="pln"> view</span><span class="pun">){</span><span class="pln">
  </span><span class="kwd">if</span><span class="pun">(</span><span class="pln">img</span><span class="pun">.</span><span class="pln">getVisibility</span><span class="pun">()</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> </span><span class="typ">View</span><span class="pun">.</span><span class="pln">VISIBLE</span><span class="pun">){</span><span class="pln">
    img</span><span class="pun">.</span><span class="pln">setVisibility</span><span class="pun">(</span><span class="typ">View</span><span class="pun">.</span><span class="pln">INVISIBLE</span><span class="pun">);</span><span class="pln">
    showBtn</span><span class="pun">.</span><span class="pln">setText</span><span class="pun">(</span><span class="str">"Show"</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
  </span><span class="kwd">else</span><span class="pun">{</span><span class="pln">
    img</span><span class="pun">.</span><span class="pln">setVisibility</span><span class="pun">(</span><span class="typ">View</span><span class="pun">.</span><span class="pln">VISIBLE</span><span class="pun">);</span><span class="pln">
    showBtn</span><span class="pun">.</span><span class="pln">setText</span><span class="pun">(</span><span class="str">"Hide"</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p dir="rtl">
	نستخدم هذه الدالة والتي يجب أن تكون كالتالي:
</p>

<ol dir="rtl">
<li>
		الوصول لها <span style="font-family:courier new,courier,monospace;">Public</span> ولا ترجع أية قيمة (يعني تُرجع <span style="font-family:courier new,courier,monospace;">void</span>)
	</li>
	<li>
		الاسم الخاص بها نفس الاسم الذي كتبناه سابقًا للخاصية <span style="font-family:courier new,courier,monospace;">onClick</span>.
	</li>
	<li>
		تمرير للدالة عنصر من النوع <span style="font-family:courier new,courier,monospace;">View</span>.
	</li>
</ol>
<p dir="rtl">
	ثم نقوم بكتابة ما سيحدث عند الضغط على الزر كما كنا نفعل سابقًا.
</p>

<p dir="rtl">
	ونقوم داخل الدالة بالتحقق إذا ما كان العنصر ظاهرًا باستدعاء التابع <span style="font-family:courier new,courier,monospace;">()getVisibility</span> باستخدام المتغير <span style="font-family:courier new,courier,monospace;">img</span>، فإن كان ظاهرًا نقوم بإخفائه باستدعاء التابع <span style="font-family:courier new,courier,monospace;">()setVisibility</span> وتمرير له الثابت <span style="font-family:courier new,courier,monospace;">View.INVISIBLE</span>، ثم نغير النص المكتوب على الزر.
</p>

<p dir="rtl">
	أما إذا كانت الصورة غير ظاهرة نقوم بتمرير الثابت <span style="font-family:courier new,courier,monospace;">View.VISIBLE</span> للتابع <span style="font-family:courier new,courier,monospace;">()setVisibility</span>، ثم تغيير النص المكتوب على الزر أيضًا.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2277_36">
<span class="pln">package apps</span><span class="pun">.</span><span class="pln">noby</span><span class="pun">.</span><span class="pln">controlapps</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">app</span><span class="pun">.</span><span class="typ">Activity</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">os</span><span class="pun">.</span><span class="typ">Bundle</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">view</span><span class="pun">.</span><span class="typ">View</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">widget</span><span class="pun">.</span><span class="typ">Button</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">widget</span><span class="pun">.</span><span class="typ">ImageView</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">MainActivity</span><span class="pln"> extends </span><span class="typ">Activity</span><span class="pln"> </span><span class="pun">{</span><span class="pln">

  </span><span class="typ">Button</span><span class="pln"> showBtn</span><span class="pun">;</span><span class="pln">
  </span><span class="typ">ImageView</span><span class="pln"> img</span><span class="pun">;</span><span class="pln">
  
  </span><span class="lit">@Override</span><span class="pln">
  </span><span class="kwd">protected</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> onCreate</span><span class="pun">(</span><span class="typ">Bundle</span><span class="pln"> savedInstanceState</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    super</span><span class="pun">.</span><span class="pln">onCreate</span><span class="pun">(</span><span class="pln">savedInstanceState</span><span class="pun">);</span><span class="pln">
    setContentView</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">layout</span><span class="pun">.</span><span class="pln">activity_main</span><span class="pun">);</span><span class="pln">

    showBtn </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="typ">Button</span><span class="pun">)</span><span class="pln"> findViewById</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">id</span><span class="pun">.</span><span class="pln">show</span><span class="pun">);</span><span class="pln">
    img </span><span class="pun">=(</span><span class="typ">ImageView</span><span class="pun">)</span><span class="pln"> findViewById</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">id</span><span class="pun">.</span><span class="pln">ic</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">

  </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> showImage</span><span class="pun">(</span><span class="typ">View</span><span class="pln"> view</span><span class="pun">){</span><span class="pln">
    </span><span class="kwd">if</span><span class="pun">(</span><span class="pln">img</span><span class="pun">.</span><span class="pln">getVisibility</span><span class="pun">()</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> </span><span class="typ">View</span><span class="pun">.</span><span class="pln">VISIBLE</span><span class="pun">){</span><span class="pln">
      img</span><span class="pun">.</span><span class="pln">setVisibility</span><span class="pun">(</span><span class="typ">View</span><span class="pun">.</span><span class="pln">INVISIBLE</span><span class="pun">);</span><span class="pln">
      showBtn</span><span class="pun">.</span><span class="pln">setText</span><span class="pun">(</span><span class="str">"Show"</span><span class="pun">);</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
    </span><span class="kwd">else</span><span class="pun">{</span><span class="pln">
      img</span><span class="pun">.</span><span class="pln">setVisibility</span><span class="pun">(</span><span class="typ">View</span><span class="pun">.</span><span class="pln">VISIBLE</span><span class="pun">);</span><span class="pln">
      showBtn</span><span class="pun">.</span><span class="pln">setText</span><span class="pun">(</span><span class="str">"Hide"</span><span class="pun">);</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p dir="rtl">
	ثم نقوم بتجربة التطبيق على المحاكي.
</p>

<p dir="rtl" style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="16775" href="https://academy.hsoub.com/uploads/monthly_2016_05/8.png.16cbc9eefb82a936d9d5d48ade0a8316.png" rel=""><img alt="8.png" class="ipsImage ipsImage_thumbnailed" data-fileid="16775" data-unique="euf8rltsg" src="https://academy.hsoub.com/uploads/monthly_2016_05/8.thumb.png.4bad393d59d7abab462adb14fd96e44a.png"></a>
</p>

<p dir="rtl">
	بهذا نكون قد وصلنا إلى نهاية هذا الدرس، في انتظار تجربتكم وآرائكم.
</p>
]]></description><guid isPermaLink="false">339</guid><pubDate>Thu, 26 May 2016 18:13:00 +0000</pubDate></item><item><title>&#x627;&#x644;&#x645;&#x635;&#x641;&#x648;&#x641;&#x627;&#x62A; &#x648;&#x627;&#x644;&#x62F;&#x648;&#x627;&#x644; &#x641;&#x64A; &#x62C;&#x627;&#x641;&#x627;&#x60C; &#x637;&#x631;&#x642; &#x627;&#x644;&#x62A;&#x62D;&#x648;&#x64A;&#x644; &#x628;&#x64A;&#x646; &#x623;&#x646;&#x648;&#x627;&#x639; &#x627;&#x644;&#x628;&#x64A;&#x627;&#x646;&#x627;&#x62A;&#x60C; &#x648;&#x644;&#x645;&#x62D;&#x629; &#x639;&#x646; &#x627;&#x644;&#x623;&#x635;&#x646;&#x627;&#x641; &#x648;&#x627;&#x644;&#x648;&#x631;&#x627;&#x62B;&#x629;</title><link>https://academy.hsoub.com/programming/android/%D8%A7%D9%84%D9%85%D8%B5%D9%81%D9%88%D9%81%D8%A7%D8%AA-%D9%88%D8%A7%D9%84%D8%AF%D9%88%D8%A7%D9%84-%D9%81%D9%8A-%D8%AC%D8%A7%D9%81%D8%A7%D8%8C-%D8%B7%D8%B1%D9%82-%D8%A7%D9%84%D8%AA%D8%AD%D9%88%D9%8A%D9%84-%D8%A8%D9%8A%D9%86-%D8%A3%D9%86%D9%88%D8%A7%D8%B9-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA%D8%8C-%D9%88%D9%84%D9%85%D8%AD%D8%A9-%D8%B9%D9%86-%D8%A7%D9%84%D8%A3%D8%B5%D9%86%D8%A7%D9%81-%D9%88%D8%A7%D9%84%D9%88%D8%B1%D8%A7%D8%AB%D8%A9-r334/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2016_05/android-java.png.4a6c030b1755e159e66118d0fdd08567.png" /></p>

<p dir="rtl">
	نواصل في هذا المقال استعراض <a href="https://academy.hsoub.com/programming/android/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D9%84%D8%BA%D8%A9-%D8%AC%D8%A7%D9%81%D8%A7-%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D8%AA%D8%B7%D8%A8%D9%8A%D9%82%D8%A7%D8%AA-%D8%A3%D9%86%D8%AF%D8%B1%D9%88%D9%8A%D8%AF-%E2%80%93-%D8%A7%D9%84%D8%AC%D8%B2%D8%A1-%D8%A7%D9%84%D8%A3%D9%88%D9%84-r310/" rel="">أساسيات لغة جافا التي يحتاج كل مُطوّر أندرويد الإلمام بها</a>. إذا لم تطّلع على الجزء الأول فأنصحك بقراءته أوّلا قبل مواصلة قراءة هذا المقال.
</p>

<p dir="rtl" style="text-align: center;">
	<img alt="android-java.png" class="ipsImage ipsImage_thumbnailed" data-fileid="16636" data-unique="fsmg8uy7z" src="https://academy.hsoub.com/uploads/monthly_2016_05/android-java.png.a3ad3d793e9d69587f590097765c9f09.png"></p>

<h2 dir="rtl">
	المصفوفات
</h2>

<p dir="rtl">
	في بعض الأحيان نحتاج إلى تخزين عدة بيانات من نفس النوع والتعامل معها، في هذه الحالة لا يتم استخدام عدة متغيرات للتعامل معها ولكن يتم استخدام المصفوفات Arrays.
</p>

<p dir="rtl">
	فالمصفوفات مجموعة متغيرات من نفس النوع وتربطها علاقة ببعضها فيتم تخزينها داخل متغير واحد من النوع مصفوفة، ويتم تعريف المصفوفة بالشكل التالي
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_41_7">
<span class="pln">DataType [] arrayName = new DataType [arraySize];</span></pre>

<p dir="rtl">
	فمثلا لتعريف مصفوفة من النوع <span style="font-family:courier new,courier,monospace;">int</span> وتحتوي على 6 عناصر:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_41_9">
<span class="kwd">int</span><span class="pln"> </span><span class="pun">[]</span><span class="pln"> numArr </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> </span><span class="pun">[</span><span class="lit">6</span><span class="pun">];</span></pre>

<p dir="rtl">
	هكذا تم حجز 6 أماكن في الذاكرة للمصفوفة <span style="font-family:courier new,courier,monospace;">numArr</span>، وللوصول لهذه الأماكن للتخزين فيها أو التعامل مع قيمها.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_41_11">
<span class="pln">numArr</span><span class="pun">[</span><span class="lit">0</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">10</span><span class="pun">;</span><span class="pln">
numArr</span><span class="pun">[</span><span class="lit">1</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">5</span><span class="pun">;</span><span class="pln">
</span><span class="pun">...</span><span class="pln">
numArr</span><span class="pun">[</span><span class="lit">5</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">3</span><span class="pun">;</span></pre>

<p dir="rtl">
	والعنصر الأول يبدأ من صفر وتنتهي العناصر عند الرقم 5 لتصبح ست عناصر، ويتم التعامل بعد ذلك مع عناصر المصفوفة مثل المتغيرات فمثلًا لجمع رقم ما على إحدى قيمها
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_41_13">
<span class="pln">numArr</span><span class="pun">[</span><span class="lit">3</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> numArr</span><span class="pun">[</span><span class="lit">0</span><span class="pun">]</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="lit">4</span><span class="pun">;</span></pre>

<p dir="rtl">
	ويتم احتساب خطأ إذا تم الوصول إلى عنصر خارج حدود المصفوفة التي تم تعريفها مثل:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_41_15">
<span class="pln">numArr</span><span class="pun">[</span><span class="lit">7</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">2</span><span class="pln"> </span><span class="pun">;</span><span class="pln"> </span><span class="com">//Error</span></pre>

<p dir="rtl">
	وتصنف النوع السابق من المصفوفات على أنه من المصفوفات الساكنة التي عند تحديد عدد عناصرها عند تعريفها فلا يمكن زيادة هذا العدد أو إزالة عناصر من المصفوفة.
</p>

<h2 dir="rtl">
	الدوال
</h2>

<p dir="rtl">
	الدالة هي مجموعة من الأوامر التي تنفذ فقط عندما نقوم باستدعائها وتستخدم للقيام بالأوامر التي يتكرر استخدامها في مواضع مختلفة في البرنامج بسهولة دون إعادة كتابة الأسطر البرمجية مجددًا مما يجعل البرنامج أكثر وضوحًا.
</p>

<p dir="rtl">
	تتميز جافا باحتوائها على مجموعة كبيرة من الدوال الجاهزة التي يمكنك استعمالها مباشرة، كما يمكننا من إنشاء دوال خاصة تؤدي وظائف محددة.
</p>

<p dir="rtl">
	تعريف الدوال يتم على النحو التالي
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_41_18">
<span class="typ">AccessModifier</span><span class="pln"> </span><span class="typ">ReturnType</span><span class="pln"> methodName </span><span class="pun">(</span><span class="pln"> parameters </span><span class="typ">List</span><span class="pun">){</span><span class="pln">

</span><span class="com">//Do some Actions here</span><span class="pln">

</span><span class="pun">}</span></pre>

<p dir="rtl">
	ويحدد <span style="font-family:courier new,courier,monospace;">AccessModifier</span> طريقة الوصول لهذه الدالة.
</p>

<p dir="rtl">
	ونوع البيانات التي سترجعه الدالة يتم تحديده في <span style="font-family:courier new,courier,monospace;">ReturnType</span>.
</p>

<p dir="rtl">
	ثم يتم تحديد الاسم الخاص بالدالة، والـ parameters هي البيانات التي يتم تمريرها للدالة.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_41_20">
<span class="kwd">public</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> add</span><span class="pun">(</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> a </span><span class="pun">,</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> b </span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">int</span><span class="pln"> sum </span><span class="pun">=</span><span class="pln"> a </span><span class="pun">+</span><span class="pln"> b</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">return</span><span class="pln"> sum</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p dir="rtl">
	في المثال السابق كلمة <span style="font-family:courier new,courier,monospace;">public</span> تعني أن هذه الدالة يمكن استدعاؤها من أي مكان في البرنامج وهي عكس <span style="font-family:courier new,courier,monospace;">private</span> والتي تعني أن هذه الدالة لا يمكن استدعاؤها إلا من داخل الصّنف <span style="font-family:courier new,courier,monospace;">class</span> الذي قام بتعريفها.
</p>

<p dir="rtl">
	بعد ذلك تم تحديد النوع الذي ستعيده الدالة عند استدعائها وهو <span style="font-family:courier new,courier,monospace;">int</span>، والاسم الخاص بهذه الدالة <span style="font-family:courier new,courier,monospace;">add</span> وتأخذ هذه الدالة قيمتين من النوع <span style="font-family:courier new,courier,monospace;">int</span> لتعيد ناتج جمعهما.
</p>

<p dir="rtl">
	لاستدعاء هذه الدالة من أي مكان داخل البرنامج يتم كتابة اسم الدالة كما بالشكل:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_41_22">
<span class="kwd">int</span><span class="pln"> result </span><span class="pun">=</span><span class="pln"> add </span><span class="pun">(</span><span class="lit">10</span><span class="pln"> </span><span class="pun">,</span><span class="pln"> </span><span class="lit">15</span><span class="pun">);</span></pre>

<h2 dir="rtl">
	الأصناف
</h2>

<p dir="rtl">
	وهو الوحدة الأساسية المبني عليها باقي مفاهيم البرمجة كائنية التّوجّه، وهو عبارة عن وعاء كبير يحتوي على متغيرات ودوال وكائنات. وعند تعريف صنف Class جديد يصبح لديك نوع بيانات جديد يمكنك استخدامه مع باق الأنواع الموجودة بالفعل.
</p>

<p dir="rtl">
	لتعريف صنف يتم كتابة كلمة <span style="font-family:courier new,courier,monospace;">class</span> واختيار اسم له، ثم فتح أقواس تحدد بدايته ونهايته.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_41_24">
<span class="kwd">class</span><span class="pln"> </span><span class="typ">ClassName</span><span class="pln"> </span><span class="pun">{</span><span class="pln">

</span><span class="pun">}</span></pre>

<p dir="rtl">
	تسمى المتغيرات التي يتم تعريفها داخل الصّنف بالخصائص attributes، وتسمى الدوال بالتّوابع methods (يعني سنستعمل "دالة" و "تابع" للدّلالة على نفس المفهوم).
</p>

<p dir="rtl">
	وتسمى المتغيرات من الأصناف بالكائنات Objects، فلا يمكن إنشاء كائن دون وجود صنف له.
</p>

<p dir="rtl">
	إذا أردنا أن نكتب برنامجًا يعبر عن مكتبة وما تحتويه من كتب فيمكن اعتبار الكتاب على أنه كائن ولإنشاء هذا الكائن ينبغي وجود Class له يحتوي على الخصائص الأساسية لجميع الكتب.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_41_26">
<span class="kwd">class</span><span class="pln"> </span><span class="typ">Book</span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">private</span><span class="pln"> </span><span class="typ">String</span><span class="pln"> bookName</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">private</span><span class="pln"> </span><span class="typ">String</span><span class="pln"> authorName</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">private</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> bookCode</span><span class="pun">;</span><span class="pln">

  </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> setBookName</span><span class="pun">(</span><span class="typ">String</span><span class="pln"> name</span><span class="pun">){</span><span class="pln">
    bookName </span><span class="pun">=</span><span class="pln"> name</span><span class="pun">;</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">

  </span><span class="kwd">public</span><span class="pln"> </span><span class="typ">String</span><span class="pln"> getBookName</span><span class="pun">(){</span><span class="pln">
    </span><span class="kwd">return</span><span class="pln"> bookName</span><span class="pun">;</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">

  </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> setAuthorName</span><span class="pun">(</span><span class="typ">String</span><span class="pln"> name</span><span class="pun">){</span><span class="pln">
    authorName </span><span class="pun">=</span><span class="pln"> name</span><span class="pun">;</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">

  </span><span class="kwd">public</span><span class="pln"> </span><span class="typ">String</span><span class="pln"> getAuthorName</span><span class="pun">(){</span><span class="pln">
    </span><span class="kwd">return</span><span class="pln"> authorName</span><span class="pun">;</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">

  </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> setBookCode</span><span class="pun">(</span><span class="kwd">int</span><span class="pln"> code</span><span class="pun">){</span><span class="pln">
    bookCode</span><span class="pun">=</span><span class="pln"> code
  </span><span class="pun">}</span><span class="pln">

  </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> getBookCode</span><span class="pun">(){</span><span class="pln">
    </span><span class="kwd">return</span><span class="pln"> bookCode</span><span class="pun">;</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p dir="rtl">
	هكذا قمنا بصنع الصّنف الأساسي لجميع الكتب ويحتوي على خصائص مثل اسم الكتاب واسم الكاتب وهذه البيانات معرّفة <span style="font-family:courier new,courier,monospace;">private</span> أي كما ذكرنا سابقًا لا يمكن الوصول لها أو تغييرها إلا داخل الصّنف المعرّفة بداخله فقط، وهناك عدة توابع فمنها ما يقوم بتخزين قيم في المتغيرات الخاصة بصنف ومنها ما يعيد القيم المخزنة.
</p>

<p dir="rtl">
	لاحظ أننا قمنا بتعريف التوابع كـ <span style="font-family:courier new,courier,monospace;">public</span> وذلك حتى نستطيع الوصول لها واستدعائها من أي مكان في البرنامج.
</p>

<p dir="rtl">
	هناك بعض الدوال التي تم تعريف نوع المُخرجات <span style="font-family:courier new,courier,monospace;">returnType</span> لها من النوع <span style="font-family:courier new,courier,monospace;">void</span> وتعني أنها لا تعيد شيئًا.
</p>

<p dir="rtl">
	ولإنشاء كائن من هذا الصّنف نكتب:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_41_29">
<span class="typ">Book</span><span class="pln"> b1 </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Book</span><span class="pun">();</span><span class="pln">
</span><span class="typ">Book</span><span class="pln"> book2 </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Book</span><span class="pun">();</span></pre>

<p dir="rtl">
	النصف الأيسر كما اعتدنا سابقًا عند إنشاء متغير جديد، أما النصف الأيمن فيتكون من شقين كلمة <span style="font-family:courier new,courier,monospace;">new</span> وتعني إنشاء هذا المتغير وحجز مساحة له في الذاكرة واسم الصّنف وبعده أقواس وهو ما يسمى بالـ Constructor.
</p>

<p dir="rtl">
	ولأي من هذه الكائنات إذا أردنا وضع قيم للخصائص التي بداخلها يتم على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_41_31">
<span class="pln">b1</span><span class="pun">.</span><span class="pln">setBookName</span><span class="pun">(“</span><span class="typ">Learn</span><span class="pln"> </span><span class="typ">Java</span><span class="pun">”);</span><span class="pln">

book2</span><span class="pun">.</span><span class="pln">setBookName</span><span class="pun">(“</span><span class="typ">Intro</span><span class="pln"> to programming </span><span class="typ">Language</span><span class="pun">”);</span><span class="pln">
book2</span><span class="pun">.</span><span class="pln">setBookCode</span><span class="pun">(</span><span class="lit">101</span><span class="pun">);</span><span class="pln">

</span><span class="typ">String</span><span class="pln"> name </span><span class="pun">=</span><span class="pln"> b1</span><span class="pun">.</span><span class="pln">getBookName</span><span class="pun">();</span></pre>

<p dir="rtl">
	وهذه بعض الأمثلة لكيفية استدعاء التّوابع المختلفة من داخل <span style="font-family:courier new,courier,monospace;">class</span> وباستخدام الكائن، لكل كائن خصائصه الخاصة لا يتشارك فيها مع باق الكائنات التي من نفس Class فلكل منها اسم كتاب يتم تخزين فيه نص معين لا يتشاركان فيه.
</p>

<p dir="rtl">
	ولاستدعاء التوابع يتم استخدام (.) بعد اسم الكائن ثم كتابة اسم التابع وتمرير المتغيرات التي تتعامل معها إن وجدت حسب تعريفنا للتّابع داخل الصّنف.
</p>

<p dir="rtl">
	لاحظ أن عند إنشاء صنف جديد نبدأ اسمه بحرف كبير دائمًا، ويمكنك إنشاء أي عدد من الكائنات من الصّنف كما ذكرنا في المثال السابق.
</p>

<h3 dir="rtl">
	تابع البناء Constructor
</h3>

<p dir="rtl">
	تتواجد داخل كل صنف تابع خاص يُدعى Constructor يتم استدعاؤه أثناء إنشاء كائن جديد فهو تابع مهم جدًا لإنشاء الكائنات ويقوم المترجم بإنشاء هذا تابع بناء فارغ بشكل افتراضي إذا لم يتم تعريفها من قبل المطوّر. وتكتب كالتالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_41_33">
<span class="kwd">public</span><span class="pln"> </span><span class="typ">ClassName</span><span class="pun">(</span><span class="pln">parameter </span><span class="typ">List</span><span class="pun">){</span><span class="pln">
  </span><span class="com">//Do some Actions here</span><span class="pln">
</span><span class="pun">}</span></pre>

<p dir="rtl">
	يجب أن يكون اسم تابع البناءconstructor نفس اسم الصنف ومن النوع <span style="font-family:courier new,courier,monospace;">public</span> ويمكنك تعريف أكثر من constructor داخل نفس الصّنف ولا يوجد نوع إرجاع returnType لـلـ constructor.
</p>

<p dir="rtl">
	يمكننا من خلال constructor إدخال قيم مباشرة في الخصائص الموجودة في الكائن بدلًا من استدعاء دالة لكل خاصية.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_41_35">
<span class="kwd">class</span><span class="pln"> </span><span class="typ">Book</span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">private</span><span class="pln"> </span><span class="typ">String</span><span class="pln"> bookName</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">private</span><span class="pln"> </span><span class="typ">String</span><span class="pln"> authorName</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">private</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> bookCode</span><span class="pun">;</span><span class="pln">
 
  </span><span class="kwd">public</span><span class="pln"> </span><span class="typ">Book</span><span class="pun">(</span><span class="typ">String</span><span class="pln"> name</span><span class="pun">,</span><span class="typ">String</span><span class="pln"> author</span><span class="pun">,</span><span class="kwd">int</span><span class="pln"> code</span><span class="pun">){</span><span class="pln">
    bookName </span><span class="pun">=</span><span class="pln"> name</span><span class="pun">;</span><span class="pln">
    authorName </span><span class="pun">=</span><span class="pln"> author</span><span class="pun">;</span><span class="pln">
    bookCode </span><span class="pun">=</span><span class="pln"> code</span><span class="pun">;</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">

  </span><span class="kwd">public</span><span class="pln"> </span><span class="typ">String</span><span class="pln"> getBookName</span><span class="pun">(){</span><span class="pln">
    </span><span class="kwd">return</span><span class="pln"> bookName</span><span class="pun">;</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">

  </span><span class="kwd">public</span><span class="pln"> </span><span class="typ">String</span><span class="pln"> getAuthorName</span><span class="pun">(){</span><span class="pln">
    </span><span class="kwd">return</span><span class="pln"> authorName</span><span class="pun">;</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">

  </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> getBookCode</span><span class="pun">(){</span><span class="pln">
    </span><span class="kwd">return</span><span class="pln"> bookCode</span><span class="pun">;</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p dir="rtl">
	في كل مرة يتم إنشاء كائن جديد، يجب استدعاء تابع البناء constructor حتى يتم إنشاء هذا الكائن.
</p>

<p dir="rtl">
	لإنشاء كائنات بعد هذا التعديل:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_41_37">
<span class="typ">Book</span><span class="pln"> b1 </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Book</span><span class="pln"> </span><span class="pun">(“</span><span class="typ">Learn</span><span class="pln"> </span><span class="typ">Java</span><span class="pun">”,”</span><span class="pln">M</span><span class="pun">.</span><span class="pln">K </span><span class="typ">Dave</span><span class="pun">”,</span><span class="pln"> </span><span class="lit">150</span><span class="pun">);</span></pre>

<p dir="rtl">
	هنا تم تعريف كافة الخصائص لحظة إنشاء الكائن، ويتم التعامل مع هذا الكائن بشكل طبيعي كما تعاملنا معه مسبقًا.
</p>

<h2 dir="rtl">
	الوراثة
</h2>

<p dir="rtl">
	يعتبر مفهوم الوراثة من أهم المفاهيم في البرمجة كائنية التّوجّه ويعني يمكننا إنشاء أصناف ترث من صنف آخر الخصائص والتّوابع المتواجدة به دون تعريفها من جديد، مما يسمح بالتركيز على الخصائص والتّوابع التي يتميز بها الصّنف الجديد.
</p>

<p dir="rtl">
	وتستخدم الكلمة <span style="font-family:courier new,courier,monospace;">extends</span> لتطبيق مفهوم الوراثة:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_41_39">
<span class="kwd">class</span><span class="pln"> </span><span class="typ">Shape</span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">protected</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> width</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">protected</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> height</span><span class="pun">;</span><span class="pln">

  </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> setWidth</span><span class="pun">(</span><span class="kwd">int</span><span class="pln"> a</span><span class="pun">){</span><span class="pln">
    width </span><span class="pun">=</span><span class="pln"> a</span><span class="pun">;</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">

  </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> setHeight</span><span class="pun">(</span><span class="kwd">int</span><span class="pln"> b</span><span class="pun">){</span><span class="pln">
    height </span><span class="pun">=</span><span class="pln"> b</span><span class="pun">;</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p dir="rtl">
	إذا كان لدينا هذا الصّنف وهو يُمثل شكلًا عامًا له طول وعرض وأردنا أن ننشئ شكلًا آخر (مربع) يرث من هذا الصّنف ويضيف خصائص أكثر:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_41_41">
<span class="kwd">class</span><span class="pln"> </span><span class="typ">Square</span><span class="pln"> extends </span><span class="typ">Shape</span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> getArea</span><span class="pun">(){</span><span class="pln">
    </span><span class="kwd">return</span><span class="pln"> width </span><span class="pun">*</span><span class="pln"> height</span><span class="pun">;</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p dir="rtl">
	وبذلك أصبح <span style="font-family:courier new,courier,monospace;">Square</span> يحتوي على الدالتين <span style="font-family:courier new,courier,monospace;">setWidth</span> و <span style="font-family:courier new,courier,monospace;">setHeight</span> بالإضافة للدالة الجديدة التي قام بتعريفها <span style="font-family:courier new,courier,monospace;">getArea</span>، وبذلك استطعنا أن نعطي المزيد من الخصائص للشكل الجديد.
</p>

<p dir="rtl">
	وإذا أردنا أن نصنع شكلًا آخر (مثلث):
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_41_43">
<span class="kwd">class</span><span class="pln"> </span><span class="typ">Triangle</span><span class="pln"> extends </span><span class="typ">Shape</span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> getArea</span><span class="pun">(){</span><span class="pln">
    </span><span class="kwd">return</span><span class="pln"> </span><span class="lit">0.5</span><span class="pun">*</span><span class="pln">width </span><span class="pun">*</span><span class="pln"> height</span><span class="pun">;</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p dir="rtl">
	لا يمكن للصّنف أن يرث من أكثر من أب.
</p>

<p dir="rtl">
	وبتطبيق هذا المفهوم على الدرس السابق نجد أن أندرويد يحتوي على صنف اسمه View وهو الأب لكل العناصر الخاصة بواجهة المستخدم ويحدد الخصائص الأساسية والمشتركة بينهم جميعًا ويرث منه العناصر الخاصة مثل <span style="font-family:courier new,courier,monospace;">TextView</span> وهو <span style="font-family:courier new,courier,monospace;">View</span> ولكن يعرض نصًا فقط أو <span style="font-family:courier new,courier,monospace;">Button</span> وأيًضا <span style="font-family:courier new,courier,monospace;">View</span> قابل للضغط ويقوم بمهمة محددة عند الضغط عليه.
</p>

<p dir="rtl">
	وإذا قمنا بالتعديل على المثال السابق واستخدمنا في <span style="font-family:courier new,courier,monospace;">Shape</span> تابع البناء لتعريف الطول والعرض:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_41_45">
<span class="kwd">class</span><span class="pln"> </span><span class="typ">Shape</span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">protected</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> width</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">protected</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> height</span><span class="pun">;</span><span class="pln">

  </span><span class="kwd">public</span><span class="pln"> </span><span class="typ">Shape</span><span class="pun">(</span><span class="kwd">int</span><span class="pln"> a </span><span class="pun">,</span><span class="kwd">int</span><span class="pln"> b</span><span class="pun">){</span><span class="pln">
    width </span><span class="pun">=</span><span class="pln"> a</span><span class="pun">;</span><span class="pln">
    height </span><span class="pun">=</span><span class="pln"> b</span><span class="pun">;</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p dir="rtl">
	ينبغي علينا أن نعرف دالة بناء للصّنف التي ترث منه:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_41_47">
<span class="kwd">class</span><span class="pln"> </span><span class="typ">Square</span><span class="pln"> extends </span><span class="typ">Shape</span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">public</span><span class="pln"> </span><span class="typ">Shape</span><span class="pun">(</span><span class="kwd">int</span><span class="pln"> w </span><span class="pun">,</span><span class="kwd">int</span><span class="pln"> h</span><span class="pun">){</span><span class="pln">
    super</span><span class="pun">(</span><span class="pln">w</span><span class="pun">,</span><span class="pln">h</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">

  </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> getArea</span><span class="pun">(){</span><span class="pln">
    </span><span class="kwd">return</span><span class="pln"> width </span><span class="pun">*</span><span class="pln"> height</span><span class="pun">;</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p dir="rtl">
	وتستخدم <span style="font-family:courier new,courier,monospace;">super</span> لاستدعاء Constructor الخاص بالأب وتمرير له القيم التي يحتاجها، وذلك لأن عند إنشاء كائن من <span style="font-family:courier new,courier,monospace;">Square</span> والذي يرث من <span style="font-family:courier new,courier,monospace;">Shape:</span>
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_41_49">
<span class="typ">Sqaure</span><span class="pln"> s </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Square</span><span class="pun">(</span><span class="lit">10</span><span class="pun">,</span><span class="lit">10</span><span class="pun">);</span></pre>

<p dir="rtl">
	يتم بناء الأب أولًا <span style="font-family:courier new,courier,monospace;">Shape</span> ثم الابن <span style="font-family:courier new,courier,monospace;">Square</span> حتى يكتمل بناء الكائن <span style="font-family:courier new,courier,monospace;">s </span>بشكل صحيح.
</p>

<p dir="rtl">
	لذا يتم تمرير في دالة البناء الخاصة بالابن ما تحتاجه دالة البناء الخاصة بالأب، ولم نقوم بذلك قبل التعديل لأننا كنا نستعمل دالة بناء فارغة في الأب.
</p>

<h2 dir="rtl">
	التحويل من نوع بيانات إلى آخر
</h2>

<p dir="rtl">
	تمكننا لغات البرمجة من التحويل من نوع بيانات إلى آخر باستخدام مفهوم Casting، فمثلًا إذا كان لدينا متغير من النوع <span style="font-family:courier new,courier,monospace;">double</span>:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_41_51">
<span class="kwd">double</span><span class="pln"> d </span><span class="pun">=</span><span class="pln"> </span><span class="lit">12.5478</span><span class="pun">;</span></pre>

<p dir="rtl">
	ونريد تحويله إلى رقم صحيح:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_41_53">
<span class="kwd">int</span><span class="pln"> x </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">int</span><span class="pun">)</span><span class="pln"> d</span><span class="pun">;</span></pre>

<p dir="rtl">
	نفعل ذلك عن طريق كتابة نوع المتغير بين القوسين وبعدها اسم المتغير الذي نريد تحويله كما في المثال.
</p>

<p dir="rtl">
	وهناك بعض الشروط على التحويل بين الأنواع بهذه الطريقة فلا يمكن تحويل <span style="font-family:courier new,courier,monospace;">String</span> إلى <span style="font-family:courier new,courier,monospace;">int</span> مثلًا لاختلاف النوعين عن بعضهما.
</p>

<p dir="rtl">
	ويمكن تحويل من صنف إلى آخر شريطة أن يكون بينهما علاقة الوراثة.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_41_55">
<span class="typ">Shape</span><span class="pln"> sh </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Shape</span><span class="pun">(</span><span class="lit">15</span><span class="pun">,</span><span class="lit">15</span><span class="pun">);</span><span class="pln">
</span><span class="typ">Square</span><span class="pln"> s </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="typ">Square</span><span class="pun">)</span><span class="pln"> sh</span><span class="pun">;</span></pre>

<p dir="rtl">
	بهذا نكون قد وصلنا إلى نهاية هذا الدّرس، في انتظار تجربتكم وآرائكم.
</p>

<p dir="rtl">
	إن كانت لديك أيّة أسئلة فلا تتردّد في طرحها.
</p>
]]></description><guid isPermaLink="false">334</guid><pubDate>Sat, 21 May 2016 09:38:00 +0000</pubDate></item><item><title>&#x623;&#x633;&#x627;&#x633;&#x64A;&#x627;&#x62A; &#x627;&#x644;&#x628;&#x631;&#x645;&#x62C;&#x629; &#x643;&#x627;&#x626;&#x646;&#x64A;&#x629; &#x627;&#x644;&#x62A;&#x648;&#x62C;&#x647;&#x60C; &#x627;&#x644;&#x645;&#x62A;&#x63A;&#x64A;&#x631;&#x627;&#x62A;&#x60C;  &#x627;&#x644;&#x62C;&#x645;&#x644; &#x627;&#x644;&#x634;&#x631;&#x637;&#x64A;&#x629; &#x648;&#x627;&#x644;&#x62D;&#x644;&#x642;&#x627;&#x62A; &#x641;&#x64A; &#x62C;&#x627;&#x641;&#x627;</title><link>https://academy.hsoub.com/programming/android/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D9%83%D8%A7%D8%A6%D9%86%D9%8A%D8%A9-%D8%A7%D9%84%D8%AA%D9%88%D8%AC%D9%87%D8%8C-%D8%A7%D9%84%D9%85%D8%AA%D8%BA%D9%8A%D8%B1%D8%A7%D8%AA%D8%8C-%D8%A7%D9%84%D8%AC%D9%85%D9%84-%D8%A7%D9%84%D8%B4%D8%B1%D8%B7%D9%8A%D8%A9-%D9%88%D8%A7%D9%84%D8%AD%D9%84%D9%82%D8%A7%D8%AA-%D9%81%D9%8A-%D8%AC%D8%A7%D9%81%D8%A7-r310/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2016_05/android-java.png.7958fbfd0093450cd2a07e34ac4ead5e.png" /></p>

<p dir="rtl">
	توجد طرق متعددة لصنع تطبيقات لنظام تشغيل أندرويد ويُفضل المطوَرون كتابة التطبيقات باستخدام اللغة الرسمية وهي جافا لقدرتها على استغلال كافة موارد الهاتف وكفاءتها عند العمل.
</p>

<p dir="rtl" style="text-align: center;">
	<img alt="android-java.png" class="ipsImage ipsImage_thumbnailed" data-fileid="16522" data-unique="c306worrm" src="https://academy.hsoub.com/uploads/monthly_2016_05/android-java.png.421c1ab484030ec265abcb6e0a756aaa.png"></p>

<p dir="rtl">
	وتُستخدم لغات البرمجة لإعطاء الأوامر للحاسوب لتنفيذها وتتشابه مع اللغات الحقيقية في أنها بدلًا من أن تتواصل مع البشر فهي تتواصل مع الحاسوب ووصف الطريقة التي أرغب أن يعمل بها.
</p>

<p dir="rtl">
	يعتمد نظام تشغيل أندرويد على أساسيات لغة جافا ومكتباتها القوية بالإضافة إلى مكتبات أندرويد الخاصة، ويتم وضع الشيفرة المكتوبة بلغة جافا بعد أن يتم ترجمتها إلى صيغتها التنفيذية في ملف بامتداد apk جنبًا إلى جنب مع باقي الموارد من صور وملف androidManifest.
</p>

<h2 dir="rtl">
	البرمجة كائنية التوجه
</h2>

<p dir="rtl">
	تتميز لغة جافا بأنها لغة سهلة التعلم وتٌصنف من اللغات عالية المستوى والتي نستطيع فهم أوامرها بسهولة، وهي من لغات البرمجة التي تدعم مفهوم البرمجة كائنية التّوجّه.
</p>

<p dir="rtl">
	والبرمجة كائنية التّوجّه تتكون من مجموعة من المفاهيم.
</p>

<p dir="rtl">
	في عالمنا الحقيقي يمكن التعامل مع أي شيء على أنه كائن، ولكل كائن صفات تميزه ولديه وظائف يستطيع القيام بها، فمثلًا الكاميرا كائن لها صفات مثل اللون والأبعاد والشركة المصنعة لها، ولها وظائف يستطيع القيام بها مثل التصوير أو تخزين وعرض الصورة.
</p>

<p dir="rtl">
	ويوجد أنواع عديدة من الكاميرات لذا يتم وضع التصميم المشترك والتعريف الخاص بهذه الكائنات في البرمجة في صنفClass ومن هذا الصّنف يتم استخراج الكائنات.
</p>

<p dir="rtl">
	لذا يتم تصّنيف الأشياء إلى فئات تشترك في الصفات والوظائف ومنها يتم صنع الكائنات Objects.
</p>

<h2 dir="rtl">
	المتغيرات
</h2>

<p dir="rtl">
	تتعامل لغة جافا مع كافة أنواع البيانات والقيام عليها بالعمليات المختلفة. لذا تستخدم المتغيرات كحاويات لتخزين هذه البيانات لحفظها بشكل مؤقت والقيام عليها بالعمليات المطلوبة ويمكن تغيير هذه القيم في أي وقت ويعتبر تعريف المتغيرات الطريقة لجعل الحاسوب يحتفظ بالمعلومات.
</p>

<p dir="rtl">
	عند تعريف متغير جديد يجب تحديد ما هو نوع البيانات التي يستطيع المتغير تخزينها بداخله، قد تكون البيانات اسمًا أو أرقامًا أو رابط لفيديو أو صورة لذا يجب تحديد نوع البيانات التي سيحتويها المتغير حتى يستطيع البرنامج التعامل معها بشكل صحيح. فإذا كان المتغير رقمًا فلا يمكن أن نخزن به نصًا.
</p>

<p dir="rtl">
	ولتعريف متغير جديد يتم على هذا النحو:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_7063_15">
<span class="typ">DataType</span><span class="pln"> variableName</span><span class="pun">;</span></pre>

<p dir="rtl">
	يتم كتابة نوع البيانات أولًا ثم اسم المتغير، واسم المتغير يمكن أن يكون أي شيء ولكن هناك بعض الأمور التي يجب مراعاتها وهي:
</p>

<ul dir="rtl">
<li>
		يمكنك استخدام الحروف "A-Z" و "a-z" و "0-9".
	</li>
	<li>
		ألا يبدأ برقم.
	</li>
	<li>
		لا يسمح باستخدام أي حروف خاصة في الاسم مثل @، # وغيرهما عدا _ فقط.
	</li>
	<li>
		لا يسمح باستخدام المسافات في الاسم.
	</li>
	<li>
		ألا يكون الاسم من الكلمات المجوزة لدى اللغة وهي كلمات ذات معنى محدد لدى المترجم.
	</li>
</ul>
<h3 dir="rtl">
	أنواع البيانات
</h3>

<p dir="rtl">
	هناك بعض الأنواع الأساسية لتعريف المتغيرات مثل:
</p>

<ul dir="rtl">
<li>
		الأرقام الصحيحة: يتم تخزين الأرقام الصحيحة في متغير النوع <span style="font-family:courier new,courier,monospace;">int</span>.
	</li>
</ul>
<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_7063_13">
<span class="kwd">int</span><span class="pln"> number</span><span class="pun">=</span><span class="lit">26</span><span class="pun">;</span></pre>

<ul dir="rtl">
<li>
		الأرقام الكسرية: لتخزين الأرقام الكسرية نستخدم متغير من النوع <span style="font-family:courier new,courier,monospace;">float</span> أو <span style="font-family:courier new,courier,monospace;">double</span>.
	</li>
</ul>
<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_7063_27">
<span class="kwd">double</span><span class="pln"> fraction</span><span class="pun">=</span><span class="lit">102.486</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">float</span><span class="pln"> fraction</span><span class="pun">=</span><span class="lit">842.014f</span><span class="pun">;</span></pre>

<p dir="rtl">
	لاحظ أن عند تعريف متغير من النوع <span style="font-family:courier new,courier,monospace;">float</span> يجب وضع الحرف f في نهاية الرقم.
</p>

<ul dir="rtl">
<li>
		الحروف: لتخزين حرف واحد نستخدم متغير من النوع <span style="font-family:courier new,courier,monospace;">char</span>.
	</li>
</ul>
<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_7063_25">
<span class="kwd">char</span><span class="pln"> c</span><span class="pun">=’</span><span class="pln">y</span><span class="pun">’;</span><span class="pln">
</span><span class="kwd">char</span><span class="pln"> num</span><span class="pun">=’</span><span class="lit">8</span><span class="pun">’;</span><span class="pln">
</span><span class="kwd">char</span><span class="pln"> s</span><span class="pun">=’&amp;’;</span></pre>

<p dir="rtl">
	يتم وضع الحرف بين علامتيّ اقتباس فردية.
</p>

<ul dir="rtl">
<li>
		القيم المنطقية: لتخزين متغير يحمل إحدى القيمتين المنطقيين <span style="font-family:courier new,courier,monospace;">true</span> أو <span style="font-family:courier new,courier,monospace;">false</span> يتم تعريف متغير من النوع <span style="font-family:courier new,courier,monospace;">boolean</span>، ويستخدم في المقارنات المنطقية.
	</li>
</ul>
<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_7063_19">
<span class="pln">boolean flag</span><span class="pun">=</span><span class="kwd">true</span><span class="pun">;</span></pre>

<ul dir="rtl">
<li>
		النصوص: لتخزين نص يتم استخدام متغير من النوع <span style="font-family:courier new,courier,monospace;">String</span>.
	</li>
</ul>
<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_7063_21">
<span class="typ">String</span><span class="pln"> str</span><span class="pun">=”</span><span class="typ">Hello</span><span class="pun">,</span><span class="typ">World</span><span class="pun">!!”;</span></pre>

<p dir="rtl">
	يتم وضع النص بين علامتيّ اقتباس زوجية ولا يوجد حد لطول النص.
</p>

<p dir="rtl">
	والاختلاف بين النوعين <span style="font-family:courier new,courier,monospace;">char</span> و <span style="font-family:courier new,courier,monospace;">String</span> أن الأول لتخزين حرف واحد فقط والثاني لنص كامل، ولاحظ أن علامتيَ الاقتباس مختلفة فلا يمكن استخدام "R" لتخزينها في متغير من النوع <span style="font-family:courier new,courier,monospace;">char</span> لأنها داخل علامتيّ الاقتباس الخاصة بالنص.
</p>

<p dir="rtl">
	كما يمكنك أن تقوم بتعريف المزيد من أنواع البيانات باستخدام الأصناف كما سنرى لاحقًا.
</p>

<p dir="rtl">
	في الأمثلة السابقة قمنا بتعريف المتغير وتخزين قيمة مبدئية بداخله، هناك طريقة أخرى يمكن استخدامها كما في المثال التالي.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_7063_23">
<span class="kwd">int</span><span class="pln"> x</span><span class="pun">;</span><span class="pln">
x</span><span class="pun">=</span><span class="lit">100</span><span class="pun">;</span></pre>

<p dir="rtl">
	في المثال السابق تم تعريف متغير اسمه <span style="font-family:courier new,courier,monospace;">x</span> ثم قمنا لاحقًا بتخزين قيمة بداخله ويمكن تغيير القيمة بعد ذلك في أي وقت داخل البرنامج، وبالمثل يمكن تعريف باقيِ أنواع المتغيرات بهذه الطريقة.
</p>

<h3 dir="rtl">
	ملاحظات
</h3>

<ol dir="rtl">
<li>
		تنتهي الجمل في جافا بالفاصلة المنقوطة ";" للتعبير عن انتهاء الجملة، ويمكن اعتبارها مثل النقطة التي تنتهي بها الجملة عند الكتابة.
	</li>
	<li>
		العلامة "=" تسمى بـ "عامل الإسناد" (Assignment Operator) وتستخدم لتخزين القيم التي تقع يمين العامل في المتغير الذي يقع على يساره.
	</li>
</ol>
<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_7063_29">
<span class="kwd">int</span><span class="pln"> x</span><span class="pun">;</span><span class="pln">
x</span><span class="pun">=</span><span class="lit">3</span><span class="pun">;</span><span class="pln">
x</span><span class="pun">=</span><span class="pln">x</span><span class="pun">+</span><span class="lit">5</span><span class="pun">;</span></pre>

<p dir="rtl">
	في هذا المثال سيتم تخزين 3 في المتغير<span style="font-family:courier new,courier,monospace;"> x</span> ثم بعد ذلك جمع عليه الرقم 5 وتخزينه مرة أخرى في<span style="font-family:courier new,courier,monospace;"> x</span> ليصبح الناتج النهائي المخزن داخل المتغير<span style="font-family:courier new,courier,monospace;"> x </span>يساوي 8.
</p>

<h2 dir="rtl">
	العمليات الحسابية والمنطقية
</h2>

<h3 dir="rtl">
	العمليات الرياضية
</h3>

<p dir="rtl">
	يمكننا القيام بالعمليات الرياضية المعتادة في لغة جافا فمثلًا:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_7063_31">
<span class="kwd">int</span><span class="pln"> x </span><span class="pun">=</span><span class="pln"> </span><span class="lit">19</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">int</span><span class="pln"> y </span><span class="pun">=</span><span class="pln"> </span><span class="lit">4</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">int</span><span class="pln"> result </span><span class="pun">=</span><span class="pln"> x </span><span class="pun">+</span><span class="pln"> y</span><span class="pun">;</span></pre>

<p dir="rtl">
	وهنا يتم جمع قيم المتغيرين وتخزينهما في المتغير <span style="font-family:courier new,courier,monospace;">result</span> ليصبح الناتج يساوي 23:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_7063_33">
<span class="kwd">int</span><span class="pln"> result </span><span class="pun">=</span><span class="pln"> x </span><span class="pun">–</span><span class="pln"> y</span><span class="pun">;</span></pre>

<p dir="rtl">
	وإذا قمنا بتغيير السطر الثالث بهذا السطر فيصبح الناتج 15:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_7063_35">
<span class="kwd">int</span><span class="pln"> result </span><span class="pun">=</span><span class="pln"> x </span><span class="pun">*</span><span class="pln"> y</span><span class="pun">;</span></pre>

<p dir="rtl">
	وناتج ضربهما يساوي 76:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_7063_37">
<span class="kwd">int</span><span class="pln"> result </span><span class="pun">=</span><span class="pln"> x </span><span class="pun">/</span><span class="pln"> y</span><span class="pun">;</span></pre>

<p dir="rtl">
	وناتج القسمة يساوي 4 ويتم إهمال الكسر لأن في لغات البرمجة عندما نقوم بقسمة رقمين صحيحين فيكون الناتج رقمًا صحيحًا.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_7063_39">
<span class="kwd">int</span><span class="pln"> result </span><span class="pun">=</span><span class="pln"> x </span><span class="pun">%</span><span class="pln"> y</span><span class="pun">;</span></pre>

<p dir="rtl">
	وتعني هذه العملية بباقي قسمة <span style="font-family:courier new,courier,monospace;">x</span> على <span style="font-family:courier new,courier,monospace;">y</span> وتساوي 5.
</p>

<p dir="rtl">
	وهناك العملية:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_7063_41">
<span class="pln">x</span><span class="pun">++;</span></pre>

<p dir="rtl">
	وهي تتشابه مع:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_7063_43">
<span class="pln">x</span><span class="pun">=</span><span class="pln">x</span><span class="pun">+</span><span class="lit">1</span><span class="pun">;</span></pre>

<p dir="rtl">
	فهي تقوم بزيادة واحد على قيمة المتغير، وبالمثل العملية<span style="font-family:courier new,courier,monospace;"> --x </span>تقوم بطرح واحد من قيمة المتغير.
</p>

<h3 dir="rtl">
	عمليات المقارنة
</h3>

<p dir="rtl">
	وتقارن هذه العمليات بين المعاملات مثل:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_7063_45">
<span class="kwd">int</span><span class="pln"> a </span><span class="pun">=</span><span class="pln"> </span><span class="lit">15</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">int</span><span class="pln"> b </span><span class="pun">=</span><span class="pln"> </span><span class="lit">20</span><span class="pun">;</span><span class="pln">
boolean result </span><span class="pun">=</span><span class="pln"> a </span><span class="pun">&gt;</span><span class="pln"> b</span><span class="pun">;</span></pre>

<p dir="rtl">
	وتقوم هذه العملية بالمقارنة بين قيمتيّ <span style="font-family:courier new,courier,monospace;">a</span> و<span style="font-family:courier new,courier,monospace;"> b</span> وتخزين <span style="font-family:courier new,courier,monospace;">true</span> أو <span style="font-family:courier new,courier,monospace;">false</span> في المتغير <span style="font-family:courier new,courier,monospace;">result</span> وفي المثال السابق سيتم تخزين <span style="font-family:courier new,courier,monospace;">false</span> لأن <span style="font-family:courier new,courier,monospace;">b</span> ذات قيمة أكبر من<span style="font-family:courier new,courier,monospace;"> a</span>.
</p>

<p dir="rtl">
	وباقي المقارنات هي<font face="courier new, courier, monospace"> &gt;</font> أصغر من، و <span style="font-family:courier new,courier,monospace;">=&lt;</span> أكبر من أو يساوي، <span style="font-family:courier new,courier,monospace;">=&gt;</span> أصغر من أو يساوي، <span style="font-family:courier new,courier,monospace;">== </span>يساوي، <span style="font-family:courier new,courier,monospace;">=!</span> لا يساوي وكلهم يكون ناتجهم إما <span style="font-family:courier new,courier,monospace;">true</span> أو <span style="font-family:courier new,courier,monospace;">false</span>.
</p>

<h3 dir="rtl">
	العمليات المنطقية
</h3>

<p dir="rtl">
	تستخدم العمليات المنطقية في ربط ناتج أكثر من عملية مقارنة سويًا.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_7063_47">
<span class="kwd">int</span><span class="pln"> a </span><span class="pun">=</span><span class="pln"> </span><span class="lit">15</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">int</span><span class="pln"> b </span><span class="pun">=</span><span class="pln"> </span><span class="lit">20</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">int</span><span class="pln"> c </span><span class="pun">=</span><span class="pln"> </span><span class="lit">7</span><span class="pun">;</span><span class="pln">

boolean result </span><span class="pun">=</span><span class="pln"> a </span><span class="pun">&gt;</span><span class="pln"> b </span><span class="pun">&amp;&amp;</span><span class="pln"> a </span><span class="pun">&gt;</span><span class="pln"> c</span><span class="pun">;</span></pre>

<p dir="rtl">
	وتستخدم <span style="font-family:courier new,courier,monospace;">&amp;&amp; </span>(كحرف العطف "و") للتعبير عن وجوب تحقق الشرطين معًا ليكون الناتج <span style="font-family:courier new,courier,monospace;">true</span> ويكون <span style="font-family:courier new,courier,monospace;">false</span> غير ذلك.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_7063_49">
<span class="pln">boolean result </span><span class="pun">=</span><span class="pln"> a </span><span class="pun">&gt;</span><span class="pln"> b </span><span class="pun">||</span><span class="pln"> a </span><span class="pun">&gt;</span><span class="pln"> c</span><span class="pun">;</span></pre>

<p dir="rtl">
	وتستخدم<span style="font-family:courier new,courier,monospace;"> || </span>(كحرف العطف "أو") للتعبير عن تحقق إحدى الشرطين أو تحققهما معًا ليكون الناتج <span style="font-family:courier new,courier,monospace;">true</span> ويكون الناتج <span style="font-family:courier new,courier,monospace;">false</span> عندما يكون الشرطين غير متحققين معًا.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_7063_51">
<span class="pln">boolean result </span><span class="pun">=</span><span class="pln"> </span><span class="pun">!(</span><span class="pln">a</span><span class="pun">&gt;</span><span class="pln">b</span><span class="pun">);</span></pre>

<p dir="rtl">
	وتعني <span style="font-family:courier new,courier,monospace;">!</span> عكس الناتج فإذا كان <span style="font-family:courier new,courier,monospace;">true</span> يصبح <span style="font-family:courier new,courier,monospace;">false</span> والعكس صحيح.
</p>

<h2 dir="rtl">
	التعليقات
</h2>

<p dir="rtl">
	يحتاج المطوّر في بعض الأحيان لإضافة بعض التعليقات والملاحظات على البرنامج وذلك لتسهيل فهم ما كتبه من شيفرات عند قراءتها دون التأثير على الأوامر المكتوبة، حيث أن التعليقات لا يترجمها المترجم الخاص بجافا بل يهملها.
</p>

<h3 dir="rtl">
	تعليق السطر الواحد
</h3>

<p dir="rtl">
	هذا النوع من التعليق يتم باستخدام علامتيّ <span style="font-family:courier new,courier,monospace;">//</span>، ويجعل السطر المقابل لها تعليق لا يراه البرنامج.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_7063_53">
<span class="com">//This is a single-line comment</span><span class="pln">

</span><span class="kwd">int</span><span class="pln"> weekDays </span><span class="pun">=</span><span class="pln"> </span><span class="lit">7</span><span class="pun">;</span><span class="pln"> </span><span class="com">//Number of Days in a week</span></pre>

<p dir="rtl">
	كما ترى يقوم التعليق بتوضيح الأمور للمطوّر.
</p>

<h3 dir="rtl">
	تعليق الأسطر المتعددة
</h3>

<p dir="rtl">
	يمكنك أن تكتب تعليق في عدة أسطر باستخدام <span style="font-family:courier new,courier,monospace;">/* */ ل</span>كتابة التعليق:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_7063_55">
<span class="com">/*This is a multi-line comment.

That comment ends when it finds the closing marker. */</span></pre>

<p dir="rtl">
	يتم حجز عدد من الأسطر بين <span style="font-family:courier new,courier,monospace;">*/ </span> و <span style="font-family:courier new,courier,monospace;">/*</span> وتكون عبارة عن تعليق. ولن يتم تنفيذها في البرنامج، فوصول المترجم لـ<span style="font-family:courier new,courier,monospace;"> */ </span>تجعله يتجاهل كل ما يقابله حتى يصل لـ <span style="font-family:courier new,courier,monospace;">/*</span> ثم يقوم بتنفيذ ما بعدها.
</p>

<p dir="rtl">
	لذا فالتعليقات في البرنامج تساهم في توضيحه وتجعل قراءته أسهل. فأي شيء يبدو واضحًا وبديهيًا عند كتابة البرنامج قد لا يبدو كذلك بعد مرور فترة طويلة.
</p>

<h2 dir="rtl">
	الجمل الشرطية
</h2>

<p dir="rtl">
	وهي الجمل التي تنفذ عند تحقق شرط معين ولتنفيذها يتم استخدام <span style="font-family:courier new,courier,monospace;">if </span>و<span style="font-family:courier new,courier,monospace;"> if-else </span>و <span style="font-family:courier new,courier,monospace;">switch</span>، وإذا لم يتحقق هذا الشرط لا يتم تنفيذها.
</p>

<h3>
	جملة if
</h3>

<p>
	تعتبر جملة if من أبسط الجمل الشرطية فهي تحتوي على شرط عند تحققه يتم تنفيذ أوامر محددة ويتم تركيبها على الشكل التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_7063_57">
<span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln"> </span><span class="typ">Condition</span><span class="pln"> </span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">

</span><span class="com">// Do Some Actions if it’s true</span><span class="pln">

</span><span class="pun">}</span></pre>

<p dir="rtl">
	تُكتب كلمة <span style="font-family:courier new,courier,monospace;">if</span> ويتم وضع الشرط بين الأقواس و عند تحقق الشرط يتم تنفيذ الأوامر المتواجدة بين القوسين { } وإذا لم يتحقق يتم تجاهل هذه الأوامر واستكمال الشفرة الخاصة بالبرنامج.
</p>

<p dir="rtl">
	مثال على ذلك:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_7063_59">
<span class="kwd">int</span><span class="pln"> x </span><span class="pun">=</span><span class="pln"> </span><span class="lit">10</span><span class="pun">;</span><span class="pln">
</span><span class="typ">String</span><span class="pln"> result </span><span class="pun">=</span><span class="pln"> </span><span class="pun">“</span><span class="kwd">false</span><span class="pun">”;</span><span class="pln">

</span><span class="kwd">if</span><span class="pun">(</span><span class="pln">x </span><span class="pun">&gt;</span><span class="pln"> </span><span class="lit">10</span><span class="pun">){</span><span class="pln">
  result </span><span class="pun">=</span><span class="pln"> </span><span class="pun">“</span><span class="kwd">true</span><span class="pun">”;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p dir="rtl">
	في المثال السابق يتم التحقق من قيمة المتغير <span style="font-family:courier new,courier,monospace;">x</span> إذا كانت أكبر من الصفر أم لا، وفي هذه الحالة فالشرط سليم ويتم تخزين النص "true<span style="font-family:courier new,courier,monospace;">"</span> داخل المتغير <span style="font-family:courier new,courier,monospace;">result</span>، وإذا تم تغيير قيمة المتغير <span style="font-family:courier new,courier,monospace;">x</span> إلى -5 مثلًا لن يتحقق الشرط وستظل قيمة النص "false".
</p>

<h3>
	الجملة if-else
</h3>

<p>
	وهي تقوم بنفس الوظيفة التي تقوم بها <span style="font-family:courier new,courier,monospace;">if</span> عدا أنه إذا لم يتحقق الشرط الخاص بـ <span style="font-family:courier new,courier,monospace;">if</span> تقوم بتنفيذ أوامر أخرى معرّفة لدى الجملة <span style="font-family:courier new,courier,monospace;">else</span>، وبالتعديل على المثال السابق:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_7063_61">
<span class="kwd">int</span><span class="pln"> x </span><span class="pun">=</span><span class="pln"> </span><span class="pun">-</span><span class="lit">6</span><span class="pun">;</span><span class="pln">
</span><span class="typ">String</span><span class="pln"> result </span><span class="pun">;</span><span class="pln">

</span><span class="kwd">if</span><span class="pun">(</span><span class="pln">x </span><span class="pun">&gt;</span><span class="pln"> </span><span class="lit">10</span><span class="pun">){</span><span class="pln">
  result </span><span class="pun">=</span><span class="pln"> </span><span class="pun">“</span><span class="kwd">true</span><span class="pun">”;</span><span class="pln">
</span><span class="pun">}</span><span class="kwd">else</span><span class="pun">{</span><span class="pln">
  result </span><span class="pun">=</span><span class="pln"> </span><span class="pun">“</span><span class="kwd">false</span><span class="pun">”;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p dir="rtl">
	في المثال لا يتم تم وضع نص مبدئي في المتغير <span style="font-family:courier new,courier,monospace;">result</span> ويتم التحقق بعد ذلك من الشرط الخاص بـ <span style="font-family:courier new,courier,monospace;">if</span> إذا كان صحيحًا فسيتم وضع النص "true" داخل المتغير <span style="font-family:courier new,courier,monospace;">result</span> أما إذا كان خاطئًا فسيتم وضع القيم "false" داخل المتغير <span style="font-family:courier new,courier,monospace;">result</span>.
</p>

<p dir="rtl">
	ويمكن القيام بالتحقق بأكثر من شرط كما في المثال التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_7063_63">
<span class="kwd">char</span><span class="pln"> grade </span><span class="pun">=</span><span class="pln"> </span><span class="pun">‘</span><span class="pln">B</span><span class="pun">’;</span><span class="pln">
</span><span class="typ">String</span><span class="pln"> result</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">if</span><span class="pun">(</span><span class="pln">grade</span><span class="pun">==’</span><span class="pln">A</span><span class="pun">’){</span><span class="pln">
  result </span><span class="pun">=</span><span class="pln"> </span><span class="pun">“</span><span class="typ">Excellent</span><span class="pun">”;</span><span class="pln">
</span><span class="pun">}</span><span class="kwd">else</span><span class="pln"> </span><span class="kwd">if</span><span class="pun">(</span><span class="pln">grade</span><span class="pun">==’</span><span class="pln">B</span><span class="pun">’){</span><span class="pln">
  result </span><span class="pun">=</span><span class="pln"> </span><span class="pun">“</span><span class="typ">Very</span><span class="pln"> good</span><span class="pun">”;</span><span class="pln">
</span><span class="pun">}</span><span class="kwd">else</span><span class="pln"> </span><span class="kwd">if</span><span class="pun">(</span><span class="pln">grade</span><span class="pun">==’</span><span class="pln">C</span><span class="pun">’){</span><span class="pln">
  result </span><span class="pun">=</span><span class="pln"> </span><span class="pun">“</span><span class="pln">good</span><span class="pun">”;</span><span class="pln">
</span><span class="pun">}</span><span class="kwd">else</span><span class="pln"> </span><span class="kwd">if</span><span class="pun">(</span><span class="pln">grade</span><span class="pun">==’</span><span class="pln">D</span><span class="pun">’){</span><span class="pln">
  result </span><span class="pun">=</span><span class="pln"> </span><span class="pun">“</span><span class="pln">passed</span><span class="pun">”;</span><span class="pln">
</span><span class="pun">}</span><span class="kwd">else</span><span class="pun">{</span><span class="pln">
  result </span><span class="pun">=</span><span class="pln"> </span><span class="pun">“</span><span class="pln">failed</span><span class="pun">”;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p dir="rtl">
	في هذا المثال تم استخدام أكثر من شرط وجملة واحدة فقط التي تتحقق ويكون الشرط فيها صحيحًا وفي المثال فهي الجملة الثانية ويتم تخزين النص "very good".
</p>

<p dir="rtl">
	لاحظ أننا لا تستخدم <span style="font-family:courier new,courier,monospace;">== </span>عند المقارنة بين النصوص من النوع <span style="font-family:courier new,courier,monospace;">String</span> وتستخدم الدالة <span style="font-family:courier new,courier,monospace;">equals</span>.
</p>

<h3>
	جملة switch
</h3>

<p>
	تستخدم هذه الجملة عندما نريد التحقق من قيمة متغير واحد فقط وتعتبر أكثر سهولة من <span style="font-family:courier new,courier,monospace;">if</span> في هذه الحالة:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_7063_65">
<span class="kwd">switch</span><span class="pun">(</span><span class="pln">variable</span><span class="pun">){</span><span class="pln">

</span><span class="kwd">case</span><span class="pln"> </span><span class="lit">1</span><span class="pun">:</span><span class="pln">
  </span><span class="com">//Do something</span><span class="pln">
  </span><span class="kwd">break</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">case</span><span class="pln"> </span><span class="lit">2</span><span class="pun">:</span><span class="pln">
  </span><span class="com">//Do something</span><span class="pln">
  </span><span class="kwd">break</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">default</span><span class="pun">:</span><span class="pln">
  </span><span class="com">//Do something</span><span class="pln">
  </span><span class="kwd">break</span><span class="pun">;</span><span class="pln"> 
</span><span class="pun">}</span></pre>

<p dir="rtl">
	وبتحويل المثال السابق الخاص بـ <span style="font-family:courier new,courier,monospace;">if</span> باستخدام <span style="font-family:courier new,courier,monospace;">switch:</span>
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_7063_67">
<span class="kwd">char</span><span class="pln"> grade </span><span class="pun">=</span><span class="pln"> </span><span class="pun">‘</span><span class="pln">B</span><span class="pun">’;</span><span class="pln">
</span><span class="typ">String</span><span class="pln"> result</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">switch</span><span class="pun">(</span><span class="pln">grade</span><span class="pun">){</span><span class="pln">
  </span><span class="kwd">case</span><span class="pln"> </span><span class="pun">‘</span><span class="pln">A</span><span class="pun">’:</span><span class="pln">
  result </span><span class="pun">=</span><span class="pln"> </span><span class="pun">“</span><span class="typ">Excellent</span><span class="pun">”;</span><span class="pln">
  </span><span class="kwd">break</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">case</span><span class="pln"> </span><span class="pun">‘</span><span class="pln">B</span><span class="pun">’:</span><span class="pln">
  result </span><span class="pun">=</span><span class="pln"> </span><span class="pun">“</span><span class="typ">Very</span><span class="pln"> good</span><span class="pun">”;</span><span class="pln">
  </span><span class="kwd">break</span><span class="pun">;</span><span class="pln">
  
</span><span class="kwd">case</span><span class="pln"> </span><span class="pun">‘</span><span class="pln">C</span><span class="pun">’:</span><span class="pln">
  result </span><span class="pun">=</span><span class="pln"> </span><span class="pun">“</span><span class="pln">good</span><span class="pun">”;</span><span class="pln">
  </span><span class="kwd">break</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">case</span><span class="pln"> </span><span class="pun">‘</span><span class="pln">D</span><span class="pun">’:</span><span class="pln">
  result </span><span class="pun">=</span><span class="pln"> </span><span class="pun">“</span><span class="pln">passed</span><span class="pun">”;</span><span class="pln">
  </span><span class="kwd">break</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">default</span><span class="pun">:</span><span class="pln">
  result </span><span class="pun">=</span><span class="pln"> </span><span class="pun">“</span><span class="pln">failed</span><span class="pun">”;</span><span class="pln">
  </span><span class="kwd">break</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<h3 dir="rtl">
	ملاحظات
</h3>

<ol dir="rtl">
<li>
		يتم كتابة اسم المتغير فقط بين الأقواس الخاصة بـ <span style="font-family:courier new,courier,monospace;">switch</span> ولا يتم تحديد شرط معين.
	</li>
	<li>
		تكتب كلمة <span style="font-family:courier new,courier,monospace;">case</span> وتتبعها قيمة المتغير عند هذه الحالة حتى يتم تنفيذ الأوامر الخاصة بهذه الحالة إذا تساوت قيمة المتغير الخاص بـ <span style="font-family:courier new,courier,monospace;">switch</span> مع القيمة الخاصة بـ <span style="font-family:courier new,courier,monospace;">case</span> (في المثال السابق كان المتغير من النوع <span style="font-family:courier new,courier,monospace;">char</span> لذا تم وضع القيم الخاصة بـ <span style="font-family:courier new,courier,monospace;">case</span> بين علامتيّ التنصيص المفردة).
	</li>
	<li>
		في آخر كل حالة يتم وضع الأمر <span style="font-family:courier new,courier,monospace;">break</span> وهو أمر للخروج من الجملة <span style="font-family:courier new,courier,monospace;">switch</span>، وإذا لم يتم وضعه سيتم تنفيذ باقي الحالات المتواجدة داخل الجملة <span style="font-family:courier new,courier,monospace;">switch</span> حتى نصل إلى الأمر <span style="font-family:courier new,courier,monospace;">break</span> أو تنتهي الجملة <span style="font-family:courier new,courier,monospace;">switch</span>.
	</li>
	<li>
		يتم تنفيذ الحالة <span style="font-family:courier new,courier,monospace;">default</span> عندما يكون قيمة المتغير الخاص بـ <span style="font-family:courier new,courier,monospace;">switch</span> لا يوجد لها حالة خاصة بها.
	</li>
	<li>
		جملة <span style="font-family:courier new,courier,monospace;">switch</span> تتعامل مع المتغيرات من النوع <span style="font-family:courier new,courier,monospace;">int</span> أو <span style="font-family:courier new,courier,monospace;">char</span> أو <span style="font-family:courier new,courier,monospace;">String</span> فقط.
	</li>
</ol>
<h2 dir="rtl">
	الجمل الشرطية التكرارية
</h2>

<p dir="rtl">
	الجمل الشرطية التكرارية هي جمل تقوم بتنفيذ أوامر عدة مرات في حال كان الشرط صحيحًا، وتتشابه مع الجمل الشرطية في تركيبها وتختلف معها في عدد مرات تنفيذ الأمر.
</p>

<p dir="rtl">
	تمتلك لغة جافا عدة أنواع من الجمل التكرارية مثل <span style="font-family:courier new,courier,monospace;">while</span> و<span style="font-family:courier new,courier,monospace;"> do While </span>و <span style="font-family:courier new,courier,monospace;">for</span>.
</p>

<h3 dir="rtl">
	الجملة while
</h3>

<p dir="rtl">
	وتتشابه تركيبة هذه الجملة مع الجملة <span style="font-family:courier new,courier,monospace;">if</span> كالتالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_7063_69">
<span class="kwd">while</span><span class="pln"> </span><span class="pun">(</span><span class="typ">Condition</span><span class="pun">){</span><span class="pln">

</span><span class="com">//Do some Actions here</span><span class="pln">

</span><span class="pun">}</span></pre>

<p dir="rtl">
	ويتم تنفيذ الأوامر داخل الجملة <span style="font-family:courier new,courier,monospace;">while</span> طالما الشرط متحقق ويتم التوقف عندما يصبح الشرط خاطئًا، مثال على ذلك:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_7063_71">
<span class="kwd">int</span><span class="pln"> i </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">int</span><span class="pln"> sum </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">while</span><span class="pun">(</span><span class="pln"> i </span><span class="pun">&lt;</span><span class="pln"> </span><span class="lit">5</span><span class="pln"> </span><span class="pun">){</span><span class="pln">
  sum </span><span class="pun">=</span><span class="pln"> sum </span><span class="pun">+</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln">
  i</span><span class="pun">++;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p dir="rtl">
	في هذا المثال يكون الشرط صحيحًا فيتم تنفيذ الجمل داخل <span style="font-family:courier new,courier,monospace;">while</span> ثم يتم التحقق من الشرط مرة أخرى ويكون صحيحًا وهكذا حتى يصبح الشرط خاطئًا ويُلاحظ أن الشرط لن يتحقق في حالة <span style="font-family:courier new,courier,monospace;">i </span>تساوي 5 وعند الخروج من الجملة التكرارية تكون القيمة 5 مخزنة داخل المتغير <span style="font-family:courier new,courier,monospace;">sum</span>.
</p>

<h3 dir="rtl">
	الجملة for
</h3>

<p dir="rtl">
	وتختلف طريقة كتابة هذه الجملة عن الجملة <span style="font-family:courier new,courier,monospace;">while</span>.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_7063_73">
<span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="pln">initialization </span><span class="pun">;</span><span class="pln"> condition </span><span class="pun">;</span><span class="pln"> update</span><span class="pun">){</span><span class="pln">

</span><span class="com">// Do Some Actions here</span><span class="pln">

</span><span class="pun">}</span></pre>

<p dir="rtl">
	داخل القوسين الخاصين بالجملة for يتم تقسيمها إلى ثلاث أقسام تفصلهم الفاصلة المنقوطة ";" وأول قسم يتم به تهيئة المتغير إعطائه قيمة ابتدائية، والقسم الثاني الشرط المعتاد، والقسم الأخير خاص بتحديث الشرط.
</p>

<p dir="rtl">
	فمثلًا لاستخدام <span style="font-family:courier new,courier,monospace;">for</span> في المثال السابق الخاص بـ <span style="font-family:courier new,courier,monospace;">while:</span>
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_7063_75">
<span class="kwd">int</span><span class="pln"> sum </span><span class="pun">=</span><span class="lit">0</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">for</span><span class="pun">(</span><span class="kwd">int</span><span class="pln"> i</span><span class="pun">=</span><span class="lit">0</span><span class="pun">;</span><span class="pln">i</span><span class="pun">&lt;</span><span class="lit">5</span><span class="pun">;</span><span class="pln">i</span><span class="pun">++){</span><span class="pln">
  sum </span><span class="pun">=</span><span class="pln"> sum </span><span class="pun">+</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p dir="rtl">
	ويقوم المثال السابق بنفس الوظيفة و ُلاحظ أنه تم دمج الجمل الثلاث التي كانت قبل جملة <span style="font-family:courier new,courier,monospace;">while</span> والشرط الخاص بـ <span style="font-family:courier new,courier,monospace;">while</span> والتحديث للشرط داخل جملة <span style="font-family:courier new,courier,monospace;">while</span> في سطر واحد داخل الأقواس الخاصة بـ <span style="font-family:courier new,courier,monospace;">for</span>.
</p>

<p dir="rtl">
	وتُستخدم الجمل التكرارية لتكرار تنفيذ أوامر محددة لحين غياب شرط معين يتم تحديده مسبقًا.
</p>

<p dir="rtl">
	سنواصل في الدرس القادم <a href="https://academy.hsoub.com/programming/android/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D9%84%D8%BA%D8%A9-%D8%AC%D8%A7%D9%81%D8%A7-%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D8%AA%D8%B7%D8%A8%D9%8A%D9%82%D8%A7%D8%AA-%D8%A3%D9%86%D8%AF%D8%B1%D9%88%D9%8A%D8%AF-%E2%80%93-%D8%A7%D9%84%D8%AC%D8%B2%D8%A1-%D8%A7%D9%84%D8%AB%D8%A7%D9%86%D9%8A-r334/" rel="">باقي أساسيات جافا التي تحتاج أن تعرفها قبل أن تشرع في برمجة تطبيقات أندرويد</a>.
</p>
]]></description><guid isPermaLink="false">310</guid><pubDate>Tue, 17 May 2016 08:51:00 +0000</pubDate></item><item><title>&#x648;&#x627;&#x62C;&#x647;&#x629; &#x627;&#x644;&#x645;&#x633;&#x62A;&#x62E;&#x62F;&#x645; &#x641;&#x64A; &#x623;&#x646;&#x62F;&#x631;&#x648;&#x64A;&#x62F; &#x648;&#x623;&#x633;&#x627;&#x633;&#x64A;&#x627;&#x62A; &#x627;&#x644;&#x62A;&#x639;&#x627;&#x645;&#x644; &#x645;&#x639; &#x639;&#x646;&#x627;&#x635;&#x631;&#x647;&#x627; &#x627;&#x644;&#x645;&#x62E;&#x62A;&#x644;&#x641;&#x629;</title><link>https://academy.hsoub.com/programming/android/%D9%88%D8%A7%D8%AC%D9%87%D8%A9-%D8%A7%D9%84%D9%85%D8%B3%D8%AA%D8%AE%D8%AF%D9%85-%D9%81%D9%8A-%D8%A3%D9%86%D8%AF%D8%B1%D9%88%D9%8A%D8%AF-%D9%88%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D8%A7%D9%84%D8%AA%D8%B9%D8%A7%D9%85%D9%84-%D9%85%D8%B9-%D8%B9%D9%86%D8%A7%D8%B5%D8%B1%D9%87%D8%A7-%D8%A7%D9%84%D9%85%D8%AE%D8%AA%D9%84%D9%81%D8%A9-r302/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2016_03/android-interface.png.5b4b26b7f99743d48c08e0308ca6b5d5.png" /></p>

<p dir="rtl">
	بعد أن <a href="https://academy.hsoub.com/programming/android-programming/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D8%AA%D8%B7%D8%A8%D9%8A%D9%82%D8%A7%D8%AA-%D8%A3%D9%86%D8%AF%D8%B1%D9%88%D9%8A%D8%AF-r300/" rel="">أنشأنا أول مشروع في Android Studio وقمنا بتجربة التطبيق على المحاكي</a> سنتعلم الآن أساسيات التعامل مع واجهة المستخدم وكيفية إنشاء العناصر المختلفة بداخلها.
</p>

<p dir="rtl" style="text-align: center;">
	<img alt="android-interface.png" class="ipsImage ipsImage_thumbnailed" data-fileid="14524" data-unique="lcgu88ndj" src="https://academy.hsoub.com/uploads/monthly_2016_03/android-interface.png.5866de885df6b3d3f6016ad5f9920652.png"></p>

<h2 dir="rtl">
	طرق إنشاء واجهة المستخدم لتطبيق أندرويد
</h2>

<p dir="rtl">
	في نظام تشغيل أندرويد هناك طريقتان لإنشاء واجهة المستخدم الخاصة بالتطبيق:
</p>

<ol dir="rtl">
<li>
		التعريف في الملف الخاص بها layout باستخدام لغة XML: وتتميز هذه الطريقة بأنها تقوم بفصل عناصر الواجهة عن الشيفرات البرمجية بلغة الجافا والتي تحدد وظيفة التطبيق الأصلية مما يُسهل عملية تطوير التطبيقات واكتشاف الأخطاء وتصحيحها وتجعل التطبيق أكثر مرونة لدعم أحجام الشاشات المختلفة واللغات المختلفة.
	</li>
	<li>
		تعريف عناصر واجهة المستخدم باستخدام الشيفرات البرمجية بلغة الجافا حيث تتكون الواجهة وقت تشغيل التطبيق وعمله لدى المستخدم.
	</li>
</ol>
<p dir="rtl">
	كما يمكنك استخدام هاتين الطريقتين معًا عن طريق تعريف العناصر في ملف layout وباستخدام الشيفرة البرمجية تقوم بتغيير خصائصها بناءً على تفاعل المستخدم مع هذه العناصر، وتلك هي الطريقة التي سنقوم باستخدامها.
</p>

<h2 dir="rtl">
	عناصر واجهة المستخدم
</h2>

<p dir="rtl">
	تنقسم عناصر واجهة المستخدم إلى نوعين View و ViewGroup:
</p>

<ul dir="rtl">
<li>
		<strong>View</strong> هو عنصر يقوم برسم شيء ما على الشاشة حيث يستطيع المستخدم التفاعل مع هذا الشيء.
	</li>
	<li>
		<strong>ViewGroup</strong> هو حاوية غير مرئية تستطيع أن تحمل بداخلها العناصر المكوَنة للواجهة. ويتميز كل نوع من ViewGroup بطريقة فريدة ومختلفة لعرض العناصر الأخرى بداخله وتُسمى العناصر المتواجدة داخل ViewGroup بالأبناء.
	</li>
</ul>
<p dir="rtl">
	يمكن أن يحتوي عنصر ViewGroup على عناصر من النوع ViewGroup أيضًا أو من النوع View وذلك للوصول إلى التصميم المنشود لواجهة المستخدم كما توضح الصورة التالية:
</p>

<p dir="rtl" style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="14512" href="https://academy.hsoub.com/uploads/monthly_2016_03/img1.png.9f14cbdaf07a5eb4fa1341ce7558a38b.png" rel=""><img alt="img1.png" class="ipsImage ipsImage_thumbnailed" data-fileid="14512" data-unique="txidswghv" src="https://academy.hsoub.com/uploads/monthly_2016_03/img1.thumb.png.74b561a2e578fc6213d9a5d1e3c10556.png"></a>
</p>

<p dir="rtl" style="text-align: center;">
	<strong>يوفر أندرويد للمطورين مجموعة من Views و ViewGroup الجاهزة والتي تقوم بالوظائف الشائعة في التطبيقات.</strong>
</p>

<h3 dir="rtl">
	أمثلة على ViewGroup
</h3>

<ul dir="rtl">
<li>
		<strong>Linear Layout</strong>: ويتم ترتيب العناصر بداخله في اتجاه واحد إما بشكل أفقي أو رأسي.
	</li>
	<li>
		<strong>Relative Layout</strong>: ويتم ترتيب العناصر بداخله نسبة إلى عنصر أخر ويتم استخدامه عند صنع واجهة أكثر تعقيدا يصعُب معها استخدام Linear Layout.
	</li>
</ul>
<h3 dir="rtl">
	أمثلة على View
</h3>

<ul dir="rtl">
<li>
		Button
	</li>
	<li>
		TextView
	</li>
	<li>
		ImageView
	</li>
</ul>
<h2 dir="rtl">
	أساسيات تصميم الواجهات باستخدام XML
</h2>

<p dir="rtl">
	توفر لغة XML طريقة سهلة وسريعة لصنع واجهة المستخدم وتتشابه مع طريقة صناعة صفحات الويب باستخدام HTML.
</p>

<p dir="rtl">
	كما ذكرنا سابقًا تتواجد الملفات الخاصة بالواجهة في مجلد <span style="font-family:courier new,courier,monospace;">res/layout</span> بامتداد XML.
</p>

<p dir="rtl">
	يجب أن تحتوي ملفات XML على عنصر يسمى root ويعتبر هذا العنصر الحاوية الرئيسية لباقي العناصر ويكون هذا العنصر إما ViewGroup أوView، كما يجب أن يحتوي على XML namespace وهو من المعايير القياسية الخاصة بـ XML. تعريف الـ namespace بسيط وثابت لكل الـ root elements ويكون على النحو التالي
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4026_9">
<span class="pln">xmlns:android="http://schemas.android.com/apk/res/android"</span></pre>

<p dir="rtl">
	وبعد تعريف الـ root element يمكنك بعدها إضافة عناصر أخرى لاستكمال واجهة المستخدم. وفي أغلب التطبيقات يكون الـ root من النوع ViewGroup لقدرته على إضافة أبناء له، على عكس View والذي لا يمكن أن يحتوي على أبناء.
</p>

<p dir="rtl">
	يتكون كل عنصر من عناصر XML من وسم الفتح <span style="font-family:courier new,courier,monospace;">&lt;ElementName&gt;</span>، ووسم الغلق <span style="font-family:courier new,courier,monospace;">&lt;ElementName/&gt;</span>. وبين وسم الفتح والغلق يتم وضع العناصر الأخرى والتي تعتبر أبناء ViewGroup، وبما أنه لا يوجد للعنصر View لأبناء فيمكن الاستغناء فيه عن وسم الغلق واستخدام وسم الغلق الذاتي <span style="font-family:courier new,courier,monospace;">&lt;/ElementName&gt;</span>.
</p>

<p dir="rtl">
	لتوضيح الأمر أكثر سنقوم بصنع واجهة مستخدم مشابهة لتطبيق أهلًا بالعالم Hello World.
</p>

<ul>
<li>
		قم بفتح الملف <span style="font-family:courier new,courier,monospace;">content_main.xml</span> المتواجد بداخل المجلد <span style="font-family:courier new,courier,monospace;">res/layou</span>t، ثم قم بمسح كافة الشيفرة المكتوبة.
	</li>
	<li>
		بعد عنصر root الخاص بالواجهة أضف عنصر ViewGroup من نوع LinearLayout كالتالي:
	</li>
</ul>
<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4026_25">
<span class="tag">&lt;LinearLayout&gt;</span></pre>

<ul>
<li>
		قم بتحديد XML namespace الخاص بالعنصر LinearLayout:
	</li>
</ul>
<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4026_27">
<span class="tag">&lt;LinearLayout</span><span class="pln">
</span><span class="atn">xmlns:android</span><span class="pun">=</span><span class="atv">http://schemas.android.com/apk/res/android</span><span class="pln">
</span><span class="tag">&gt;</span></pre>

<p>
	لكل عنصر من عناصر واجهة المستخدم سواء كان View أو ViewGroup العديد من الخصائص والتي يمكن التحكم بها وتخصيصها عن طريق XML أو عن طريق شيفرة الجافا وقد تكون هذه الخصائص خاصة بهذا العنصر فقط أو خصائص مشتركة لدى أكثر من عنصر.
</p>

<p dir="rtl">
	ومن الخصائص الهامة تحديد العرض والارتفاع الخاصين بالعنصر، ولتحديد العرض للعنصر نستخدم الخاصية <span style="font-family:courier new,courier,monospace;">layout_width</span>:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4026_19">
<span class="pln">android:layout_width="Value"</span></pre>

<p dir="rtl">
	ونستبدل Value بقيمة العرض، وهناك عدة طرق لتحديد قيمة العرض، فيمكن تحديدها عن طريق قيم معرَفة مسبقًا للنظام مثل "<span style="font-family:courier new,courier,monospace;">match_parent</span>" وتعني أن يكون عرض العنصر نفس عرض العنصر الأب، وإذا كان العنصر الأب هو root فالأب هنا المقصود به شاشة الهاتف.
</p>

<p dir="rtl">
	وباستخدام نفس الطريقة يتم تحديد الارتفاع الخاص بالعنصر عن طريق خاصية <span style="font-family:courier new,courier,monospace;">layout_height</span>:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4026_21">
<span class="pln">android:layout_height ="Value"</span></pre>

<p dir="rtl">
	ليصبح الشكل النهائي للعنصر:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4026_23">
<span class="tag">&lt;LinearLayout</span><span class="pln">
</span><span class="atn">xmlns:android</span><span class="pun">=</span><span class="atv">"http://schemas.android.com/apk/res/android"</span><span class="pln">
</span><span class="atn">android:layout_width</span><span class="pun">=</span><span class="atv">"match_parent"</span><span class="pln">
</span><span class="atn">android:layout_height</span><span class="pun">=</span><span class="atv">"match_parent"</span><span class="tag">&gt;</span><span class="pln">

</span><span class="tag">&lt;/LinearLayout&gt;</span></pre>

<p dir="rtl">
	لاحظ أنه يتم تحديد كافة الخصائص الخاصة بالعنصر داخل وسم الفتح ويتم أيضًا وضع XML namespace معهم.
</p>

<ul dir="rtl">
<li>
		سنقوم بإضافة عنصر أخر للواجهة من نوع View وهو <span style="font-family:courier new,courier,monospace;">TextView</span> والذي يستطيع أن يحمل بداخله نصًا ويمكن للمستخدم قراءته ولا يمكنه تغييره:
	</li>
</ul>
<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4026_29">
<span class="tag">&lt;TextView</span><span class="pln"> </span><span class="tag">/&gt;</span></pre>

<ul dir="rtl">
<li>
		سنقوم بتحديد الخصائص الخاصة بهذا العنصر وكما ذكرنا أن خاصتيَ العرض والارتفاع من الخصائص الهامة التي ينبغي تحديدها لكافة العناصر.
	</li>
</ul>
<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4026_31">
<span class="tag">&lt;TextView</span><span class="pln">
</span><span class="atn">android:layout_width</span><span class="pun">=</span><span class="atv">"wrap_content"</span><span class="pln">
</span><span class="atn">android:layout_height</span><span class="pun">=</span><span class="atv">"wrap_content"</span><span class="pln"> </span><span class="tag">/&gt;</span></pre>

<p dir="rtl">
	كان من الممكن استخدام قيمة "<span style="font-family:courier new,courier,monospace;">match_parent</span>" ولكننا قمنا باستخدام "<span style="font-family:courier new,courier,monospace;">wrap_content</span>" والتي تعني أن يكون العرض أو الارتفاع يشغل القدر المطلوب للنص فقط، أما إذا استخدمنا "<span style="font-family:courier new,courier,monospace;">match_parent</span>" فسيشغل العنصر كل المساحة الخاصة بالأب والذي هو LinearLayout والذي يشغل مساحة الشاشة كلها كما حددنا ذلك سابقًا.
</p>

<ul dir="rtl">
<li>
		لتحديد النص المطلوب كتابته داخل العنصر، نقوم بإضافة السطر التالي:
	</li>
</ul>
<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4026_33">
<span class="pln">android:text="Hello World!"</span></pre>

<ul dir="rtl">
<li>
		هذا هو الشكل الكلي لملف XML:
	</li>
</ul>
<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4026_35">
<span class="tag">&lt;LinearLayout</span><span class="pln">
</span><span class="atn">xmlns:android</span><span class="pun">=</span><span class="atv">"http://schemas.android.com/apk/res/android"</span><span class="pln">
</span><span class="atn">android:layout_width</span><span class="pun">=</span><span class="atv">"match_parent"</span><span class="pln">
</span><span class="atn">android:layout_height</span><span class="pun">=</span><span class="atv">"match_parent"</span><span class="tag">&gt;</span><span class="pln">

  </span><span class="tag">&lt;TextView</span><span class="pln">
  </span><span class="atn">android:layout_width</span><span class="pun">=</span><span class="atv">"wrap_content"</span><span class="pln">
  </span><span class="atn">android:layout_height</span><span class="pun">=</span><span class="atv">"wrap_content"</span><span class="pln">
  </span><span class="atn">android:text</span><span class="pun">=</span><span class="atv">"Hello World!"</span><span class="pln"> </span><span class="tag">/&gt;</span><span class="pln">
</span><span class="tag">&lt;/LinearLayout&gt;</span></pre>

<p dir="rtl">
	الآن قم بتشغيل التطبيق على المحاكي وستجده يعمل بالشكل المطلوب.
</p>

<p dir="rtl" style="text-align: center;">
	<img alt="img2.png" class="ipsImage ipsImage_thumbnailed" data-fileid="14513" data-unique="we3ee6ps8" src="https://academy.hsoub.com/uploads/monthly_2016_03/img2.png.e04279c658e51bd715c409106fdd3d32.png"></p>

<h3 dir="rtl">
	ملاحظات
</h3>

<ol dir="rtl">
<li>
		العنصر <span style="font-family:courier new,courier,monospace;">TextView</span> متواجد بين وسميَ الفتح والغلق الخاصين بـ <span style="font-family:courier new,courier,monospace;">LinearLayout</span> ويُعتبر <span style="font-family:courier new,courier,monospace;">TextView</span> ابنًا لـ <span style="font-family:courier new,courier,monospace;">LinearLayout</span>.
	</li>
	<li>
		يستخدم العنصر <span style="font-family:courier new,courier,monospace;">TextView</span> وسم الغلق الذاتي.
	</li>
	<li>
		يتم تحديد الخصائص للعنصر داخل وسم الفتح الخاص به فقط.
	</li>
</ol>
<h2 dir="rtl">
	التطبيق الثاني
</h2>

<p dir="rtl">
	سنقوم بتطوير المثال السابق واستخدام عناصر أخرى في التطبيق لصنع واجهة مثل الصورة التالية:
</p>

<p dir="rtl" style="text-align: center;">
	<img alt="img3.png" class="ipsImage ipsImage_thumbnailed" data-fileid="14514" data-unique="n4a2o9kqg" src="https://academy.hsoub.com/uploads/monthly_2016_03/img3.png.d64b117dc170049ac52c98aaa320673b.png"></p>

<p dir="rtl">
	الاختلاف هنا في إضافة عنصر جديد للواجهة وهو Button.
</p>

<ul dir="rtl">
<li>
		لإضافة هذا العنصر يتم استخدام العنصر <span style="font-family:courier new,courier,monospace;">&lt;/ Button&gt;</span> وإضافته داخل <span style="font-family:courier new,courier,monospace;">LinearLayout</span>.
	</li>
	<li>
		نقوم بتحديد الطول، الارتفاع والنص الخاص بالزر كالتالي:
	</li>
</ul>
<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4026_37">
<span class="tag">&lt;Button</span><span class="pln">
</span><span class="atn">android:layout_width</span><span class="pun">=</span><span class="atv">"wrap_content"</span><span class="pln">
</span><span class="atn">android:layout_height</span><span class="pun">=</span><span class="atv">"wrap_content"</span><span class="pln">
</span><span class="atn">android:text</span><span class="pun">=</span><span class="atv">"Click me"</span><span class="tag">/&gt;</span></pre>

<p dir="rtl">
	سيظهر الزر بجانب النص السابق:
</p>

<p dir="rtl" style="text-align: center;">
	<img alt="img4.png" class="ipsImage ipsImage_thumbnailed" data-fileid="14515" data-unique="sh5nulize" src="https://academy.hsoub.com/uploads/monthly_2016_03/img4.png.3bc5b192b48e05b09457aa89daa08de1.png"></p>

<p dir="rtl">
	ولتغيير موضع الزر يجب تغيير اتجاه العناصر داخل <span style="font-family:arial,helvetica,sans-serif;">عنصر</span> <span style="font-family:courier new,courier,monospace;">LinearLayout</span>، ولتغيير الاتجاه للرأسي بدلًا من الأفقي نستخدم الخاصية <span style="font-family:courier new,courier,monospace;">orientation</span>:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4026_39">
<span class="pln">android:orientation="vertical"</span></pre>

<p dir="rtl">
	حيث أن الاتجاه يكون أفقيًا بشكل افتراضي.
</p>

<p dir="rtl">
	ليصبح ملف XML على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4026_41">
<span class="tag">&lt;LinearLayout</span><span class="pln">
</span><span class="atn">xmlns:android</span><span class="pun">=</span><span class="atv">"http://schemas.android.com/apk/res/android"</span><span class="pln">
</span><span class="atn">android:layout_width</span><span class="pun">=</span><span class="atv">"match_parent"</span><span class="pln">
</span><span class="atn">android:layout_height</span><span class="pun">=</span><span class="atv">"match_parent"</span><span class="pln">
</span><span class="atn">android:orientation</span><span class="pun">=</span><span class="atv">"vertical"</span><span class="pln"> </span><span class="tag">&gt;</span><span class="pln">

  </span><span class="tag">&lt;TextView</span><span class="pln">
  </span><span class="atn">android:layout_width</span><span class="pun">=</span><span class="atv">"wrap_content"</span><span class="pln">
  </span><span class="atn">android:layout_height</span><span class="pun">=</span><span class="atv">"wrap_content"</span><span class="pln">
  </span><span class="atn">android:text</span><span class="pun">=</span><span class="atv">"Hello World!"</span><span class="pln"> </span><span class="tag">/&gt;</span><span class="pln">

  </span><span class="tag">&lt;Button</span><span class="pln">
  </span><span class="atn">android:layout_width</span><span class="pun">=</span><span class="atv">"wrap_content"</span><span class="pln">
  </span><span class="atn">android:layout_height</span><span class="pun">=</span><span class="atv">"wrap_content"</span><span class="pln">
  </span><span class="atn">android:text</span><span class="pun">=</span><span class="atv">"Click me"</span><span class="tag">/&gt;</span><span class="pln">
  
</span><span class="tag">&lt;/LinearLayout&gt;</span></pre>

<h3 dir="rtl">
	ملاحظات
</h3>

<ol dir="rtl">
<li>
		أي عنصر من النوع <span style="font-family:courier new,courier,monospace;">View</span> يستخدم وسم الغلق الذاتي لأنه لا يستطيع أن يحتوي على أبناء أو عناصر أخرى بداخله.
	</li>
	<li>
		إذا قمت بكتابة العنصر <span style="font-family:courier new,courier,monospace;">Button</span> أولًا بداخل <span style="font-family:courier new,courier,monospace;">LinearLayout</span> ثم العنصر <span style="font-family:courier new,courier,monospace;">TextView</span> سيتم تغيير الترتيب في الواجهة أيضًا.
	</li>
</ol>
<p style="text-align: center;">
	<img alt="img5.png" class="ipsImage ipsImage_thumbnailed" data-fileid="14516" data-unique="qo5gwh00g" src="https://academy.hsoub.com/uploads/monthly_2016_03/img5.png.e96ee6f92de71aef5be3efd671da580c.png"></p>

<h2 dir="rtl">
	التطبيق الثالث
</h2>

<p dir="rtl">
	يحتوي هذا التطبيق على نص "Android Image" وصورة للأندرويد وزر يتم ترتيبها بشكل رأسي.
</p>

<p dir="rtl" style="text-align: center;">
	<img alt="img6.png" class="ipsImage ipsImage_thumbnailed" data-fileid="14517" data-unique="vrf18e233" src="https://academy.hsoub.com/uploads/monthly_2016_03/img6.png.e266d880bf78e6b85e2996e69814073c.png"></p>

<ul>
<li>
		لصنع واجهة المستخدم سنختار <span style="font-family:courier new,courier,monospace;">LinearLayout</span> كعنصر root وتغيير الاتجاه الخاص به للرأسي.
	</li>
	<li>
		نقوم بعدها بإضافة عنصر <span style="font-family:courier new,courier,monospace;">TextView</span> وكتابة النص الخاص به، ولكن يمكن ملاحظة أن حجم الخط الخاص بالنص أكبر من الأمثلة السابقة لذا يجب تغيير حجم الخط عن طريق الخاصية <span style="font-family:courier new,courier,monospace;">textSize</span>:
	</li>
</ul>
<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_7031_7">
<span class="pln">android:textSize="40sp"</span></pre>

<p dir="rtl">
	ويتم تحديد الخط بوحدة "sp" وهي وحدة خاصة في نظام أندرويد لتحديد حجم الخط دون الاعتماد على كثافة البكسل المكوَنة للشاشة ليظهر النص دائمًا بنفس الحجم باختلاف أحجام شاشات الهواتف.
</p>

<ul dir="rtl">
<li>
		لتغيير موضع النص ليكون في منتصف الواجهة نقوم باستخدام خاصية الجاذبية layout_gravity:
	</li>
</ul>
<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_7031_9">
<span class="pln">android:layout_gravity="center"</span></pre>

<ul dir="rtl">
<li>
		نقوم بإضافة العنصر <span style="font-family:courier new,courier,monospace;">ImageView</span> لعرض الصور وتحديد الطول والارتفاع كالسابق، ولتحديد الصورة المعروضة بداخله نقوم بوضع الصورة في الملف <span style="font-family:courier new,courier,monospace;">res/drawable</span> وعرضها داخل العنصر باستخدام الخاصية <span style="font-family:courier new,courier,monospace;">src</span>:
	</li>
</ul>
<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_7031_12">
<span class="pln">android:src="@drawable/andimg"</span></pre>

<p dir="rtl">
	تستخدم <strong>@</strong> للإشارة إلى عنصر داخل الملف وبعدها يتم كتابة اسم الملف وهو <span style="font-family:courier new,courier,monospace;">drawable</span> ثم تحديد اسم الصورة المتواجدة بداخله.
</p>

<ul dir="rtl">
<li>
		نضيف بعدها العنصر <span style="font-family:courier new,courier,monospace;">Button</span> ونقوم بتحديد النص الخاص به مع ملاحظة أن العرض الخاص به يستغل كافة مساحة الشاشة وليس على قدر المحتوى فقط.
	</li>
</ul>
<p dir="rtl">
	ليصبح ملف XML على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_7031_14">
<span class="tag">&lt;LinearLayout</span><span class="pln">
</span><span class="atn">xmlns:android</span><span class="pun">=</span><span class="atv">"http://schemas.android.com/apk/res/android"</span><span class="pln">
</span><span class="atn">android:layout_width</span><span class="pun">=</span><span class="atv">"match_parent"</span><span class="pln">
</span><span class="atn">android:layout_height</span><span class="pun">=</span><span class="atv">"match_parent"</span><span class="pln">
</span><span class="atn">android:orientation</span><span class="pun">=</span><span class="atv">"vertical"</span><span class="tag">&gt;</span><span class="pln">

  </span><span class="tag">&lt;TextView</span><span class="pln">
  </span><span class="atn">android:layout_width</span><span class="pun">=</span><span class="atv">"wrap_content"</span><span class="pln">
  </span><span class="atn">android:layout_height</span><span class="pun">=</span><span class="atv">"wrap_content"</span><span class="pln">
  </span><span class="atn">android:text</span><span class="pun">=</span><span class="atv">"Android Image"</span><span class="pln">
  </span><span class="atn">android:textSize</span><span class="pun">=</span><span class="atv">"40sp"</span><span class="pln">
  </span><span class="atn">android:layout_gravity</span><span class="pun">=</span><span class="atv">"center"</span><span class="pln"> </span><span class="tag">/&gt;</span><span class="pln">

  </span><span class="tag">&lt;ImageView</span><span class="pln">
  </span><span class="atn">android:layout_width</span><span class="pun">=</span><span class="atv">"wrap_content"</span><span class="pln">
  </span><span class="atn">android:layout_height</span><span class="pun">=</span><span class="atv">"wrap_content"</span><span class="pln">
  </span><span class="atn">android:src</span><span class="pun">=</span><span class="atv">"@drawable/andimg"</span><span class="tag">/&gt;</span><span class="pln">

  </span><span class="tag">&lt;Button</span><span class="pln">
  </span><span class="atn">android:layout_width</span><span class="pun">=</span><span class="atv">"match_parent"</span><span class="pln">
  </span><span class="atn">android:layout_height</span><span class="pun">=</span><span class="atv">"wrap_content"</span><span class="pln">
  </span><span class="atn">android:text</span><span class="pun">=</span><span class="atv">"Say Hi"</span><span class="tag">/&gt;</span><span class="pln">

</span><span class="tag">&lt;/LinearLayout&gt;</span></pre>

<h2 dir="rtl">
	التطبيق الرابع
</h2>

<p dir="rtl">
	نريد في هذا التطبيق صُنع واجهة مركبة كما في الصورة التالية:
</p>

<p dir="rtl" style="text-align: center;">
	<img alt="img7.png" class="ipsImage ipsImage_thumbnailed" data-fileid="14518" data-unique="p19lo9hol" src="https://academy.hsoub.com/uploads/monthly_2016_03/img7.png.e6a3668a6188c1d7e01ee3d57845e494.png"></p>

<ul dir="rtl">
<li>
		سيكون الـ root مثل الأمثلة السابقة من النوع <span style="font-family:courier new,courier,monospace;">LinearLayout</span> ولكن هل اتجاه العناصر بداخله أفقي أم رأسي؟ ستجد العناصر متواجدة في الاتجاهين.
	</li>
	<li>
		لصنع هذه الواجهة سنستخدم أكثر من <span style="font-family:courier new,courier,monospace;">ViewGroup</span> من النوع <span style="font-family:courier new,courier,monospace;">LinearLayout</span> ونغير اتجاهاتها لصنع الشكل المطلوب كما في الصورة التالية:
	</li>
</ul>
<p dir="rtl" style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="14519" href="https://academy.hsoub.com/uploads/monthly_2016_03/img8.png.d6c80b6a75c228aa1db9853115fec274.png" rel=""><img alt="img8.png" class="ipsImage ipsImage_thumbnailed" data-fileid="14519" data-unique="aeokbq57d" src="https://academy.hsoub.com/uploads/monthly_2016_03/img8.thumb.png.4b40af495d2074192e5236f6101e0a28.png"></a>
</p>

<p dir="rtl">
	سيكون العنصر  root من النوع <span style="font-family:courier new,courier,monospace;">LinearLayout</span> والاتجاه بداخله رأسي، ويحتوي على <span style="font-family:courier new,courier,monospace;">LinearLayout</span> آخر الاتجاه بداخله أفقي ونضع بداخله العنصرين المتجاورين كما في الصورة السابقة.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_7031_16">
<span class="tag">&lt;LinearLayout</span><span class="pln">
</span><span class="atn">xmlns:android</span><span class="pun">=</span><span class="atv">"http://schemas.android.com/apk/res/android"</span><span class="pln">
</span><span class="atn">android:layout_width</span><span class="pun">=</span><span class="atv">"match_parent"</span><span class="pln">
</span><span class="atn">android:layout_height</span><span class="pun">=</span><span class="atv">"match_parent"</span><span class="pln">
</span><span class="atn">android:orientation</span><span class="pun">=</span><span class="atv">"vertical"</span><span class="tag">&gt;</span><span class="pln">

  </span><span class="tag">&lt;LinearLayout</span><span class="pln">
  </span><span class="atn">android:layout_width</span><span class="pun">=</span><span class="atv">"match_parent"</span><span class="pln">
  </span><span class="atn">android:layout_height</span><span class="pun">=</span><span class="atv">"wrap_content"</span><span class="pln">
  </span><span class="atn">android:orientation</span><span class="pun">=</span><span class="atv">"horizontal"</span><span class="tag">&gt;</span><span class="pln">

  </span><span class="tag">&lt;/LinearLayout&gt;</span><span class="pln">

</span><span class="tag">&lt;/LinearLayout&gt;</span></pre>

<ul dir="rtl">
<li>
		نضع العنصرين <span style="font-family:courier new,courier,monospace;">ImageView</span> و <span style="font-family:courier new,courier,monospace;">EditText</span> داخل العنصر <span style="font-family:courier new,courier,monospace;">LinearLayout</span> الثاني.
	</li>
	<li>
		نقوم بتحديد العرض والارتفاع واختيار الصورة من ملف <span style="font-family:courier new,courier,monospace;">drawable</span> للعنصر <span style="font-family:courier new,courier,monospace;">ImageView</span> مثل ما فعلنا في التطبيق السابق،
	</li>
	<li>
		وبالنسبة للعنصر الآخر <span style="font-family:courier new,courier,monospace;">EditText</span> والذي يٌستخدم لإدخال نص من المستخدم، نقوم بتحديد عرضه وارتفاعه، بالإضافة إلى عرض نص يعبر عن المحتوى الذي يجب على المستخدم إدخاله باستخدام الخاصية <span style="font-family:courier new,courier,monospace;">hint</span>:
	</li>
</ul>
<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_7031_20">
<span class="pln">android:hint="Write your name here"</span></pre>

<ul dir="rtl">
<li>
		نُضيف العنصر الأخير من النوع <span style="font-family:courier new,courier,monospace;">Button</span> داخل <span style="font-family:courier new,courier,monospace;">LinearLayout</span> الأول ولوضعه جهة اليمين نستخدم الخاصية<span style="font-family:courier new,courier,monospace;"> layout_gravity</span>:
	</li>
</ul>
<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_7031_22">
<span class="pln">android:layout_gravity="right"</span></pre>

<p dir="rtl">
	ليُصبح ملف XML على الشكل التالي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4026_13">
<span class="tag">&lt;LinearLayout</span><span class="pln">
</span><span class="atn">xmlns:android</span><span class="pun">=</span><span class="atv">"http://schemas.android.com/apk/res/android"</span><span class="pln">
</span><span class="atn">android:layout_width</span><span class="pun">=</span><span class="atv">"match_parent"</span><span class="pln">
</span><span class="atn">android:layout_height</span><span class="pun">=</span><span class="atv">"match_parent"</span><span class="pln">
</span><span class="atn">android:orientation</span><span class="pun">=</span><span class="atv">"vertical"</span><span class="tag">&gt;</span><span class="pln">

  </span><span class="tag">&lt;LinearLayout</span><span class="pln">
  </span><span class="atn">android:layout_width</span><span class="pun">=</span><span class="atv">"match_parent"</span><span class="pln">
  </span><span class="atn">android:layout_height</span><span class="pun">=</span><span class="atv">"wrap_content"</span><span class="pln">
  </span><span class="atn">android:orientation</span><span class="pun">=</span><span class="atv">"horizontal"</span><span class="tag">&gt;</span><span class="pln">

    </span><span class="tag">&lt;ImageView</span><span class="pln">
    </span><span class="atn">android:layout_width</span><span class="pun">=</span><span class="atv">"wrap_content"</span><span class="pln">
    </span><span class="atn">android:layout_height</span><span class="pun">=</span><span class="atv">"wrap_content"</span><span class="pln">
    </span><span class="atn">android:src</span><span class="pun">=</span><span class="atv">"@drawable/ic_launcher"</span><span class="tag">/&gt;</span><span class="pln">

    </span><span class="tag">&lt;EditText</span><span class="pln">
    </span><span class="atn">android:layout_width</span><span class="pun">=</span><span class="atv">"match_parent"</span><span class="pln">
    </span><span class="atn">android:layout_height</span><span class="pun">=</span><span class="atv">"wrap_content"</span><span class="pln">
    </span><span class="atn">android:hint</span><span class="pun">=</span><span class="atv">"Write your name here"</span><span class="tag">/&gt;</span><span class="pln">
  </span><span class="tag">&lt;/LinearLayout&gt;</span><span class="pln">

  </span><span class="tag">&lt;Button</span><span class="pln">
  </span><span class="atn">android:layout_width</span><span class="pun">=</span><span class="atv">"wrap_content"</span><span class="pln">
  </span><span class="atn">android:layout_height</span><span class="pun">=</span><span class="atv">"70dp"</span><span class="pln">
  </span><span class="atn">android:text</span><span class="pun">=</span><span class="atv">"Done"</span><span class="pln">
  </span><span class="atn">android:layout_gravity</span><span class="pun">=</span><span class="atv">"right"</span><span class="tag">/&gt;</span><span class="pln">
  
</span><span class="tag">&lt;/LinearLayout&gt;</span></pre>

<h3 dir="rtl">
	ملاحظات
</h3>

<ol dir="rtl">
<li>
		تم تحديد الارتفاع الخاص بـ <span style="font-family:courier new,courier,monospace;">LinearLayout</span> الثاني بـ "<span style="font-family:courier new,courier,monospace;">wrap_content</span>" حتى يشغل الارتفاع الخاص بالعناصر فقط ولا يشغل مساحة الشاشة كلها.
	</li>
	<li>
		تم استخدام طريقة مختلفة لتحديد الارتفاع الخاص بـالعنصر <span style="font-family:courier new,courier,monospace;">Button</span>، وتستخدم هذه الطريقة في حالة لم نرد استخدام القيم المعرَفة داخل النظام مثل "match_parent" أو "wrap_content" واستخدام قيم مختلفة. وتُستخدم الوحدة "dp" كوحدة لتحديد الأبعاد دون الاعتماد على كثافة البكسل المكوَنة للشاشة ليظهر العنصر بنفس الأبعاد دائمًا باختلاف أحجام شاشات الهواتف.
	</li>
</ol>
<h2 dir="rtl">
	التطبيق الخامس
</h2>

<p>
	هناك طريقة أخرى لإنشاء واجهة المستخدم كما في التطبيق السابق، حيث نقوم باختيار root من النوع <span style="font-family:courier new,courier,monospace;">RelativeLayout</span> للوصول لنفس الشكل أيضًا كما في الصورة السابقة.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="14520" href="https://academy.hsoub.com/uploads/monthly_2016_03/img9.png.8fdcc83497e3b0146ee16f1478d32d7e.png" rel=""><img alt="img9.png" class="ipsImage ipsImage_thumbnailed" data-fileid="14520" data-unique="9lqrh3xsl" src="https://academy.hsoub.com/uploads/monthly_2016_03/img9.thumb.png.cd529013f6a4d83b8c8881e14fa27bb7.png"></a>
</p>

<p dir="rtl">
	في <span style="font-family:courier new,courier,monospace;">RelativeLayout</span> يتم وضع العناصر نسبة إلى عناصر أخرى متواجدة لذلك ينبغي تحديد لكل عنصر ID مميز له لأن عند وضع عنصرين من نفس النوع (<span style="font-family:courier new,courier,monospace;">Button</span> مثلا) سيكون اسم كل منهما <span style="font-family:courier new,courier,monospace;">Button</span> ولا نستطيع عندها التفريق بين الزر الأول أو الثاني وللتفرقة بينهم يتم استخدام خاصية <span style="font-family:courier new,courier,monospace;">id</span>:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_7031_24">
<span class="pln">android:id="@+id/btn1"</span></pre>

<p dir="rtl">
	ويتم كتابة ID الخاص بالعنصر بعد كلمة <strong>/id+@</strong> ويكون هذا ID مميز لهذا العنصر فقط ولا يتشابه معه عنصر آخر.
</p>

<p dir="rtl">
	وهناك استخدام آخر لـ ID عند التحكم في العناصر باستخدام شيفرة الجافا.
</p>

<p dir="rtl">
	وبهذا يصبح ملف XML على الشكل التالي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_7031_18">
<span class="tag">&lt;RelativeLayout</span><span class="pln">
</span><span class="atn">xmlns:android</span><span class="pun">=</span><span class="atv">"http://schemas.android.com/apk/res/android"</span><span class="pln">
</span><span class="atn">android:layout_width</span><span class="pun">=</span><span class="atv">"match_parent"</span><span class="pln">
</span><span class="atn">android:layout_height</span><span class="pun">=</span><span class="atv">"match_parent"</span><span class="tag">&gt;</span><span class="pln">

  </span><span class="tag">&lt;ImageView</span><span class="pln">
  </span><span class="atn">android:layout_width</span><span class="pun">=</span><span class="atv">"wrap_content"</span><span class="pln">
  </span><span class="atn">android:layout_height</span><span class="pun">=</span><span class="atv">"wrap_content"</span><span class="pln">
  </span><span class="atn">android:src</span><span class="pun">=</span><span class="atv">"@drawable/ic_launcher"</span><span class="pln">
  </span><span class="atn">android:id</span><span class="pun">=</span><span class="atv">"@+id/img"</span><span class="pln"> </span><span class="tag">/&gt;</span><span class="pln">

  </span><span class="tag">&lt;EditText</span><span class="pln">
  </span><span class="atn">android:layout_width</span><span class="pun">=</span><span class="atv">"match_parent"</span><span class="pln">
  </span><span class="atn">android:layout_height</span><span class="pun">=</span><span class="atv">"wrap_content"</span><span class="pln">
  </span><span class="atn">android:hint</span><span class="pun">=</span><span class="atv">"Write your name here"</span><span class="pln">
  </span><span class="atn">android:id</span><span class="pun">=</span><span class="atv">"@+id/edttxt"</span><span class="pln">
  </span><span class="atn">android:layout_toRightOf</span><span class="pun">=</span><span class="atv">"@+id/img"</span><span class="pln"> </span><span class="tag">/&gt;</span><span class="pln">
  
  </span><span class="tag">&lt;Button</span><span class="pln">
  </span><span class="atn">android:layout_width</span><span class="pun">=</span><span class="atv">"wrap_content"</span><span class="pln">
  </span><span class="atn">android:layout_height</span><span class="pun">=</span><span class="atv">"70dp"</span><span class="pln">
  </span><span class="atn">android:text</span><span class="pun">=</span><span class="atv">"Done"</span><span class="pln">
  </span><span class="atn">android:id</span><span class="pun">=</span><span class="atv">"@+id/btn1"</span><span class="pln">
  </span><span class="atn">android:layout_below</span><span class="pun">=</span><span class="atv">"@+id/edttxt"</span><span class="pln">
  </span><span class="atn">android:layout_alignParentRight</span><span class="pun">=</span><span class="atv">"true"</span><span class="tag">/&gt;</span><span class="pln">
  
</span><span class="tag">&lt;/RelativeLayout&gt;</span></pre>

<p dir="rtl">
	عند تشغيل التطبيق على المحاكي سيقوم برسم نفس الشكل السابق.
</p>

<h3 dir="rtl">
	ملاحظات
</h3>

<ol dir="rtl">
<li>
		تم تحديد ID خاص لكل العناصر.
	</li>
	<li>
		هناك بعض الخصائص التي تحدد موضع كل عنصر بالنسبة لعنصر آخر.
	</li>
</ol>
<p>
	مثل الخاصية <span style="font-family:courier new,courier,monospace;">layout_toRightOf </span>المستخدمة للعنصر <span style="font-family:courier new,courier,monospace;">EditText</span> وذلك لوضعه بجانب العنصر <span style="font-family:courier new,courier,monospace;">ImageView</span> جهة اليمين:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_7031_29">
<span class="pln">android:layout_toRightOf="@+id/img"</span></pre>

<p dir="rtl">
	والخاصيتين <span style="font-family:courier new,courier,monospace;">layout_below</span> و <span style="font-family:courier new,courier,monospace;">layout_alignParentRight </span>المستخدمتين مع العنصر <span style="font-family:courier new,courier,monospace;">Button</span> وذلك لوضعه أسفل العنصر <span style="font-family:courier new,courier,monospace;">EditText</span> و بمحاذاة الشاشة من جهة اليمين:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_7031_31">
<span class="pln">android:layout_below="@+id/edttxt"
android:layout_alignParentRight="true"</span></pre>

<p dir="rtl">
	بهذا نكون قد وصلنا إلى نهاية ثاني دروسنا من سلسلة <a href="https://academy.hsoub.com/search/?tags=%D8%A3%D9%86%D8%AF%D8%B1%D9%88%D9%8A%D8%AF+%D9%84%D9%84%D9%85%D8%A8%D8%AA%D8%AF%D8%A6%D9%8A%D9%86" rel="">أندرويد للمبتدئين</a>، في انتظار تجربتكم وآرائكم.
</p>
]]></description><guid isPermaLink="false">302</guid><pubDate>Tue, 29 Mar 2016 09:19:00 +0000</pubDate></item><item><title>&#x645;&#x62F;&#x62E;&#x644; &#x625;&#x644;&#x649; &#x628;&#x631;&#x645;&#x62C;&#x629; &#x62A;&#x637;&#x628;&#x64A;&#x642;&#x627;&#x62A; &#x623;&#x646;&#x62F;&#x631;&#x648;&#x64A;&#x62F;</title><link>https://academy.hsoub.com/programming/android/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D8%AA%D8%B7%D8%A8%D9%8A%D9%82%D8%A7%D8%AA-%D8%A3%D9%86%D8%AF%D8%B1%D9%88%D9%8A%D8%AF-r300/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2016_03/android-programming-intro.png.067f345a87e30dfb53c73800be0008b0.png" /></p>
<p dir="rtl">
	Android هو نظام تشغيل مفتوح المصدر مبني على نواة لينكس مع إضافة بعض التعديلات عليها ليعمل النظام على الهواتف المحمولة والحواسيب اللوحية، وغيرهما من الأجهزة الذكية المختلفة، ويتم تطوير إصدارات النظام بواسطة شركة جوجل.
</p>

<p dir="rtl" style="text-align: center;">
	<img alt="android-programming-intro.png" class="ipsImage ipsImage_thumbnailed" data-fileid="14505" data-unique="zfn066mab" src="https://academy.hsoub.com/uploads/monthly_2016_03/android-programming-intro.png.1d0e6cf0b99fd5fa58f81a9a2e505e75.png">
</p>

<p dir="rtl" style="text-align: center;">
	 
</p>

<h2 dir="rtl">
	الطبقات الرئيسية المكونة لنظام أندرويد
</h2>

<p dir="rtl">
	الصورة التالية توضح الهيكل الداخلي للأندرويد والطبقات الرئيسية المكونة لنظام التشغيل. 
</p>

<p dir="rtl" style="text-align: center;">
	<img alt="img1 (1).png" class="ipsImage ipsImage_thumbnailed" data-fileid="14489" data-unique="1wdpkuxy7" src="https://academy.hsoub.com/uploads/monthly_2016_03/56f6fb40d4fc7_img1(1).png.45919b04a881b2d6df1dbe071afdc0d5.png">
</p>

<p dir="rtl">
	ينقسم نظام التشغيل إلى خمس طبقات وظيفتها كالآتي:
</p>

<h3 dir="rtl">
	طبقة التطبيقات Application Layer (الطبقة العلوية)
</h3>

<p dir="rtl">
	وهي الطبقة التي نتعامل معها دائمًا كمستخدمين لنظام التشغيل، فهي تحتوي على تطبيقات النظام والتطبيقات التي نقوم بتحميلها من المتجر -وهي الطبقة التي سيعمل فيها تطبيقك في آخر هذا الدرس-، أمثلة على ذلك تطبيق الاتصال وتطبيق البريد الإلكتروني وتطبيق المتصفح.
</p>

<h3 dir="rtl">
	الطبقة الخاصة ببيئة عمل التطبيقات Application Framework Layer
</h3>

<p dir="rtl">
	تحتوي تلك الطبقة على مكتبات بُنيت بلغة الجافا خصّيصًا لنظام تشغيل أندرويد وتوفر هذه المكتبات طرق الوصول إلى الموارد الخاصة بالهاتف مما يجعل تطوير التطبيقات أسهل -وهي الطبقة التي سنتعامل معها كمطوري تطبيقات للأندرويد- وأمثلة على ذلك:
</p>

<ul dir="rtl">
	<li>
		<strong>View System</strong>: وهي مكتبة تحتوي على العناصر اللازمة لإنشاء واجهة المستخدم مثل TextViews و Buttons و Checkboxes و غيرها من العناصر الخاصة بواجهة المستخدم.
	</li>
	<li>
		<strong>Notification Manager</strong>: تحتوي هذه المكتبة على العناصر اللازمة لإنشاء و إرسال الإشعارات للمستخدم الخاصة بتطبيقك.
	</li>
	<li>
		<strong>Telephony Manager</strong>: وهي المكتبة المسؤولة عن استقبال و إرسال المكالمات الهاتفية من داخل تطبيقك. 
	</li>
	<li>
		<strong>Location Manager</strong>: وهي المكتبة المسؤولة عن تحديد المواقع باستخدام GPS Sensors المتواجدة بالهاتف.
	</li>
</ul>

<p dir="rtl">
	أسفل هذه الطبقة سنجد طبقة خاصة تنقسم إلى جزئين:
</p>

<h3 dir="rtl">
	طبقة المكتبات المطورة بلغة C و ++C (المعروفة باسم Libraries Layer)
</h3>

<p dir="rtl">
	وتحتوي هذه الطبقة على مكتبات مكتوبة بلغة C لقدرة لغة C على القيام بالمهام القوية بشكل كفء دون إهدار لموارد النظام. أمثلة على ذلك:
</p>

<ul dir="rtl">
	<li>
		<strong>SQLite</strong>: تستخدم للتعامل مع قواعد البيانات.
	</li>
	<li>
		<strong>OpenGL|ES</strong>: تستخدم للتعامل مع الرسوميات ثنائية و ثلاثية الأبعاد و تستخدم بشكل أكبر مع ثلاثية الأبعاد.
	</li>
	<li>
		<strong>FreeType</strong>: تستخدم للتعامل مع أنواع الخطوط المختلفة.
	</li>
	<li>
		<strong>Media FrameWork</strong>: تستخدم للتعامل مع الصيغ المختلفة لملفات الفيديو.
	</li>
</ul>

<h3>
	Android Runtime
</h3>

<p>
	و تحتوى هذه الطبقة على مجموعة من المكتبات والتي تجعل المطور قادر على <a href="https://academy.hsoub.com/programming/general/%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D8%A7%D9%84%D8%AA%D8%B7%D8%A8%D9%8A%D9%82%D8%A7%D8%AA/" rel="">برمجة التطبيقات</a> باستخدام لغة الجافا.
</p>

<p dir="rtl">
	كما تحتوى على الآلة الافتراضية (Virtual Machine) المسؤولة عن تشغيل التطبيقات والتي تم تطويرها لكي تعمل على الهواتف المحمولة وتتميز باستهلاكها القليل للموارد من الذاكرة العشوائية والمعالج وبطارية الهاتف وتسمى بـ Dalvik Virtual machine.
</p>

<p dir="rtl">
	ويعمل كل تطبيق داخل نسخة خاصة به من الآلة الافتراضية مما يميزها بالأمان فالتطبيق لا يستطيع أن يرى باقي التطبيقات ولا يستطيع الوصول إلى بيانات من داخل الهاتف دون علم المستخدم ومنحه الصلاحيات اللازمة لذلك - تلك الصلاحيات التي يتم منحها للتطبيق عند تحميله من المتجر- لذلك ينصح بالتدقيق فيما يحتاجه التطبيق من صلاحيات وألا تقوم بتحميل تطبيقات ذات صلاحيات زائدة عن حاجة التطبيق لكي يعمل ، وصُممت الآلة الافتراضية بطريقة تجعل أكثر من نسخة من الآلة الافتراضية تعمل معًا بسلاسة وذلك لكي يصبح المستخدم قادراً على تشغيل واستخدام أكثر من تطبيق معًا دون الشعور باختلاف في الأداء.
</p>

<h3 dir="rtl">
	طبقة النواة (Kernel)
</h3>

<p dir="rtl">
	وهي الطبقة المسؤولة عن التعامل مع العتاد المختلف للهواتف فتحتوي على التعريفات الأساسية الخاصة بهذا العتاد كما توفر طريقة أبسط للطبقة العلوية للوصول لمميزات العتاد وهي نفس نواة لينكس.  
</p>

<p dir="rtl">
	تعتبر كل طبقة هي حلقة الوصل بينها وبين ما فوقها أو تحتها من طبقات، وكلما أتجهنا للأسفل كلما استُخدمت لغات وطرق أقرب في تعاملها مع العتاد كلغة C أو الأسمبلي مثلاً وكلما صعدنا للأعلى كلما استُخدمت لغات وطرق أسهل للمستخدم وتقدم خدمات غنية له كالجافا مثلاً.
</p>

<h2 dir="rtl">
	إصدارات أندرويد
</h2>

<p dir="rtl">
	قبل البدء بتطوير التطبيقات ينبغي علينا معرفة ما هي إصدارات أندرويد، سأقوم سريعًا بذكر كافة إصدارات أندرويد المختلفة ورقم الإصدار ورقم الـ <abbr title="Application Programming Interface | واجهة برمجية"><abbr title="Application Programming Interface | واجهة برمجية">API</abbr></abbr> الخاص بها.
</p>

<ul dir="rtl">
	<li>
		Cupcake 1.5 <abbr title="Application Programming Interface | واجهة برمجية"><abbr title="Application Programming Interface | واجهة برمجية">API</abbr></abbr> 3
	</li>
	<li>
		Dount 1.6 <abbr title="Application Programming Interface | واجهة برمجية"><abbr title="Application Programming Interface | واجهة برمجية">API</abbr></abbr> 4
	</li>
	<li>
		Eclair 2.0 <abbr title="Application Programming Interface | واجهة برمجية"><abbr title="Application Programming Interface | واجهة برمجية">API</abbr></abbr> 5
	</li>
	<li>
		Froyo 2.2 <abbr title="Application Programming Interface | واجهة برمجية"><abbr title="Application Programming Interface | واجهة برمجية">API</abbr></abbr> 8
	</li>
	<li>
		Gingerbread 2.3.3 <abbr title="Application Programming Interface | واجهة برمجية"><abbr title="Application Programming Interface | واجهة برمجية">API</abbr></abbr> 10
	</li>
	<li>
		Honeycomb 3.0 <abbr title="Application Programming Interface | واجهة برمجية"><abbr title="Application Programming Interface | واجهة برمجية">API</abbr></abbr> 11
	</li>
	<li>
		Ice Cream sandwich 4.0 <abbr title="Application Programming Interface | واجهة برمجية"><abbr title="Application Programming Interface | واجهة برمجية">API</abbr></abbr> 14
	</li>
	<li>
		Jellybean 4.1 <abbr title="Application Programming Interface | واجهة برمجية"><abbr title="Application Programming Interface | واجهة برمجية">API</abbr></abbr> 16
	</li>
	<li>
		Kitkat 4.4 <abbr title="Application Programming Interface | واجهة برمجية"><abbr title="Application Programming Interface | واجهة برمجية">API</abbr></abbr> 19
	</li>
	<li>
		Lollipop 5.0 <abbr title="Application Programming Interface | واجهة برمجية"><abbr title="Application Programming Interface | واجهة برمجية">API</abbr></abbr> 22
	</li>
	<li>
		Marshmallow 6.0 <abbr title="Application Programming Interface | واجهة برمجية"><abbr title="Application Programming Interface | واجهة برمجية">API</abbr></abbr> 23
	</li>
</ul>

<p dir="rtl">
	بعد أن تعرفنا على إصدارات أندرويد تبقى علينا معرفة عدد مستخدمي كل إصدار منهم لأنه ليس بالضرورة أن يكون أحدث إصدار هو الأفضل لتطوير التطبيقات من أجله، فعدد المستخدمين لهذا الإصدار أحد العوامل المحددة لذلك.
</p>

<p dir="rtl">
	تقوم جوجل شهرياً بنشر إحصائيات عن عدد مستخدمي كل إصدار من إصدارات أندرويد ويمكنك معرفتها عن طريق <a href="http://developer.android.com/about/dashboards/index.html" rel="external nofollow" target="_top">الرسم البياني</a> التالي. 
</p>

<p dir="rtl" style="text-align: center;">
	<img alt="img2 (1).png" class="ipsImage ipsImage_thumbnailed" data-fileid="14490" data-unique="5f4swdyu5" src="https://academy.hsoub.com/uploads/monthly_2016_03/56f6fb4181425_img2(1).png.6fcbb376c0232c8531bd9df26ec71b22.png">
</p>

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

<h2 dir="rtl">
	المتطلبات للبدء ببرمجة تطبيقات أندرويد
</h2>

<p dir="rtl">
	كل ما تحتاجه هو حاسوب يعمل بأي نظام من أنظمة التشغيل الرئيسية -ويندوز أو لينكس أو ماك- لتبدأ معنا هذه الدروس.
</p>

<p dir="rtl">
	لا يوجد حاجة لمعرفة سابقة بلغة برمجة فسنتعلم معاً ما نحتاج إليه.
</p>

<p dir="rtl">
	هذه الدروس موجهة بشكل أساسي للمبتدئين.
</p>

<p dir="rtl">
	البرامج التي سنعمل عليها خلال الدروس القادمة:
</p>

<ol dir="rtl">
	<li>
		<a href="http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html" rel="external nofollow" target="_top">JDK</a>
	</li>
	<li>
		<a href="http://developer.android.com/sdk/index.html" rel="external nofollow" target="_top">Android Studio</a>
	</li>
</ol>

<p dir="rtl">
	قم بتحميل هذه البرامج وبتثبيتها على جهازك.
</p>

<p dir="rtl">
	<strong>ملاحظة</strong>: ينبغي تثبيت JDK أولاً قبل البدء في تثبيت Android Studio حيث أنه يحتاج إليه عند التثبيت.
</p>

<h2 dir="rtl">
	إنشاء مشروع جديد
</h2>

<p dir="rtl">
	<span style="line-height: 2em; color: rgb(39, 42, 52); font-size: 14px;">الآن بعد الانتهاء من تثبيت البرامج اللازمة لتطوير تطبيقات أندرويد دعنا نُنشئ مشروعنا الأول وهو مشروع "أهلاً بالعالم Hello World".</span>
</p>

<ol>
	<li>
		<p dir="rtl">
			قم بفتح برنامج Android Studio واختر <strong>Start a new android studio project</strong> من القائمة.
		</p>
	</li>
</ol>

<p dir="rtl" style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="14491" href="https://academy.hsoub.com/uploads/monthly_2016_03/img3.png.a9eb4ccad379e454ae0b72bb60b6d5d2.png" rel="" data-fileext="png"><img alt="img3.png" class="ipsImage ipsImage_thumbnailed" data-fileid="14491" data-unique="2llmkmz5i" src="https://academy.hsoub.com/uploads/monthly_2016_03/img3.thumb.png.4b3559bd60836158435ea21849189ed6.png"></a>
</p>

<ol start="2">
	<li>
		<p dir="rtl">
			قم باختيار اسم التطبيق الخاص بك ثم اكتب نطاق موقعك – إن وجد – أو قم بكتابة الاسم كما هو موجود في الصورة وسيتم شرح فائدة هذا الاسم لاحقاً.
		</p>
	</li>
</ol>

<p dir="rtl" style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="14492" href="https://academy.hsoub.com/uploads/monthly_2016_03/img4.png.36611308c23c72b39ecae2d8ab42dc7e.png" rel="" data-fileext="png"><img alt="img4.png" class="ipsImage ipsImage_thumbnailed" data-fileid="14492" data-unique="jb06qh1he" src="https://academy.hsoub.com/uploads/monthly_2016_03/img4.thumb.png.0587cf4da9b248d0af180c148e191517.png"></a>
</p>

<ol start="3">
	<li>
		<p dir="rtl">
			اختر تطوير التطبيق من أجل Phone and Tablet ثم اختر إصدار Jellybean كإصدار أدنى كما ذكرنا سابقًا.
		</p>
	</li>
</ol>

<p dir="rtl" style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="14493" href="https://academy.hsoub.com/uploads/monthly_2016_03/img5.png.1e8b757f403d10bd6f9f24c220cf05e7.png" rel="" data-fileext="png"><img alt="img5.png" class="ipsImage ipsImage_thumbnailed" data-fileid="14493" data-unique="qpgoo5u50" src="https://academy.hsoub.com/uploads/monthly_2016_03/img5.thumb.png.94c7566194526014ee35bbf293cf4c84.png"></a>
</p>

<ol start="4">
	<li>
		<p dir="rtl">
			اختر Blank Activity ثم أضغط Next.
		</p>
	</li>
</ol>

<p dir="rtl" style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="14494" href="https://academy.hsoub.com/uploads/monthly_2016_03/img6.png.cdfbbf8a5a3e843f8c53419d2b7a50ed.png" rel="" data-fileext="png"><img alt="img6.png" class="ipsImage ipsImage_thumbnailed" data-fileid="14494" data-unique="ke1fqxwmm" src="https://academy.hsoub.com/uploads/monthly_2016_03/img6.thumb.png.ea91fd0529a8ec9a9da8c8dc43968d4b.png"></a>
</p>

<ol start="5">
	<li>
		<p dir="rtl">
			سنبقي هذه الخانات على حالتها الافتراضية حيث يمكننا تغييرها فيما بعد وأضغط Finish.
		</p>
	</li>
</ol>

<p dir="rtl" style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="14495" href="https://academy.hsoub.com/uploads/monthly_2016_03/img7.png.ca1c8d8927ea3f0c76e355567d7d6093.png" rel="" data-fileext="png"><img alt="img7.png" class="ipsImage ipsImage_thumbnailed" data-fileid="14495" data-unique="7fn2w5rsf" src="https://academy.hsoub.com/uploads/monthly_2016_03/img7.thumb.png.10c7dd9b390c8380f9849813cce1b06d.png"></a>
</p>

<ol start="6">
	<li>
		<p dir="rtl">
			تم إنشاء أول مشروع لك بنجاح.
		</p>
	</li>
</ol>

<p dir="rtl" style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="14497" href="https://academy.hsoub.com/uploads/monthly_2016_03/img8.png.9ef483321a3abd7b6347666348857c6d.png" rel="" data-fileext="png"><img alt="img8.png" class="ipsImage ipsImage_thumbnailed" data-fileid="14497" data-unique="ucn7x0j3c" src="https://academy.hsoub.com/uploads/monthly_2016_03/img8.thumb.png.80c0656aa576d3919f47e9b8335bba04.png"></a>
</p>

<h2 dir="rtl">
	ملفات ومجلدات المشروع
</h2>

<p dir="rtl">
	دعنا الآن نستعرض بيئة التطوير وما توفره لنا كمطورين من مزايا.
</p>

<p dir="rtl">
	على اليسار هناك ثلاثة ملفات / مُجلّدات رئيسية تكونت تلقائياً بداخل app وهي:
</p>

<ul dir="rtl">
	<li>
		manifests
	</li>
	<li>
		java
	</li>
	<li>
		res
	</li>
</ul>

<h3 dir="rtl">
	مجلد manifest
</h3>

<p dir="rtl">
	والذي يحتوي على ملف <span style="font-family:courier new,courier,monospace;">AndroidManifest.xml</span> ويعتبر هذا الملف مهم جداً لنظام أندرويد لما يقدمه من معلومات أساسية للنظام قبل أن يقوم بتشغيله، أبرز هذه المعلومات:
</p>

<ul>
	<li>
		<p dir="rtl">
			يحتوي على اسم الحزمة Package Name: وهو اسم مميز للتطبيق لتمييزه عن باقي التطبيقات المتواجدة على الهاتف ، فمثلاً إن كان اسم تطبيقك Gallery و هناك تطبيق آخر على الهاتف يسمى Gallery كيف يستطيع النظام التفرقة بين صلاحيات كل منهما و معلوماتهما الخاصة؟<br>
			يقوم النظام بتمييزهما عن طريق Package Name لذا فهو يعتبر اسمًا مُميّزًا لتطبيقك لا ينبغي أن يتشابه مع Package Name لأي تطبيق آخر ، من أجل ذلك وضعت قواعد لتسمية الـ Package أهمها هو أن تجعل تطبيقك على هيئة اسم نطاق لموقعك - إن وجد – فمثلا نجد شركة Google عند تسمية حزم تطبيقاتها تستخدم com.google.appName فيكون لها اسم حزمة Package Name فريد لا يتكرر.
		</p>
	</li>
</ul>

<p dir="rtl" style="margin-right: 40px;">
	<strong>ملحوظة</strong>: يتم تحديد Package Name عند إنشاء التطبيق في الخانة الخاصة بالـ Company Domain.
</p>

<ul dir="rtl">
	<li>
		يقوم بتعريف المكونات الأساسية التي يتكون منها التطبيق الخاص بك<strong>: </strong>سوف نتعرف على هذه المكونات في الدرس التالي، ويتكون التطبيق من أحد هذه المكونات أو أكثر على حسب حاجة التطبيق.
	</li>
	<li>
		يحتوي الإصدار الأدنى الذي يعمل التطبيق معه وهو ما قمنا بتحديده مسبقا عند إنشاء للمشروع.
	</li>
	<li>
		يحتوي على الصلاحيات التي سيعطيها النظام للتطبيق –إن وجدت-.
	</li>
	<li>
		يحتوي على الصلاحيات التي يجب على التطبيقات الأخرى أن تطلبها إن أرادت أن تتبادل معلومات مع تطبيقك.
	</li>
</ul>

<p dir="rtl">
	لذا يعتبر هذا الملف من الملفات الأساسية التي يعتمد عليها النظام في تحديد كيفية التعامل مع التطبيق وإذا لم يتم تحديد كل شيء بشكل صحيح فذلك يعرض تطبيقك إلى ألا يعمل.
</p>

<h3 dir="rtl">
	مجلد java
</h3>

<p dir="rtl">
	يختص هذا المُجلّد بالشيفرة التى سنكتبها للتطبيق و هي الشيفرة الذى يحدد وظيفة التطبيق و استجابة الواجهة و تنفيذها للأوامر.
</p>

<h3 dir="rtl">
	مجلد res
</h3>

<p dir="rtl">
	و يهتم هذا المُجلّد بكل الموارد التي يتعامل معها التطبيق من صور و عناصر مكونة لواجهة المستخدم و عناصر مكونة للقوائم ويتكون من مجموعة من المجلّدات المرتبة كالآتي:
</p>

<ul dir="rtl">
	<li>
		<strong>drawable</strong> ويخص هذا المُجلد كافة الصور التي سيتم استخدامها في التطبيق.
	</li>
	<li>
		<strong>layout</strong> ويخص هذا المجلد بالتصميم الخاص بواجهة المستخدم و ما تحتويه من عناصر مختلفة.
	</li>
	<li>
		<strong>menu</strong> ويخص هذا المجلد بالقوائم و ما تحتويه من عناصر.
	</li>
	<li>
		<strong>mipmap</strong> ويخص هذا المجلد بالأيقونة الخاصة بالتطبيق فقط.
	</li>
	<li>
		<strong>values</strong> ويحتوى هذا المجلد على ملفات أخرى لكل منها وظيفة مختلفة و لكنها تشترك في فكرة عامة واحدة وهي جعل التطبيق أكثر مرونة لدعم دقة الشاشات المختلفة و الأحجام المختلفة ودعم اللغات المختلفة كما سنرى لاحقا في الدروس القادمة.
	</li>
</ul>

<h2>
	المحاكي Simulator
</h2>

<p dir="rtl">
	كما تتميز بيئة تطوير Android Studio بأنها بيئة تطوير متكاملة وتحتوي على ما يحتاجه المطور من أدوات لصنع تطبيق أندرويد فكما رأينا فهي تحتوي على مستعرض للمشروع وملفاته وتحتوي على المترجم الخاص والذي يحول الشيفرة إلى صيغته التنفيذية والتي تعمل على الهواتف وأيضاً تحتوي على محاكي للهواتف والحواسيب اللوحية ونستطيع تجربته عن طريق الضغط على (AVD (Android Virtual Device من داخل Android Studio في شريط القوائم وسنجد أنه تلقائياُ لديه هاتف جاهز للعمل.
</p>

<p dir="rtl">
	كما يمكنك أن تقوم بصنع محاكي آخر عن طريق الضغط على <span style="font-family:courier new,courier,monospace;">Create Virtual Device</span>.
</p>

<p dir="rtl" style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="14498" href="https://academy.hsoub.com/uploads/monthly_2016_03/img9.png.f274849c7da696aca909cd60f0c866a2.png" rel="" data-fileext="png"><img alt="img9.png" class="ipsImage ipsImage_thumbnailed" data-fileid="14498" data-unique="f6ly28g82" src="https://academy.hsoub.com/uploads/monthly_2016_03/img9.thumb.png.03b9e0d9e10fd53f788dc0cf4422ab57.png"></a>
</p>

<p dir="rtl">
	الآن قم بتشغيل المحاكي و انتظر حتى يعمل كالتالي.
</p>

<p dir="rtl" style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="14499" href="https://academy.hsoub.com/uploads/monthly_2016_03/img10.png.5fce2e5eb088b6b81c0987e97c024718.png" rel="" data-fileext="png"><img alt="img10.png" class="ipsImage ipsImage_thumbnailed" data-fileid="14499" data-unique="gpi0fucck" src="https://academy.hsoub.com/uploads/monthly_2016_03/img10.thumb.png.bcb7de7f43a738692fee33a9589434df.png"></a>
</p>

<p dir="rtl">
	قد يأخذ المحاكي بعض الوقت خاصة عند تشغيله أول مرة لذا ينصح دائما أن تقوم بتشغيل المحاكي قبل أن تقوم بتجربة التطبيق بفترة كافية.
</p>

<p dir="rtl">
	لتجربة التطبيق الذي قمنا بإنشائه على المحاكي من داخل android studio اضغط على الأيقونة <strong>Run</strong> ثم انتظر حتى تظهر أمامك شاشة يظهر فيها اسم المحاكي.
</p>

<p dir="rtl" style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="14500" href="https://academy.hsoub.com/uploads/monthly_2016_03/img11.png.a74a141e7db7b4272be780eaec7dea86.png" rel="" data-fileext="png"><img alt="img11.png" class="ipsImage ipsImage_thumbnailed" data-fileid="14500" data-unique="gs7wxaqiq" src="https://academy.hsoub.com/uploads/monthly_2016_03/img11.thumb.png.ca09640cecfd73d0a86666815e9bbc92.png"></a>
</p>

<p dir="rtl">
	ثم اختر المحاكي وأضغط ok.
</p>

<p dir="rtl">
	ستجد التطبيق يعمل الآن على المحاكي.
</p>

<p dir="rtl" style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="14501" href="https://academy.hsoub.com/uploads/monthly_2016_03/img12.png.3a1b887bde9c5e196e2109016cb3d12b.png" rel="" data-fileext="png"><img alt="img12.png" class="ipsImage ipsImage_thumbnailed" data-fileid="14501" data-unique="wm1wovpmr" src="https://academy.hsoub.com/uploads/monthly_2016_03/img12.thumb.png.4167a17f3a5e5b8c04bb32228367465e.png"></a>
</p>

<p dir="rtl">
	<strong>ملحوظة</strong>: عند إنشاء أي مشروع داخل بيئة عمل Android Studio يقوم تلقائياً بإنشاء مشروع يعرض فقط كلمة !Hello World أمام المستخدم وهو الذي شاهدناه في الصورة السابقة حيث أننا لم نقوم بتغيير أي شيء في المشروع الأصلي.
</p>

<p dir="rtl">
	بهذا نكون قد وصلنا إلى نهاية أول دروسنا من هذه السلسة وإلى لقاء قريب بإذن الله، في انتظار تجربتكم وما مررتم به من مشاكل إن وجدت.
</p>
]]></description><guid isPermaLink="false">300</guid><pubDate>Sat, 26 Mar 2016 22:29:00 +0000</pubDate></item></channel></rss>
