آموزش اندروید، فصل پنجم: ساختار پروژه های اندروید

اولین برنامه را نوشتیم و بر روی شبیه ساز اجرا کردیم. حالا نوبت آن است که ببینیم برنامه ای که ساخته ایم از چه اجزایی تشکیل شده است.

هر برنامه اندروید، تعدادی صفحه مختلف است که کاربر می تواند بین آنها حرکت (Navigate) کند. به ساختار پروژه ای که در جلسه قبل ساخته ایم دقت کنید:

create-android-project-8-package-explorer

در آغاز باید توضیح دهیم که در نسخه های متأخر Android SDK وقتی یک پروژه اندروید می سازید، در واقع دو پروژه در اکلیپس ساخته می شود که یکی از آنها یک برنامه کتابخانه است. در واقع برنامه اصلی (در اینجا HelloWorld) برای اجرا نیاز به برنامه کتابخانه (در اینجا appcompat_v7) دارد. در فصل های آینده درباره این کتابخانه خاص که به برنامه اضافه می شود، توضیح خواهیم داد.

قسمت های اصلی این پروژه به شرح زیر است:

  • src: این شاخه شامل کلیه کدهای برنامه است. همانطور که می دانید در برنامه های جاوا کلاس ها درون بسته (package) تعریف می شوند. در این شاخه کلیه بسته های برنامه را می بینید که با باز کردن هر کدام از آنها کلاس های داخل آنها را می توانید ببینید. در برنامه HelloWorld فقط یک کلاس است به اسم MainActivity. در قسمت های بعدی درباره Activity ها که یکی از اصلی ترین اجزای هر برنامه اندروید است، بیشتر آشنا می شوید.
  • gen: هر برنامه اندروید که ساخته می شود، کلاسی دارد به نام R. این کلاس به صورت خودکار ساخته می شود و شما نباید محتوای آن را تغییر دهید زیرا با هر بار اجرای برنامه، این کلاس دوباره ساخته می شود. این کلاس در شاخه gen (مخفف generated) قرار دارد.
  • assets: بعضی برنامه ها ممکن است فایل هایی داشته باشند که در داخل برنامه به آنها نیاز است. مثلاً برنامه می تواند شامل انواع فونت های مختلف باشد یا یک پایگاه داده که از قبل ساخته شده و با داده پر شده است یا تعدادی فایل HTML و جاوااسکریپت و CSS یا فایل های PDF و … این شاخه برای ذخیره این فایل ها است. این فایل ها در فایل apk برنامه (فایلی که در دستگاه های اندرویدی نصب می شود) قرار می گیرند.
  • bin: نام این شاخه مخفف binary است و فایل هایی که بعد از ساخت (build) برنامه ساخته می شوند در آن قرار داده خواهند شد. یکی از این فایل ها apk برنامه است.
  • libs: اگر برنامه برای کامپایل و اجرا نیاز به کتابخانه های جاوا یا C و C++ داشته باشد، فایل های jar کتابخانه را در این شاخه کپی می کنیم. به صورت پیش فرض در این شاخه یک کتابخانه به نام android-support-v4.jar قرار دارد. درباره این کتابخانه در آینده بیشتر خواهیم گفت.
  • res: هر برنامه اندروید، تشکیل شده است از تعدادی صفحات که کاربر می بیند و با آنها تعامل دارد. برای طراحی رابط کاربری این صفحات، به فایل هایی از انواع مختلف نیاز داریم. مثلاً تصاویر، فایل های صوتی و تصویری، صفحات چیدمان (layout) (که ترتیب قرار گرفتن عناصر برنامه در صفحه را مشخص می کنند)، منوها، انیمیشن ها، ترجمه های مختلف برنامه برای زبان های مختلف، تنطیمات و … همه این عناصر در این شاخه قرار می گیرند.
  • AndroidManifest.xml: این فایل محل تنظیم اصلی ترین اطلاعات برنامه است. هر چیزی که در اندروید ایجاد می کنیم، باید اینجا هم تعریف کنیم. مجوزهایی که برنامه نیاز دارد، اینجا تعریف می شود و …

حالا اصلی ترین اجزای برنامه HelloWorld را در اینجا معرفی می کنیم:

چیدمان activity_main.xml: این فایل شاخه res/layout قرار دارد. این فایل یک صفحه از برنامه اندرویدی HelloWorld (و در اصل تنها صفحه آن) است. اگر آن را باز کنید، این صفحه را در محیط طراحی گرافیکی اندروید به شکل زیر خواهید دید:

ch5-android-graphical-layout

اگر بخواهیم کد XML این صفحه را ببینم باید از پایین صفحه سمت چپ، بر روی زبانه activity_main.xml کلیک کنیم و اگر دوباره خواستیم به محیط طراحی گرافیکی برگردیم، زبانه Graphical Layout را کلیک می کنیم:

ch5-android-source-layout

کد XML که این صفحه را می سازد به شکل زیر است:

ch5-android-source-layout2

در چند فصل بعدی به طور کامل با نحوه ساختن چیدمان (layout) در اندروید آشنا خواهید شد.

کلاس HelloWorld: این کلاس جاوا که در شاخه src و در داخل بسته (package) اصلی برنامه (ir.smartlab.android.helloworld) قرار دارد شامل یک کلاس با چندین متد است. به کد این کلاس دقت کنید:

package ir.smartlab.android.helloworld;

import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.Menu;
import android.view.MenuItem;

public class MainActivity extends ActionBarActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }
}

همانطور که می بینید این کلاس، کلاس Activity را توسعه داده است (یا به عبارتی از آن ارث برده است). Activity یکی از اصلی ترین اجزای برنامه نویسی اندروید است. هر صفحه ای که در برنامه های اندرویدی می بینید، در اصل یک Activity است. کد و برنامه آن در یک فایل جاوا و چیدمان آن در یک فایل xml قرار دارد.

از میان متدهای این کلاس، مهم ترین متد، onCreate است:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
}

خط دوم این متد را ببینید. این خط قلب اصلی این کلاس است. این خط، این Activity را به چیدمانی که قبلاً ساخته شده است مرتبط می کند. یعنی می گوید طرحی که این صفحه قرار است به کاربر نمایش دهد در فایلی به نام activity_main که در شاخه layout در منابع (res) قرار دارد. اینجا اولین کاربرد کلاس R که پیشتر درباره اش گفتیم را می بینید.

AndroidManifest.xml: اگر این فایل را باز کنید، صفحه طراحی مخصوص این فایل را می بینید:

ch5-manifest-settings

احتمالاً بعد از دیدن این همه تنظیمات ممکن است ترسیده باشید! البته واقعاً نکات زیادی درباره این فایل و تنطیمات یک برنامه اندروید وجود دارد. ولی آنچه فعلاً برای ما مهم است، چند مورد بیشتر نیست. زبانه AndroidManifest.xml را باز کنید تا سری به کد XML این فایل بیاندازیم:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="ir.smartlab.android.helloworld"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="21" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

در واقع این فایل شامل همه تنظیماتی است که در ویزارد ایجاد یک پروژه اندروید در فصل قبل انجام دادیم. حال به ترتیب از بالا به پایین مهم ترین نکات این تنطیمات را تشریح می کنیم.

۱- package برنامه:

package="ir.smartlab.android.helloworld"

هر برنامه اندروید باید به صورت یکتا توسط اندروید شناسایی شود. این شناسه منحصر به قرد اسم بسته اصلی برنامه است. در ویزارد ایجاد یک پروژه جدید در فصل قبل در اولین دیدید که در همان اولین قسمت ویزارد، نام بسته برنامه از شما خواسته می شود. همانطور که در «آموزش جاوا، فصل دهم: کلاس ها در برنامه نویسی شیءگرا» گفتیم، شیوه ساختن بسته برای یک برنامه جاوا (وبالتبع برنامه اندروید) استفاده از نام دامنه متعلق به نویسنده در ابتدای نام بسته است:

«برای نامگداری بسته ها از وارونه نام دامنه (Domain) شرکت استفاده کنید. مثلاً اگر در شرکت The Best Software Company کار می کنید و نام دامنه شرکت شماwww.company.com است، بسته های خود را با com.company آغاز کنید. به دلیل این که نام دامنه ها در جهان یکتا هستند، نامگذاری بسته های شما و در نتیجه کلاس های شما نیز یکتا خواهد بود.»

حالا برای اندروید، یک قسمت دیگر هم باید به نام بسته اضافه کنیم: نام برنامه. برای برنامه HelloWorld نام دامنه را به این شکل تعریف می کنیم: ir.smartlab.android.helloworld. این نام بسته کاملاً منحصر به فرد است زیرا دامنه منحصر به فرد است و اگر نام برنامه را هم منحصر به فرد انتخاب کنیم، نام بسته که به عنوان شناسه برنامه ها در اندروید به کار می رود نیز همیشه یکتا خواهد بود.

احتمالاً برایتان سؤال پیش آمده که اگر نام بسته یکتا نباشد چه اتفاقی می افتد؟ خیلی ساده است؛ اندروید اجازه نصب دو برنامه با نام بسته یکسان در یک دستگاه را نمی دهد! البته بازارهای برنامه های اندروید مثل Google Play و کافه بازار هم اجازه انتشار دو برنامه با نام بسته یکسان را نمی دهند. پس در انتخاب نام بسته دقت کنید.

۲- versionCode و versionName برنامه:

 android:versionCode="1"
 android:versionName="1.0"

هر برنامه اندروید ممکن است بارها و بارها منتشر شود. برخی از این انتشارها به علت رفع خطاهای موجود در برنامه ها و برخی به علت افزودن ویژگی های جدید به برنامه ها است. وقتی یک برنامه قرار است مجدداً منتشر شود، هم خود برنامه باید بداند از چه نسخه ای به چه نسخه ای قرار است ارتقا پیدا کند، هم دستگاه اندرویدی که این برنامه بر روی آن نصب است باید نسخه برنامه را بداند و البته بازارهای برنامه (Google Play  و کافه بازار). بنابراین شما باید به نوعی نسخه برنامه را درون خود برنامه قرار دهید. برای این کار دو ویژگی versionCode و versionName در مانیفست تعریف می شوند. versionCode یک عدد است که در هر بار ارتقای برنامه، باید عددی بزرگتر از عدد قبلی باشد و فقط اعداد صحیح را می توانیم به عنوان versionCode معرفی کنیم. مثلاً از نسخه ۱ برنامه را به نسخه ۲ ارتقا می دهیم. ویژگی versionCode را بازارها و دستگاه می خوانند ولی به کاربران نشان داده نمی شود زیرا غالباً سیستم ورژن گذاری برنامه ها در شرکت ها متفاوت است. خیلی از شرکت ها بین ارتقایی که فقط خطاها را رفع می کند و ارتقایی که ویژگی های جدید به نرم افزار اضافه می کند فرق می گذارند. versionName هر عبارت متنی را می پذیرد و برای مثال می توانید در ارتقا از نسخه ۱ به ۲، versionName را از ۱٫۰٫۰ به ۱٫۰٫۱ تغییر دهید. versionCode را بازارها و دستگاه های اندروید به کاربر نمایش می دهند.

۳- minSdkVersion:

android:minSdkVersion="8"

ابتدا لازم است فرق بین SDK version و Android version را بدانید. اندروید یک سیستم عامل است و به صورت مستقل در حال تکامل است. ابزارهای برنامه نویسی آن (که با نام Android SDK) شناخته می شود، پروژه مستقل دیگری است. معمولاً با هر عرضه جدید از سیستم عامل اندروید، نسخه جدیدی از Android SDK هم منتشر می شود. ولی ممکن است عرضه جدید اندروید منحصر به رفع خطاهای اندروید باشد و ویژگی جدیدی به آن اضافه نشود. بنابراین Android SDK بدون تغییر بماند. یا بر عکس، Android SDK بروزرسانی شود بدون این که نسخه جدیدی از سیستم عامل اندروید منتشر شود. به همین دلیل سیستم عامل اندروید نسخه های خودش را دارد و Android SDK نسخه های خودش را. نسخه های اندروید مثلاً ۴٫۴ است که با نام تجاری KitKat در بازار شناخته می شود. نسخه های Android SDK به صورت عددی هستند و نام تجاری ندارند. نسخه های Android SDK اصطلاحاً API Level نامیده می شوند و به صورت عددی هستند. برای مثال همراه با اندروید KitKat نسخه ای از Android SDK منتشر شد که API Level 19 نامیده می شود. در برنامه نویسی اندروید آن چیزی که مهم است نسخه Android SDK یا همان API Level است.

minSdkVersion شماره پایین ترین API Level ی است که برنامه شما پشتیبانی می کند و بر روی دستگاه هایی که API Level آنها کمتر از مقدار minSdkVersion باشد، برنامه شما نصب نخواهد شد. در هنگام ایجاد یک پروژه اندروید (رجوع کنید به فصل قبل) minSdkVersion در همان اولین مرحله ویزارد تحت عنوان Minimum Required SDK از شما پرسیده می شود ولی اینجا هم می توانید آن را تغییر دهید.

فرض کنید minSdkVersion را ۸ انتخاب کنید. معنی این انتخاب این است که برنامه شما بر روی دستگاه هایی که API Level آنها کمتر از ۸ است اجرا نخواهد شد. اگر به جدول زیر دقت کنید می بینید که API Level اندروید Froyo (نسخه ۲٫۲) ۸ است. بنابراین برنامه شما بر روی اندرویدهای ۲٫۱ و ماقبل اجرا نخواهد شد.

Platform Version API Level VERSION_CODE Notes
Android 4.4 19 KITKAT Platform
Highlights
Android 4.3 18 JELLY_BEAN_MR2 Platform
Highlights
Android 4.2, 4.2.2 17 JELLY_BEAN_MR1 Platform
Highlights
Android 4.1, 4.1.1 16 JELLY_BEAN Platform
Highlights
Android 4.0.3, 4.0.4 15 ICE_CREAM_SANDWICH_MR1 Platform
Highlights
Android 4.0, 4.0.1, 4.0.2 14 ICE_CREAM_SANDWICH
Android 3.2 13 HONEYCOMB_MR2 <!– Platform
Highlights
–>
Android 3.1.x 12 HONEYCOMB_MR1 Platform Highlights
Android 3.0.x 11 HONEYCOMB Platform Highlights
Android 2.3.4
Android 2.3.3
10 GINGERBREAD_MR1 Platform
Highlights
Android 2.3.2
Android 2.3.1
Android 2.3
9 GINGERBREAD
Android 2.2.x 8 FROYO Platform Highlights
Android 2.1.x 7 ECLAIR_MR1 Platform
Highlights
Android 2.0.1 6 ECLAIR_0_1
Android 2.0 5 ECLAIR
Android 1.6 4 DONUT Platform Highlights
Android 1.5 3 CUPCAKE Platform Highlights
Android 1.1 2 BASE_1_1
Android 1.0 1 BASE

نکته ای که توجه به آن ضروری است این است که اینجا باید همیشه بین انتخاب یک نسخه از API Level که بیشترین دستگاه های موجود در بازار آن را پشتیبانی می کنند و امکانات آن ها صورت گیرد. برای مثال اگر می خواهید از امکانات Download Manager اندروید در برنامه های خود بهره بگیرید، می بینید که این ویژگی در API Level 9 معرفی شده است و اگر minSdkVersion  خود را ۸ انتخاب کنید نمی توانید از آن استفاده کنید. اگر minSdkVersion را ۹ انتخاب کنید، در عوض چند درصدی از گوشی های موجود در بازار دیگر نمی توانند برنامه شما را اجرا کنند. توصیه گوگل این است که سعی کنید ۹۵ درصد دستگاه های موجود در بازار را پشتیبانی کنید. بنابراین minSdkVersion خود را نسخه ای انتخاب کنید که تعداد دستگاه هایی که API Level آن ها کمتر از مقدار فوق است، کمتر ار ۵ درصد دستگاه های موجود در بازار باشند.

حال احتمالاً می پرسید از کجا بدانیم درصد استفاده از هر API Level در گوشی ها چقدر است؟ پرسش به جایی است. گوگل به صورت منظم اطلاعاتی را منتشر می کند که درصد استفاده از نسخه های مختلف اندروید را به همراه انبوهی از اطلاعات مفید دیگر منتشر می کند. برای دسترسی به این اطلاعات بخش Dashboard در سایت توسعه دهندگان اندروید بروید:

ch5-android-dashboard-versions

این آخرین اطلاعاتی است که در زمان نگارش متن منتشر شده و مربوط به حدود ۳ هفته قبل است. همانطور که می بینید برای این که شرط ۹۵ درصد محقق شود، می توانید minSdkVersion را ۱۰ تعریف کنید.

(خیلی طولانی شد! ولی لازم بود!)

۴- targetSdkVersion:

android:targetSdkVersion="21"

targetSdkVersion را همواره بالاترین نسخه API Levelی که منتشر شده و شما هم دانلود کرده این قرار بدهید. در حال حاضر این مقدار احتمالاً ۱۹ (مربوط به KitKat) یا ۲۱ (مربوط به پیش نمایش Android L) است. کاربرد آن را در آینده خواهید دید.

۵- تگ Application:

<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
</application>

در این تگ اطلاعات کلی درباره نام برنامه، آیکون برنامه، تم (زمینه) برنامه و … و نیز کلیه Activityها، Serviceها و BroadcastReceiver ها تعریف می شوند. (عجله نکنید! در انتهای این دوره آموزشی به همه اینها آشنا می شوید!)

۵-۱- android:allowBackup: اگر مقدار این ویژگی true باشد، برنامه های بکاپ گیری می توانند اطلاعات محرمانه برنامه را بخوانند و آن ها را ذخیره کنند. در صورت که false باشد، برنامه های بکاپ گیری نمی توانند از برنامه شما بکاپ تهیه کنند. انتخاب با شما است.

۵-۲- android:icon: آیکون برنامه شما را مشخص می کند. در فصل های آتی مفصل درباره موضوع تصاویر و عکس ها و آیکون ها در اندروید خواهیم گفت.

۵-۳- android:label: عنوان یا نام برنامه در دستگاه را مشخص می کند. در فصل های آتی مفصل درباره پشتیبانی همزمان از چند زبان در اندروید خواهیم گفت.

۵-۴- android:theme: اندروید از نسخه ۴ به بعد از تم پشتیبانی می کند و ۲ تم Holo Light و Holo Dark دارد. می توانید از یکی از این ۲ تم استفاده کنید یا آن ها را بسته به نیاز خود تغییر دهید یا اگر وقت و سلیقه و توانایی کار با ابزارهای گرافیکی و البته دانش اندروید دارید یک تم جدید بسازید. App Theme که اینجا به عنوان تم برنامه معرفی شده است، تمی است که از تم Holo مشتق شده است و می توانید آن را تغییر دهید تا بر نیازهای شما منطبق شود. در فصل های خیلی دور (!) درباره تم خواهیم گفت. فعلاً کارهای خیلی مهم تری از تم نوشتن داریم!

۶- تگ Activity:

<activity
 android:name=".MainActivity"
 android:label="@string/app_name" >
 <intent-filter>
 <action android:name="android.intent.action.MAIN" />

 <category android:name="android.intent.category.LAUNCHER" />
 </intent-filter>
 </activity>

همانطور که گفتیم در داخل تگ Application باید همه Activity ها را تعریف کرد. برنامه ما فعلاً یک صفحه بیشتر ندارد و در نتیجه یک Activity هم بیشتر ندارد. این تگ خود چندین ویژگی دارد:

۶-۱- android:name: نام کلاس جاوای مرتبط با این Activity است. نام کلاس را یا باید کامل و به همراه بسته (package) بنویسید مثل ir.smartlab.android.helloworld.MainActivity یا آن را خلاصه کنید. برای خلاصه کردن می توانید نام package برنامه را از آن حذف کنید: MainActivity.

6-2- android:label: نامی است که برای این Activity انتخاب کرده اید. این نام در چندین جا ظاهر می شود که مهم ترین آن در بالای صفحه برنامه و در نواری که اصطلاحاً ActionBar نامیده می شود (قسمتی که با رنگ زرد مشخص شده است):

ch5-android-actionbar-label


در فصل بعد کمی برنامه HelloWorld را تغییر می دهیم. نظر شما چیست؟ چیزی از قلم نیافتاده؟ نظرات شما در بهبود این مطالب بسیار راهگشا خواهد بود!

facebooktwittergoogle_plusredditpinterestlinkedinmailfacebooktwittergoogle_plusredditpinterestlinkedinmail

8 فکر می‌کنند “آموزش اندروید، فصل پنجم: ساختار پروژه های اندروید

  1. zendegi

    سلام
    ببخشید من یه مشکلی دارم
    وقتی برنامه رو RUN میکنم، به جای اجرای برنامه اندروید، پروژه ی جاوایی که قبلا در اکلیپسم اجرا شده اجرا میشه
    میشه لطف کنید بگید باید چیکار کنم؟اینجوری نمیتونم پیش برم
    ممنون

    پاسخ
    1. علی بهزادیان نژاد نویسنده

      دکمه سبز رنگ Run یا اجرا در اکلیپس همیشه آخرین برنامه اجرا شده را اجرا می‌کند. بنابراین یک بار برنامه را با استفاده از منوی Run اجرا کنید و در دفعات بعدی از دکمه Run استفاده کنید. در ضمن در کنار دکمه Run فلش سیاه کوچکی است که اگر آن را بزنید همه برنامه‌های اجرا شده قبلی را فهرست کرده که می‌توانید از میان آن‌ها برنامه مورد نظر خودتان را انتخاب کنید.

      پاسخ
      1. zendegi

        دقیقا مشکلم اینه که وقتی اون فلش مشکی رو میزنم لیست همه برنامه های جاوایی که قبلا نوشتم رو میاره و خبری از برنامه hello woeld اندرویدم نیست…
        واقعا باید چکار کنم؟؟؟

        پاسخ
        1. علی بهزادیان نژاد نویسنده

          یکی از فایل‌های جاوای برنامه را باز کنید و بعد وقتی که تب کلاس جاوا فعاله دکمه سبز رنگ Run رو بزنید. ازتون می‌پرسه که چطور برنامه رو اجرا کنه که یکی از گزینه‌هاش Android Application است و بعد از اون برنامه رو در لیست برنامه‌های قابل اجرا میاره براتون.

          پاسخ
  2. طاهری

    سلام. دست تون درد نکنه
    من یه مشکلی دارم دو برنامه ساختم که همه اسم ها … اسم بسته و پکیج و … متفاوته
    اما خب ساختار یکیه و فقط محتواها و اسم ها فرق دارند
    اما وقتی دو برنامه رو می ریزم رو گوشی روی هر کدوم که کلیک می کنی تا باز بشه پنجره ای باز می شه که کدوم رو برنامه می خوام باز کنم.
    ممنون از وقتی که می ذارید

    پاسخ
  3. وحید بیگی

    سلام
    من وقتی میخوام new project بسازم کلاس R ایجاد نمیشه
    یعنی پروژه Helloworld میاد appcompat-v7 هم میاد ولی کلاس R ایجاد نمیشه
    و خطا میده لطفا راهنمایی کنید

    پاسخ

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

شما می‌توانید از این دستورات HTML استفاده کنید: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>