صفحه اصلی » آموزش اندروید » برنامه کتاب ساده با اندروید
book

برنامه کتاب ساده با اندروید

در این جلسه تصمیم داریم یک کتاب یا کاتالوگ ساده با اندروید استدیو بنویسیم. برنامه های محتوایی از متداول ترین، پر دانلود ترین و البته پرفروش ترین برنامه ها در فروشگاه های اندروید می باشند. ما در این جلسه یک کتاب قصه کودک ساده با Android Studio ایجاد می کنیم که مطمئناً بهترین تجربه ی شما در برنامه نویسی اندروید خواهد بود. براحتی می توانید محتوای دلخواه خود را در این فایل جایگزین نمایید. این پروژه از دو اکتیویتی تشکیل شده است. Activityی اول از یک ListView تشکیل شده که فهرست کتاب را نمایش می دهد. اکتیویتی دوم نیز محتوای هر داستان را نمایش می دهد. در این پروژه نحوه ی فراخوانی Activity ها با استفاده از اینتنت ها (Intent) را فرا خواهید گرفت. همچنین فایل مانیفست (AndroidManifest.xml) را نیز ویرایش خواهیم کرد. نیز نحوه ی تغییر نسخه ی برنامه و نسخه API Level کامپایلر را در gradle توضیح می دهیم. در آخر با strings.xml کار می کنیم و رشته ها و منوها را در این فایل متنی می نویسیم تا نام و متون برنامه متناسب با تغییر زبان گوشی، به صورت خودکار ترجمه شود.

پس از دانلود و Extract کردن فایل زیپ (قابل دانلود در انتهای مقاله)، اندروید استدیو را باز کرده و مطابق با جلسات قبلی روی Open an existing Android Studio project کلیک کنید و پوشه ی اکسترکت شده ی پروژه ی کتاب ساده با اندروید استودیو را باز کنید.

پس از باز کردن پروژه و Load شدن کامل فایل ها به سراغ فایل activity_main.xml بروید. این فایل اولین رابط کاربری (UI) یا همان اینترفیسی است که کاربر پس از باز کردن اپلیکیشن کتاب خواهد دید. این فایل از یک RelativeLayout والد تشکیل شده که در داخل آن یک TextView برای نمایش عبارت “فهرست” و یک ListView برای نمایش عناوین قرار گرفته است. با TextView در پروژه های قبلی آشنا شدیم. اما ListView عنصری است که می تواند بینهایت سطر داشته باشد و هر کدام از سطرها می تواند شامل یک عبارت ساده (مثل همین پروژه) یا ترکیبی از چندین متن و عکس مختلف باشد. هر سطر از ListView خود یک لایه ی مجزاست که در فایل list.xml آنرا تعریف می کنیم. نام list.xml اجباری نیست و ما از طریق فایل کد اکتیویتی این فایل را به سطرهای ListView نسبت می دهیم.

فایل list.xml را باز کنید. این فایل بسیار ساده بوده و از یک RelativeLayout و یک TextView تشکیل شده است. در این فایل است که می توانیم ظاهر عناصر لیست را تغییر دهیم. ما برای این پروژه ساده ترین حالت ممکن را ایجاد کرده ایم تا فایل ها کوچک شده و براحتی بتوانید کار با اشیاء را فرا بگیرید.

حال Activity اصلی برنامه یعنی فایل MainActivity.java را باز کنید. همانطوریکه می دانید این فایل بلافاصله پس از کلیک روی آیکن برنامه اجرا می شود و فایل activity_main.xml را باز کرده و به کاربر نمایش می دهد. در واقع کدهای اجرایی در این فایل نوشته می شود. ظاهر این فایل همانند پروژه های قبلیست. ما در این فایل نیز برای حفظ ظاهر اصلی فایل، کدهای خود را درون توابع جداگانه ی init ،main و array2listview نوشته ایم و سپس توابع را فراخوانی نموده ایم. با این کار براحتی می توانید در صورت نیاز توابع را در پروژه ی خود کپی کنید. در این فایل اولین کاری که بلافاصله پس از باز کردن فایل رابط کاربری باید انجام پذیرد پر کردن آیتم های ListView با عناوین فهرست کتاب است. به همین منظور در ابتدای کلاس برنامه یک آرایه رشته ای ایجاد کرده ایم و در تابع init که پس از اتمام تابع onCreate اجرا می شود آن را با عبارت هایی مثل “داستان اول” و … مقدار دهی نموده ایم. کار بعدی پر کردن ListView با این عباراتهاست. به همین منظور تابعی به نام main ایجاد کرده ایم که طبق قرارداد خودمان همیشه کارهای اجرایی را در تابع main انجام می دهیم و در این تابع، تابع array2listview با آرگومان آرایه رشته ای index فراخوانی کرده ایم. شاید تابع main اضافه به نظر بیاید و بتوان در همان ابتدا array2listview را فراخوانی کرد. اما برای قابل فهم شدن کدها ما یک قرار داد وضع کرده ایم و در تمام برنامه های جدید دو تابع به نام init و main داریم. تابع init برای مقدار دهی متغیرها بکار می رود و تابع main برای فراخوانی کدهای اجرایی.

تابع array2listview کمی پیچیده است. البته اصلا نیازی نیست که عملکرد آن را یاد بگیرید و براحتی می توانید آن را در برنامه های خود کپی کرده و آن را با آرگومانی از نوع آرایه رشته ای فراخوانی کنید و نتیجه ی آن قرار گیری تمام عناصر آرایه در Item های ListView خواهد بود. اما در هر صورت بد نیست کمی با نحوه ی عملکرد این تابع آشنا شوید تا در صورت نیاز و برای ایجاد ListView های پیچیده تر بتوانید آن را تغییر دهید. در این تابع یک متغیر از نوع ArrayList داریم که عناصر آن از نوع HashMap هستند. در واقع تصور کنید آرایه ای داریم که هر عنصر آن دو رشته را در خود جای می دهد و این عناصر به صورت کلید، مقدار هستند. کلید هر کدام از این عناصر رشته ی ثابت “name” و مقدار آن یکی از اعضای آرایه ی رشته ایِ ورودی به این تابع است. دلیل استفاده از List اینست که برای نسبت دادن عناصر به ListView باید از این عنصر استفاده کنیم و نمی توان به طور مستقیم یک آرایه را به ListView نسبت داد.

در قسمت بعدی یک SimpleAdapter ایجاد کرده ایم. این دستور یک آداپتر ایجاد می کند و متغیرهایی را به عنوان آرگومان سازنده ی خود می پذیرد. از جمله ی این متغیرها یکی List پر شده با عناصر کلید مقدار آرایه و دیگری فایل list.xml که لایه قرار گیری آیتم های لیست ویو است می باشد. دو متغیر دیگر یعنی from و to دو آرایه هستند که بیان می کنند کدام یک از کلید ها به کدام شی در لایه list.xml نسبت داده شود. در خط بعدی ListView را از فایل activity_main.xml آدرس دهی می کنیم و به آن متصل می شویم و در نهایت در دستور بعدی با setAdapter مقدار آداپتور ساخته شده را به List View نسبت می دهیم. اما ماجرا به همین جا ختم نمی شود و ما قصد داریم که کاربر با لمس هر کدام از عناصر ListView به یک Avtivity دیگر هدایت شود و متن داستان را ببینید. به همین منظور یک setOnItemClickListener ایجاد کرده ایم و این تابع با لمس هر کدام از عناصر لیست فراخوانی می شود و شماره ی عنصر را با شروع از صفر در آرگومان position قرار می دهد. مثلا با لمس اولین عنصر لیست عدد ۰ در متغیر position قرار خواهد گرفت. در داخل این تابع بایستی Activity دوم یعنی Activity2.java را فراخوانی کنیم. در خصوص کد Activity2.java بعدا صحبت می کنیم. فعلا همینقدر بدانید که کار آن نمایش متن داستان است. برای فراخوانی این اکتیویتی بایستی ابتدا یک اینتنت ایجاد کنیم. به همین منظور با دستور new یک Intent جدید به نام myIntent ایجاد می کنیم و در آرگومان کلاس سازنده ی آن یک ارجاع به فایل جاری و نام اکتیویتی ایی را که باید فراخوانی شود به صورت Activity2.class می نویسیم. دقت داشته باشید که در اینجا بجای پسوند java باید پسوند class را بنویسیم. برای ارجاع به فایل جاری هم از دستور ()getBaseContext استفاده کرده ایم. این دستور معادل this می باشد که در داخل برخی توابع تودرتو بدلیل اینکه this ارجاع به همان تابع را برمی گرداند مجبور به استفاده از ()getBaseContext هستیم تا به context اصلی فایل اکتیویتی دسترسی پیدا کنیم. Context هم به معنای زمینه است.

پس از ایجاد اینتنت براحتی می توانیم با دستور startActivity آن را فراخوانی کنیم و پنجره ی جدید را برای کاربر باز کنیم. اما قصد داریم تا در ضمن فراخوانی شماره ی فهرست را هم برای اکتیویتی جدید ارسال کنیم تا بر اساس آن، متن داستان مورد نظر را نمایش دهد. برای این منظور قبل از فراخوانی Intent از دستور putExtra استفاده می کنیم. در این دستور می توانیم یک رشته به صورت کلید – مقدار برای اینتنت دیگر ارسال نماییم. البته می توان تعداد زیادی putExtra با کلید – مقدار های متفاوت بدنبال یکدیگر قرا داد و اطلاعات زیادی را به اینتنت دیگر ارسال نمود. ما برای کلید رشته ی دلخواه “str1” را می نویسیم و در بخش مقدار هم متغیر position را به رشته تبدیل کرده و ارسال می نماییم. در نهایت با دستور startActivity فایل Activity2.java باز خواهد شد.

فایل Activity2.java:

این فایل پس از لمس هر یک از آیتم های لیست ویو باز می شود. همانطوریکه در تصویر زیر ملاحظه می فرمایید ظاهر این فایل بسیار ساده بوده و در تابع onCreate بلافاصله پس از اجرای super.onCreate که از توابع داخلی و برای حفظ حالت در هنگام چرخش گوشی می باشد، با دستور Toast مقدار متغیر position دریافت شده از ListView نمایش داده می شود. برای دریافت این متغیر که به همراه کلید “str1” ارسال شده است بایستی از دستور getIntent().getStringExtra(“str1”) استفاده کنیم. خروجی این دستور عدد position به صورت یک رشته می باشد. سپس با استفاده از دستور switch این عدد را ابتدا به Integer تبدیل کرده سپس بر اساس مقدار آن یکی از فایل های لایه ui1.xml یا ui2.xml و … را فراخوانی می کنیم. فایل های xml لایه هایی هستند که هر یک از آنها شامل یک داستان می باشد. ما با استفاده از این روش پیچیدگی استفاده از دیتابیس را کنار گزاشته ایم و بدلیل مانور بیشتری که می توان روی لایه های xml ایجاد کرد از این روش برای ساخت کتاب ها و کاتالوگ های کوچک و باکیفیت استفاده می کنیم.

فایل ui1.xml:

این فایل محتوای داستان اول را در خود جای داده است. این فایل از یک RelativeLayout تشکیل شده است که در داخل آن در ابتدا یک TextView برای نمایش عنوان داستان به صورت ثابت در بالای صفحه قرار گرفته است. سپس یک ScrollView در زیر TextView جای گزاری شده است. اسکرول ویو لایه ای است که می توان محتوای بسیار زیادی (طولانی تر از نمایشگر گوشی) در آن قرار داد. Scroll view تقریبا شبیه به list view می باشد. با این تفاوت که لیست ویو فقط برای نمایش آیتم های داخلش بکار می رود و باید از طریق بخش کد و ایجاد آداپتور مقدار دهی شود ولی ScrollView براحتی در داخل فایل xml رابط کاربری قرار می گیرد و می توان هر چیزی را در داخل آن قرار داد. البته ScrollView فقط می تواند یک فرزند داشته باشد و سایر مطالب را بایستی در داخل فرزند آن قرار داد. به همین دلیل یک RelativeLayout را به عنوان فرزند برای اسکرول ویو قرار می دهیم و در داخل آن محتوای داستان را که از چند TextView و ImageView تشکیل شده است جایگزاری می کنیم.

سورس کتاب با اندرويد

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:layoutDirection="ltr" 
    tools:context=".MainActivity"> 
 
 
    <TextView 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:textAppearance="?android:attr/textAppearanceLarge" 
        android:text="@string/cat_title" 
        android:textColor="#0000ff" 
        android:id="@+id/textView2" 
        android:layout_alignParentTop="true" 
        android:layout_centerHorizontal="true" /> 
 
 
    <ScrollView 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:id="@+id/scrollView" 
        android:layout_below="@+id/textView2" 
        android:layout_centerHorizontal="true" > 
 
        <RelativeLayout 
            android:layout_width="match_parent" 
            android:layout_height="wrap_content"> 
 
 
            <TextView 
                android:layout_alignParentTop="true" 
                android:text="@string/cat1" 
                android:layout_width="match_parent" 
                android:layout_alignParentRight="true" 
                android:layout_marginTop="5dp" 
                android:layout_marginRight="5dp" 
                android:layout_height="wrap_content" 
                android:textColor="#000000" 
                android:gravity="right" 
                android:id="@+id/textView" /> 
 
            <ImageView 
                android:layout_width="wrap_content" 
                android:layout_height="wrap_content" 
                android:id="@+id/imageView" 
                android:layout_below="@+id/textView" 
                android:layout_centerHorizontal="true" 
                android:src="@drawable/pic1" /> 
 
            <TextView 
                android:layout_below="@+id/imageView" 
                android:text="@string/cat2" 
                android:layout_width="match_parent" 
                android:layout_alignParentRight="true" 
                android:layout_marginTop="5dp" 
                android:layout_marginRight="5dp" 
                android:layout_height="wrap_content" 
                android:textColor="#ff0000" 
                android:gravity="right" 
                android:id="@+id/textView3" /> 
 
            <ImageView 
                android:layout_width="wrap_content" 
                android:layout_height="wrap_content" 
                android:id="@+id/imageView2" 
                android:layout_below="@+id/textView3" 
                android:layout_centerHorizontal="true" 
                android:src="@drawable/pic2" /> 
 
            <TextView 
                android:layout_below="@+id/imageView2" 
                android:text="@string/cat3" 
                android:layout_width="match_parent" 
                android:layout_alignParentRight="true" 
                android:layout_marginTop="5dp" 
                android:layout_marginRight="5dp" 
                android:layout_height="wrap_content" 
                android:textColor="#000000" 
                android:gravity="right" 
                android:id="@+id/textView4" /> 
 
            <ImageView 
                android:layout_width="wrap_content" 
                android:layout_height="wrap_content" 
                android:id="@+id/imageView3" 
                android:layout_below="@+id/textView4" 
                android:layout_centerHorizontal="true" 
                android:src="@drawable/pic3" /> 
 
        </RelativeLayout> 
    </ScrollView> 
 
 
</RelativeLayout>

 

نکته ی قابل توجه در این فایل اینست که ما بطور مستقیم در خصیصه ی android:text متن داستان را ننوشته ایم. به طور مثال عباراتی شبیه به string/cat1@ در داخل این خصیصه ها قرار گرفته است. منظور از این عبارت اینست که محتوای متنی این شی در فایل strings و در کلید cat1 قرار گرفته است. بعنوان یک قانون استفاده از این روش اجباریست و نوشتن مستقیم رشته در داخل فایل xml یا java یک ضعف برنامه نویسی تلقی می شود. نوشتن رشته ها در فایل strings.xml سبب می شود که سیستم بر اساس نوع زبان گوشی، رشته ی فارسی یا انکلیسی یا غیره را به طور خودکار در برنامه جایگزین کند و بدین صورت می توانید برنامه های بین المللی بنویسید که بصورت خودکار به زبان محلی کاربر تنظیم شود. برای آشنایی با strings.xml بخش بعدی را ملاحظه فرمایید. (توجه: فایل strings.xml بصورت جمع و با s در انتها نوشته شده در حالی که ارجاع به آن بصورت مفرد string/cat1@ صورت می گیرد، از این قبیل موارد در اندروید زیاد به چشم می خورد که باید بسیار دقت کنید).

فایل strings.xml:

فایل strings.xml در پوشه ی res/values قرار دارد. قبل از تغییر این فایل روی پوشه ی res راست کلیک کرده و یک Directory جدید به نام values-fa بسازید. سپس فایل strings.xml را از res/values به داخل res/values-fa کپی کنید. بلافاصله خواهید دید که عکس پرچم ایران در کنار این فایل ظاهر می شود! (توجه: این مراحل در فایل دانلود شده انجام شده است و نیازی نیست که مجددا این کارها را انجام دهید و صرفا برای آموزش روش ایجاد این فایل بیان شده است).

هم اکنون دو فایل strings.xml معمولی و strings.xml دارای پرچم ایران با یکدیگر لینک شده اند و به هم اتصال دارند. برای ایجاد و یا تغییر رشته ها یکی از این فایل ها را باز کرده و از بالای پنجره ی باز شده بر روی Open editor کلیک کنید. Editor کار ایجاد و ویرایش فایل های رشته ای را راحت تر می کند. در این ویرایشگر برای ایجاد یک کلید جدید کافیت روی علامت + بالای صفحه کلیک کنید و برای ویرایش هر فیلد نیز روی آن فیلد کلیک کنید تا در پایین صفحه فیلد قابل ویرایش باز شود.

فایل مانیفست AndroidManifest.xml:

این فایل ویژگی های هر اکتیویتی را تعریف می کند. ویژگیهایی از قبیل آیکن، تم، نام عنوان، جهت راست به چپ یا برعکس و غیره. علاوه بر این در این فایل بایستی Activity هایی که در برنامه ایجاد شده اند معرفی گردند. نظر به اینکه ما در این پروژه از دو اکتیویتی استفاده کرده ایم، بایستی فایل Activity2.java را در مانیفست تعریف کنیم. به همین روی در این فایل یک تگ به نام activity ایجاد کرده ایم که در داخل تگ اصلی application قرار گرفته است و در آن مشخصات اصلی اکتیویتی خود از قبیل عنوان (android:label) و نام (android:name) را تعریف کرده ایم. همچنین تگ دیگری به نام intent-filter در داخل این تگ قرار گرفته است که شامل دو تک action و category می باشد. تگ action برای اکتیویتی هایی که بعد از اکتیویتی پیشفرض و اصلی اضافه می کنیم همیشه بایستی به شکل ir.apdroid.Activity2 یعنی نام پکیچ با تغییر در عنصر سوم باشد. بدین صورت که نام پکیج را می نویسیم و عنصر آخر آن را که در این پروژه simplebook می باشد پاک کرده و نام فایل Activity2 را بجای آن قرار می دهیم. این نام در واقع آدرس فایل Activity2 در پکیج اپلیکیشن ما می باشد. تگ category نیز برای اکتیویتی های اضافه شده همیشه عبارت android.intent.category.DEFAULT می باشد. به تگ های اکتیویتی اصلی برنامه نگاه کنید. هر دو تگ آن متفاوت با اکتیویتی های اضافه شده است. سیستم عامل گوشی با بررسی مانیفست و از روی تگ های داخل intent-filter می تواند اکتیویتی اصلی (android.intent.action.MAIN) و شاخه ی اصلی خود اجرا شونده (android.intent.category.LAUNCHER) را شناسایی کند و به محض لمس آیکن اپلیکیشن، Activity اصلی را به کاربر نمایش دهد. سایر اکتیویتی هایی که در داخل برنامه با دستور startActivity فراخوانی می شوند بایستی مطابق با الگوی پیاده شده در شکل زیر باشند. در صورتی که فراموش کنید اکتیویتی خود را به مانیفست اضافه نمایید در صورت اجرای دستور startActivity با force close مواجه خواهید شد.

فایل مانیفست همچنین برای قرار گیری مجوز ها (uses-permission) می باشد. مجوزها به شما قابلیت دسترسی به امکانات خاص گوشی مثل sms، اینترنت، سنسورها و … را می دهند و در ضمن به هنگام نصب برنامه به کاربر نمایش داده می شوند. در خصوص مجوزها می توانید سایر سورسهای اندروید را ببینید چرا که پروژه ی جاری به مجوز خاصی نیاز ندارد. در صورتی که در برنامه ای بخواهید مثلا فایلی را از مموری کارت بخوانید ولی مجوز خواندن از حافظه ی خارجی را در برنامه ی خود قرار ندهید این کار با شکست مواجه خواهد شد و برنامه فورس کلوز می دهد. از جمله مشکلات اکلیپس اینست که اگر از تابعی استفاده کنید که نیاز به مجوز خاصی داشته باشد هیچ هشداری در کامپایل برنامه نمی دهد ولی برنامه ی شما اجرا نخواهد شد. اما در Android studio به محض اینکه از تابعی استفاده کنید که نیاز به مجوز داشته باشد، بلافاصله آن خط را هایلایت کرده و نام مجوز را به شما گوشزد می کند.

ویرایش فایل build.gradle:

در هر پروژه دو فایل build.gradle وجود دارد. یکی در داخل پوشه ی gradle و دیگری در داخل پوشه ی app. ما همیشه با فایل موجود در داخل پوشه ی app کار می کنیم و آن را ویرایش خواهیم کرد. پس از باز کردن این فایل، ظاهری مطابق با شکل زیر را مشاهده خواهید کرد. در این فایل عباراتی با مقادیری در جلوی آنها وجود دارد که برای تنظیم خصوصیات اپلیکیشن بکار می رود. اولین عبارت compileSdkVersion است که در جلوی آن عدد ۲۳ نوشته شده است. این عبارت نسخه ی API Level اندرویدی را نشان می دهد که برنامه ی ما با آن کامپایل می شود. نسخه ۲۳ همان اندروید ۶ است. عبارت buildToolsVersion هم نسخه ی ابزار buildTools را نمایش می دهد. عبارت minSdkVersion بسیار مهم است و حداقل API Levelی را نشان می دهد که اپلیکیشن قادر به نصب روی آن خواهد بود. نسخه ی ۸ همان اندروید ۲٫۲ است. سعی کنید همیشه این عدد را روی ۷ یا ۸ قرار دهید تا برنامه ی شما روی تمام گوشی ها نصب شود. فراموش نکنید که همه از اندروید ۴ یا ۵ استفاده نمی کنند. هنوز هم خیلی ها از گوشی های پرقدرتی مثل Galaxy S II با سیستم عامل Android 2.3 استفاده می کنند. targetSdkVersion نسخه ی سیستم عامل هدف است که برنامه را برای آن می نویسید سعی کنید همیشه بالاترین نسخه ی ممکن را در جلوی آن قرار دهید.

عبارت بعدی versionCode می باشد. این عدد همیشه بصورت یک عدد صحیح (بدون ممیز) بوده و نسخه برنامه شما را نشان می دهد. هر گاه بخواهید Application خود را بروزآوری کنید بایستی پس از اعمال تغییرات لازم در اپلیکیشن، این عدد را یک رقم افرایش داده و سپس اپ خود را در اندروید مارکت ها بارگزاری نمایید. در این صورت اندروید مارکت برنامه ی شما را در لیست برنامه های آپدیت شده به کاربر نمایش می دهد. versionName هم رشته ایست که اندروید مارکت به کاربر نشان می دهد. این عدد لزوما با versionCode یکی نیست و می توانید این را بصورت اعشاری و دهم به دهم بالا ببرید یا اصلا نام دلخواه خود را بصورت فارسی یا لاتین در داخل آن بنویسید. مثلا ممکن است versionCode برنامه شما ۱ باشد و versionName آن “گل سرخ”. البته اگر می خواهید رسمی کار کنید بایستی مباحث major و minor را در آیین نسخه بندی برنامه ها فرابگیرید و عددی مثل “۱٫۰٫۴”را برای versionName برگزینید و بسته به اینکه تغییرات حاصله در برنامه اساسی بوده یا فقط ظاهر آن تغییر کرده است و یا اپ شما کلاً دوباره نویسی شده است یکی از اعداد را بالا ببرید. (اکثر برنامه های رسمی گوگل از این روش نسخه گزاری استفاده می کنند).

توجه داشته باشید که در این فایل همیشه از API Level استفاده می شود نه عددی که ما بعنوان نسخه سیستم عامل می شناسیم. مثلا عدد ۸ به معنای API Level 8 است که همان اندروید ۲٫۲ می باشد و ۲۳ به معنای اندروید نسخه ۶٫۰ – در جدول زیر می توانید رابطه ی بین Android Version و API Level ها را مشاهده فرمایید:

Android Versions and API Levels نسخه هاي اندرويد

در این برنامه با مباحث اصلی اندروید برای ساخت یک کتاب ساده آشنا شدید. تقریباً از هم اکنون می توانید برنامه های خود را نوشته و در مارکتهای زیر قرار دهید:

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

 

دانلود سورس کد کتاب اندرویدی

 

منبع: http://apdroid.ir

درباره بهزاد

باید دنیا را کمی بهتر از آنچه تحویل گرفته ای،تحویل دهی خواه با فرزندی خوب؛ خواه با باغچه ای سرسبز؛ خواه با اندکی بهبود شرایط اجتماعی. و اینکه بدانی اگر حتی فقط یک نفر با بودن تو ساده تر نفس کشیده است، یعنی تو موفق بوده ای...

پاسخی بنویسید

آدرس ایمیل شما منتشر نمی شود.فیلدهای الزامی علامت گذاری شده اند. *

*