کار با package ها ، در برنامه نویسی اندروید

P O U R I A

مدیر مهندسی شیمی مدیر تالار گفتگوی آزاد
مدیر تالار
فهرست مطالب:

  1. ساخت package های جدید برای مدیریت بهتر Activity ها و کلاس ها (class) و همچنین شرح چگونگی ساخت یک Activity جدید برای package ای غیر از package اصلی برنامه اندروید، در برنامه eclipse ، در برنامه نویسی اندروید
  2. تغییر package اصلی یک برنامه اندروید که شامل چندین package است، در برنامه نویسی اندروید


منبع: kelidestan
 

P O U R I A

مدیر مهندسی شیمی مدیر تالار گفتگوی آزاد
مدیر تالار
ساخت package های جدید برای مدیریت بهتر Activity ها و کلاس ها (class)

ساخت package های جدید برای مدیریت بهتر Activity ها و کلاس ها (class)

ساخت package های جدید برای مدیریت بهتر Activity ها و کلاس ها (class) و همچنین شرح چگونگی ساخت یک Activity جدید برای package ای غیر از package اصلی برنامه اندروید، در برنامه eclipse ، در برنامه نویسی اندروید :


همان طور که می دانید، هنگامی که یک پروژه اندروید جدید در برنامه eclipse می سازیم، یک package با نامی مشخص برای آن انتخاب می کنیم (در همان مراحل ساخت پروژه اندروید) و برنامه اندروید تنها دارای یک package است که تمامی Activity ها و کلاس ها (class) ها در آن قرار می گیرند. مثلا بنده در پروژه اندروید زیر، نام com.kelidestan.com را برای package برنامه اندروید انتخاب کرده ام :


662.jpg



اکنون فرض کنید که ما قصد داریم که یک پروژه اندروید با تعداد زیادی Activity و کلاس (class) داشته باشیم، بنابراین می توانیم که برای مدیریت بهتر Activity ها و کلاس ها (class)، یک یا چند package دیگر برای پروژه اندروید بسازیم تا تعدادی از Activity ها و کلاس ها (class) در آنها قرار بگیرند. مثلا فرض کنید که بخشی از برنامه اندروید، برای دانلود فایل از اینترنت می باشد، بنابراین بنده تصمیم می گیرم که یک package با نام com.kelidestan.download بسازم و تمامی Activity ها و کلاس های (class) مرتبط با دانلود فایل را در آن قرار بدهم.
برای ساخت یک package جدید برای پروژه اندروید، ابتدا بر روی نام پروژه اندروید در قسمت Package Manager در برنامه eclipse ، با موس، کلیک سمت راست نموده و گزینه New و سپس گزینه Package را انتخاب می کنیم :

663.jpg

پنجره ای به شکل زیر نمایش داده می شود :


664.jpg

نام package جدیدی که می خواهیم ساخته شود را در قسمت Name نوشته و بر روی گزینه Finish کلیک می کنیم. package جدید در پروژه اندروید ساخته می شود :


665.jpg

خوب اکنون که دو package در پروژه اندروید داریم، انتظارمان این است که برای هر کدام که قصد داریم یک Activity یا یک کلاس (class) جدید بسازیم، باید بر روی همان package ، با موس، کلیک سمت راست نموده و ابتدا گزینه New و سپس گزینه مربوط به ساخت Activity یا کلاس (class) را انتخاب نماییم، اما متاسفانه نتیجه، آن چیزی که فکر می کنیم نیست، یعنی اگر شما مراحل را برای package با نام com.kelidestan.download انجام بدهید، Activity یا کلاس (class) جدید، برای com.kelidestan.com ساخته می شود. این مورد را با مثال شرح می دهیم و همچنین می گوییم که چگونه Activity یا کلاس جدید را بین package های مختلف، جابجا کنید.
به عنوان مثال، من قصد دارم که برای package با نام com.kelidestan.download ، یک Activity جدید با نام DownlodHandler بسازم. برای این منظور، بر روی com.kelidestan.download ، با موس، کلیک سمت راست نموده و ابتدا گزینه New و سپس گزینه Other را انتخاب می کنم :

666.jpg

پنجره ای به شکل زیر نمایش داده می شود :


667.jpg

گزینه Android Activity را انتخاب نموده و سپس بر روی دکمه Next کلیک می کنیم. صفحه زیر نمایش داده می شود :


668.jpg

گزینه Blank Activity که برای ساخت یک Activity ساده به کار می رود را انتخاب نموده و بر روی دکمه Next کلیک می کنیم.
در صفحه بعدی، نام مورد نظرمان برای Activity را در قسمت Activity Name نوشته و نام مربوط به فایل xml متناظر برای لایه گرافیکی Activity را نیز در قسمت Layout Name می نویسیم :

669.jpg

بر روی گزینه Finish کلیک می کنیم تا Activity و فایل xml متناظر با آن ساخته شود :


670.jpg

همان طور که قبلا گفته بودم، بر خلاف انتظار ما، Activity جدید برای package با نام com.kelidestan.com ساخته شده است. بنابراین اکنون باید آن را به package با نام com.kelidestan.download منتقل کنیم. برای این منظور، ابتدا بر روی فایل DownloadHandler.java ، با موس، کلیک سمت راست نموده و سپس گزینه Copy را انتخاب می کنیم. آنگاه بر روی package با نام com.kelidestan.download ، با موس، کلیک سمت راست نموده و گزینه Paste را انتخاب می کنیم تا یک کپی از فایل DownloadHandler.java در آن قرار بگیرد (اکنون دو تا فایل DownloadHandler.java داریم) :

671.jpg

فایل DownloadHandler.java برای package با نام com.kelidestan.com را حذف می کنیم (با موس، بر روی package ، کلیک سمت راست نموده و گزینه Delete را انتخاب می کنیم) :


672.jpg

اما تنها با یک copy و paste ساده، کار انتقال تمام نمی شود، زیرا هنگام ساخت Activity ، در فایل AndroidManifest.xml از پروژه اندروید، نام package مربوط به آن درج شده است و بنابراین باید فایل AndroidManifest.xml را باز کرده و نام package مربوط به آن را تغییر بدهیم :


676.jpg

کدهای فایل AndroidManifest.xml به صورت زیر می باشد :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][COLOR=#339933]<?[/COLOR]xml version[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"1.0"[/COLOR] encoding[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"utf-8"[/COLOR][COLOR=#339933]?>[/COLOR]
[COLOR=#339933]<[/COLOR]manifest xmlns[COLOR=#339933]:[/COLOR]android[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"http://schemas.android.com/apk/res/android"[/COLOR]
    [B]package[/B][COLOR=#339933]=[/COLOR][COLOR=#0000FF]"com.kelidestan.com"[/COLOR]
    android[COLOR=#339933]:[/COLOR]versionCode[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"1"[/COLOR]
    android[COLOR=#339933]:[/COLOR]versionName[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"1.0"[/COLOR] [COLOR=#339933]>[/COLOR]

    [COLOR=#339933]<[/COLOR]uses[COLOR=#339933]-[/COLOR]sdk
        android[COLOR=#339933]:[/COLOR]minSdkVersion[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"8"[/COLOR]
        android[COLOR=#339933]:[/COLOR]targetSdkVersion[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"18"[/COLOR] [COLOR=#339933]/>[/COLOR]

    [COLOR=#339933]<[/COLOR]application
        android[COLOR=#339933]:[/COLOR]allowBackup[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"true"[/COLOR]
        android[COLOR=#339933]:[/COLOR]icon[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"@drawable/ic_launcher"[/COLOR]
        android[COLOR=#339933]:[/COLOR]label[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"@string/app_name"[/COLOR]
        android[COLOR=#339933]:[/COLOR]theme[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"@style/AppTheme"[/COLOR] [COLOR=#339933]>[/COLOR]
        [COLOR=#339933]<[/COLOR]activity
            android[COLOR=#339933]:[/COLOR]name[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"com.kelidestan.com.MainActivity"[/COLOR]
            android[COLOR=#339933]:[/COLOR]label[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"@string/app_name"[/COLOR] [COLOR=#339933]>[/COLOR]
            [COLOR=#339933]<[/COLOR]intent[COLOR=#339933]-[/COLOR]filter[COLOR=#339933]>[/COLOR]
                [COLOR=#339933]<[/COLOR]action android[COLOR=#339933]:[/COLOR]name[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"android.intent.action.MAIN"[/COLOR] [COLOR=#339933]/>[/COLOR]

                [COLOR=#339933]<[/COLOR]category android[COLOR=#339933]:[/COLOR]name[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"android.intent.category.LAUNCHER"[/COLOR] [COLOR=#339933]/>[/COLOR]
            [COLOR=#339933]</[/COLOR]intent[COLOR=#339933]-[/COLOR]filter[COLOR=#339933]>[/COLOR]
        [COLOR=#339933]</[/COLOR]activity[COLOR=#339933]>[/COLOR]
        [COLOR=#339933]<[/COLOR]activity
            android[COLOR=#339933]:[/COLOR]name[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"com.kelidestan.com.DownloadHandler"[/COLOR]
            android[COLOR=#339933]:[/COLOR]label[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"@string/title_activity_download_handler"[/COLOR] [COLOR=#339933]>[/COLOR]
        [COLOR=#339933]</[/COLOR]activity[COLOR=#339933]>[/COLOR]
    [COLOR=#339933]</[/COLOR]application[COLOR=#339933]>[/COLOR]

[COLOR=#339933]</[/COLOR]manifest[COLOR=#339933]>[/COLOR][/FONT]
[/FONT][/COLOR]
مشاهده می کنید که کد مربوط به Activity با نام DownloadHandler ، به صورت زیر نوشته شده است :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][COLOR=#339933]<[/COLOR]activity
    android[COLOR=#339933]:[/COLOR]name[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"com.kelidestan.com.DownloadHandler"[/COLOR]
    android[COLOR=#339933]:[/COLOR]label[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"@string/title_activity_download_handler"[/COLOR] [COLOR=#339933]>[/COLOR]
[COLOR=#339933]</[/COLOR]activity[COLOR=#339933]>[/COLOR][/FONT]
[/FONT][/COLOR]
قبل از نام DownloadHandler ، عبارت com.kelidestan.com نوشته شده است، اما ما باید آن را به عبارت com.kelidestan.download که همان package جدید است، تغییر بدهیم :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][COLOR=#339933]<[/COLOR]activity
    android[COLOR=#339933]:[/COLOR]name[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"com.kelidestan.download.DownloadHandler"[/COLOR]
    android[COLOR=#339933]:[/COLOR]label[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"@string/title_activity_download_handler"[/COLOR] [COLOR=#339933]>[/COLOR]
[COLOR=#339933]</[/COLOR]activity[COLOR=#339933]>[/COLOR][/FONT]
[/FONT][/COLOR]
علاوه بر نکته ای که گفتیم، همان طور که مشاهده می کنید، برای فایل DownloadHandler.java ، یک علامت خطا نمایش داده شده است، آن را باز می کنیم تا ببینیم مشکل از چیست :

673.jpg

همان طور که مشاهده می کنید، منابعی که در کلاس R مشخص می شوند را نتوانسته است تشخیص بدهد، دلیل آن هم واضح می باشد، زیرا وقتی ما تنها حرف R را نوشته ایم، در واقع اشاره به کلاس زیر دارد :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace]com.[COLOR=#006633]kelidestan[/COLOR].[COLOR=#006633]com[/COLOR].[COLOR=#006633]R[/COLOR][/FONT]
[/FONT][/COLOR]
زیرا نام package اصلی برنامه اندروید، com.kelidestan.com می باشد، اما چون Activity با نام DownloadHandler.java در package با نام com.kelidestan.download قرار گرفته، بنابراین نمی تواند کلاس R را بیابد. برای حل این مشکل، باید کلاس com.kelidestan.com.R را وارد (import) کنیم، یعنی باید در ابتدای فایل، کد زیر نوشته شود :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][B]import[/B] [COLOR=#006699]com.kelidestan.com.R[/COLOR][COLOR=#339933];[/COLOR][/FONT]
[/FONT][/COLOR]
بنابراین کدها را به صورت زیر تغییر می دهیم تا دیگر هیچ خطایی نمایش داده نشود :

674.jpg


نکته :
شما با کلیک بر روی علامت کوچک نمایش داده شده در کنار نام package ها، می توانید تعیین کنید که Activity ها و کلاس های (class) موجود در آن package ، نمایش داده شوند یا خیر

675.jpg

مثلا وقتی که با Activity ها و کلاس های یک package کار نمی کنیم، با کلیک بر روی علامت کنار آن، تعیین می کنیم که موارد مربوط به آن نمایش داده نشوند (قسمت Package Explorer در برنامه eclipse ، شلوغ نشود).
بنابراین در این مبحث شرح دادیم که چگونه می توان یک یا چند package جدید برای پروژه اندروید ساخت تا مدیریت Activity ها و کلاس ها (class) ساده تر شود. پس Activity ها و کلاس هایی (class) که به هم مرتبط هستند را در package های جداگانه قرار بدهید تا مثلا در یک پروژه اندروید با 20 یا 30 Activity و کلاس (class)، مدیریت آنها ساده باشد.
 

P O U R I A

مدیر مهندسی شیمی مدیر تالار گفتگوی آزاد
مدیر تالار
تغییر package اصلی یک برنامه اندروید که شامل چندین package است، در برنامه نویسی اندروید

تغییر package اصلی یک برنامه اندروید که شامل چندین package است، در برنامه نویسی اندروید

همان طور که می دانید، وقتی در برنامه eclipse ، یک پروژه اندروید جدید می سازیم، پروژه اندروید در ابتدا، تنها شامل یک package است که همان package اصلی پروژه اندروید می باشد. همچنین شرح دادیم که چگونه می توان package های جدید برای پروژه اندروید ساخت. اکنون با فرض اینکه برنامه اندروید دارای چند package باشد، می خواهیم شرح بدهیم که چگونه می توان package اصلی برنامه اندروید را تغییر داد.
فرض کنید که پروزه اندروید، دارای دو package باشد :

677.jpg

اکنون برای اینکه متوجه بشویم که کدام package به عنوان package اصلی برنامه اندروید تعیین شده است، فایل AndroidManifest.xml از پروژه اندروید را باز می کنیم :


678.jpg



کدهای فایل AndroidManifest.xml به صورت زیر می باشد :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][COLOR=#339933]<?[/COLOR]xml version[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"1.0"[/COLOR] encoding[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"utf-8"[/COLOR][COLOR=#339933]?>[/COLOR]
[COLOR=#339933]<[/COLOR]manifest xmlns[COLOR=#339933]:[/COLOR]android[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"http://schemas.android.com/apk/res/android"[/COLOR]
    [B]package[/B][COLOR=#339933]=[/COLOR][COLOR=#0000FF]"com.kelidestan.com"[/COLOR]
    android[COLOR=#339933]:[/COLOR]versionCode[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"1"[/COLOR]
    android[COLOR=#339933]:[/COLOR]versionName[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"1.0"[/COLOR] [COLOR=#339933]>[/COLOR]

    [COLOR=#339933]<[/COLOR]uses[COLOR=#339933]-[/COLOR]sdk
        android[COLOR=#339933]:[/COLOR]minSdkVersion[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"8"[/COLOR]
        android[COLOR=#339933]:[/COLOR]targetSdkVersion[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"18"[/COLOR] [COLOR=#339933]/>[/COLOR]

    [COLOR=#339933]<[/COLOR]application
        android[COLOR=#339933]:[/COLOR]allowBackup[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"true"[/COLOR]
        android[COLOR=#339933]:[/COLOR]icon[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"@drawable/ic_launcher"[/COLOR]
        android[COLOR=#339933]:[/COLOR]label[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"@string/app_name"[/COLOR]
        android[COLOR=#339933]:[/COLOR]theme[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"@style/AppTheme"[/COLOR] [COLOR=#339933]>[/COLOR]
        [COLOR=#339933]<[/COLOR]activity
            android[COLOR=#339933]:[/COLOR]name[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"com.kelidestan.com.MainActivity"[/COLOR]
            android[COLOR=#339933]:[/COLOR]label[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"@string/app_name"[/COLOR] [COLOR=#339933]>[/COLOR]
            [COLOR=#339933]<[/COLOR]intent[COLOR=#339933]-[/COLOR]filter[COLOR=#339933]>[/COLOR]
                [COLOR=#339933]<[/COLOR]action android[COLOR=#339933]:[/COLOR]name[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"android.intent.action.MAIN"[/COLOR] [COLOR=#339933]/>[/COLOR]

                [COLOR=#339933]<[/COLOR]category android[COLOR=#339933]:[/COLOR]name[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"android.intent.category.LAUNCHER"[/COLOR] [COLOR=#339933]/>[/COLOR]
            [COLOR=#339933]</[/COLOR]intent[COLOR=#339933]-[/COLOR]filter[COLOR=#339933]>[/COLOR]
        [COLOR=#339933]</[/COLOR]activity[COLOR=#339933]>[/COLOR]
        [COLOR=#339933]<[/COLOR]activity
            android[COLOR=#339933]:[/COLOR]name[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"com.kelidestan.download.DownloadHandler"[/COLOR]
            android[COLOR=#339933]:[/COLOR]label[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"@string/title_activity_download_handler"[/COLOR] [COLOR=#339933]>[/COLOR]
        [COLOR=#339933]</[/COLOR]activity[COLOR=#339933]>[/COLOR]
    [COLOR=#339933]</[/COLOR]application[COLOR=#339933]>[/COLOR]

[COLOR=#339933]</[/COLOR]manifest[COLOR=#339933]>[/COLOR][/FONT]
[/FONT][/COLOR]
به خط زیر از کدها توجه کنید :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][B]package[/B][COLOR=#339933]=[/COLOR][COLOR=#0000FF]"com.kelidestan.com"[/COLOR][/FONT]
[/FONT][/COLOR]
در این خط، package با نام com.kelidestan.com به عنوان package اصلی برنامه اندروید تعیین شده است. اکنون در صورت تمایل، می توانیم نام package دیگر، یعنی com.kelidestan.download ، را به جای آن بنویسیم تا package با نام com.kelidestan.download به عنوان package اصلی برنامه اندروید در نظر گرفته شود :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][B]package[/B][COLOR=#339933]=[/COLOR][COLOR=#0000FF]"com.kelidestan.download"[/COLOR][/FONT]
[/FONT][/COLOR]
[h=4]نکته :[/h]اگر به خاطر داشته باشید، قبلا گفتیم که چنانچه در یک Activity موجود در package ای غیر از package اصلی برنامه اندروید، به کلاس R که در آن منابع مشخص شده اند، ارجاع بدهیم، ممکن است که منابع شناسایی نشوند و یک سری پیام خطا به ما نمایش داده شود ( کلید شماره 2670 ). همانجا ذکر کردیم که در این موارد، راه حل این است که کلاس R که قبل از آن، نام package اصلی برنامه اندروید قرار می گیرد را به آن Activity وارد (import) کنیم، یعنی مثلا اگر نام package اصلی برابر com.kelidestan.com است، کد زیر را در ابتدای Activity مورد نظرمان بنویسیم :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][B]import[/B] [COLOR=#006699]com.kelidestan.com.R[/COLOR][COLOR=#339933];[/COLOR][/FONT]
[/FONT][/COLOR]
بنابراین چون این کلید مربوط به تغییر package اصلی برنامه اندروید بود، گفتم بد نیست که این نکته نیز یادآوری شود تا در صورت تغییر package اصلی، اگر پیام خطایی در Activity ها نمایش داده شد، بدانید که مشکل از چیست.
 
بالا