آموزش اندروید، فصل ۱۸: شروع برنامه نویسی در Activity (بخش ۱)

سلام. احسان قربان نژاد هستم و از امروز در کنار دوست و همکار خوبم آقای مهندس بهزادیان نژاد عزیز سعی میکنم مطالبی در زمینه آموزش برنامه نویسی اندروید تقدیم حضور همه ی عاشقان اندروید داشته باشم.

در فصل های گذشته ما درباره واسط کاربری (UI) صحبت کردیم و یاد گرفتیم که چگونه طراحی مورد نظرمان را با المان های مختلف نظیر TextView ، ImageView ، Button ، LinearLayout ، RelativeLayout و غیره، بنا کنیم. اما این همه ماجرا نیست. بالاخره زمان آن فرا رسیده است تا سراغ اصل ماجرا برویم: برنامه نویسی.

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

javaandandroid1

اما Activity چیست؟

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

پس به عنوان برنامه نویس، اگر میخواهید برنامه تان را به کاربر نشان دهید حداقل باید در برنامه تان یک Activity قرار دهید. در فصل های قبل که طراحی صفحات XML را یاد گرفتید، در واقع نمای ظاهری Activity اصلی برنامه تان (که بصورت پیش فرض MainActivity نام گذاری شده است) را داشتید طراحی می کردید.

باید بدانید که در مدلی که حضرت گوگل برای برنامه نویسی اندروید مدنظر قرار داده است، با ایجاد اولین Activity (اینجا را ببینید) دو فایل متناظر با هم در پروژه تان ایجاد می شود. یک فایل با پسوند xml که در پوشه res/layout قرار داده میشود. و دیگری فایلی با پسوند .java که در پوشه src قرار میگیرد. (معمولا بصورت پیش فرض اولین Activity دو فایل با نام های MainActivity.java و layout_main.xml ایجاد میکند. در ادامه آموزش ما از این دو نام استفاده میکنیم. لذا اگر آنها را ندارید، اولین Activity برنامه تان را با حفظ آرامش تان، طبق لینک بالا بسازید.)

نکته:

یاد مان باشد فایل های جاوا همواره اولین حرفشان بزرگ (Capital) و فایل هایی که در پوشه res قرار میگیرند باید همواره حاوی حروف کوچک و بدون کاراکترهای غیرمجاز باشند. عدم توجه به این نکته همواره باعث ایجاد پیغام های خطای قرمزرنگی در پنجره Consule میشوند که کاری جز قدم زدن بر روی اعصاب شما ندارند. و البته این خطاها اجازه ی اجرای پروزه را هم نمی دهند. بطور خلاصه باید بدانید که همه چیز به هم میریزد. پس هرموقع دیدید همه چیز در پروژه تان به هم ریخته است، یک درصد احتمال دهید که مشکل از همینجاست.

ما در فصل های قبلی طراحی های که انجام دادیم مربوط به فایل layout_main.xml بود. گفتیم که متناظر با این فایل، MainActiviy.java نیز وجود دارد که این جلسه میخواهیم راجع به آن صحبت کنیم.

نیاز داریم تا کمی با اصطلاحات برنامه نویسی، کار را جلو ببریم. بدانید و آگاه باشید که هر فایل با پسوند .java  و بطور کل همه چیز در جاوا کلاس است. (کلاس چیست؟) پس MainActivity.java هم یک کلاس است. اگر این فایل را باز کنیم یک سری کدهای از پیش نوشته شده را میبینید.

package ir.smartlab.mysample;

import android.app.Activity;
import android.os.Bundle;

public class MainActivity extends Activity {

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

	}

}

در خط اول پکیج برنامه مشخص شده است. پکیج نام منحصر بفردی ست که برای اپ شما در نظر گرفته میشود. هر نقطه در نام یک پکیج به معنای یک فولدر در حافظه فیزیکی تان است. یعنی مثلن در این مثال پوشه src در مسیر ../ir/smartlab/mySample/ وجود دارد. بگذریم.
خطوط بعدی کتابخانه هایی ست که بر حسب نیاز باید به کلاسمان import کنیم. معمولا این کتابخانه ها به محض تعریف یک شی از یک کلاس جدید،اتوماتیک اضافه میشوند. اگر نشدند، Ctrl + shift + o را با خیال راحت بزنید تا آنهایی که اضافه نشدن، اضافه شوند.
تعریف کلاس از خط بعدی شروع میشود. ما به مباحث شی گرایی جاوا، در این آموزش کاری نداریم و فرض مان این است که آن را از منبعی دیگر خوب فرا گرفته اید. اما همین اندازه بدانید که کلاس MainActivity از بابایش یعنی Activity با کلمه کلیدی extends ارث برده شده است. این که چیزهایی را به ارث برده بعدا معلوم خواهد شد.تنها کافیست بدانید طراحان معماری اندروید، کلاس بابایی برایتان نوشته اند که چند متد کاربردی از پیش نوشته شده به همراه دارد و شما فقط باید انها را صدا بزنید (و یا بازنویسیOveride کنید.).

OnCreate، شروع ماجرا

در یک Activity همه چیز از متد OnCreate آغاز میشود. اکثر کدهایتان را بایستی در این متد بنویسید. این متد وقتی صدا زده میشود (شما نیازی نیست صدایش بزنید، بلکه خودش صدا زده خواهد شد. شما فقط باید اتفاقاتی که قرار است داخلش بیفتد را در داخلش بنویسید.)
که یک Activity ساخته میشود (هنوز به مرحله نمایش به کاربر نرسیده است ). پس جای خوبی ست تا هر دستکاری یا تعریفی را در داخل همین متد بنویسیم. یادمان باشد دو خط پیشفرض داخل آن را هیچگاه پاک نکنیم و بگذاریم همیشه آن بالا باشد.

اما OnCreate چیست؟

بیاییم کمی راجع به چرخه حیات یکActivity صحبت کنیم. شکل زیر را ببینید.

Android-Activity-Lifecycle

اندروید همه مراحل زندگی بچه ای که از بابا ارث برده شده است را کنترل میکند. یک Activity میتواند برحسب شرایط در یکی از ۶ حالت بالا باشد. این ما هستیم که تعیین می کنیم در آن حالات چه کاری باید انجام شود.

مثلا چون اولین حالت، OnCreate است، لذا تعاریف و مقداردهی های مان را آنجا قرار می دهیم. ترتیب فراخوانی ها را دقت کنید. همیشه اول onCreate بعد onStart سپس OnResume اجرا میشود. اما سه تای دیگر چه؟

طبیعتا وقتی یک Activity بسته میشود ( مثلا کاربر دکمه Back را بزند) سه مرحله دیگر هم به ترتیب صدا زده میشوند یعنی اول onPause بعد onStop و سپس OnDestroy

اما آیا همیشه این ترتیب های سه تایی هر سه پشت هم اجرا میشوند؟ نه!

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

اما کاربرد این چرخه زندگی در کجاست؟ اگر مثلا در اپ تان یک آهنگ در حال پخش دارید، بهتر است اگر کسی تماس گرفت آن را قطع کنید! خب چه جایی بهتر از OnPause ؟ و یا دوباره پس از بازگشت بخواهید آن را پخش کنید. چه جایی بهتر از onResume ؟

پیداکردن عناصر طراحی مان

همه تگ هایی که ما در فایل های xml استفارده میکردیم، متناظرشان یک کلاس جاوا وجود دارد. به همین خاطر بود که حرف اول نام تگ ها نیز حرف بزرگ بود. برای آن که ما بخواهیم یک View را از xml به کلاس Activity مان بیاوریم ( تا یک بلایی سر آن در آوریم مثلا رنگش را عوض کنیم.) بایستی از متد findViewById استفاده کنید. این متد در کلاس بابا یعنی Activity تعریف شده است و به ما ارث رسیده است.

اما چگونه؟ ابتدا می بایست شی ای هم نام با نام تگی که در xml برایش تعریف نمودیم را بسازیم و سپس خروجی متد بالا را به آن نسبت دهیم.

توجه داشته باشید که خروجی findViewById یک View است که باید به نام تگ مورد نظرمان Cast شود (مربوط است به مباحث شی گرایی و وراثت ). اگر به بیانی ساده و نه چندان فنی بخواهم بگویم، کافیست بدانید که یک جفت پرانتز قبل از متد بالا گذاشته و نوع داده ای مدنظرتان را داخل آن بنویسید)

فرض کنید فایل layout_main اکتیویتی مان به شکل زیر است:

<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"
    tools:context=".SecondActivity" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:text="@string/hello_world" />

</RelativeLayout>

حال میخواهم متن TextView ای را که در وسط صفحه قرار دارد را تغییر دهم. برای اینکار ابتدا باید آن را find کنم. اما نیاز به نشانه ای از آن دارم. مطمئن میشوم که به تگ TextView در لایه ام، Id داده ام.
Id را اینگونه نسبت میدهیم:

        android:id="@+id/textView1"

حال به راحتی میتوانم این TextView را در آن سو یعنی MainActivity.java در داخل متد onCreate دریافت کنم. به این صورت:

package ir.smartlab.mysample;

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;

public class MainActivity extends Activity {

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

		TextView t = (TextView) findViewById(R.id.textView1);
		t.setText("Android tutorials on SmartLab");

	}

}

نکته: R به تعبیری معادل همان علامت @ در فایل های xml است. هرگاه خواستید چیزی مربوط به resource هایتان دریافت کنید از R استفاده کنید. مثال:R.id ، R.drawable ، R.string ، R.raw و ..

 

به یاد داشته باشید اگر خطایی دریافت میکنید شاید بدلیل import نشدن کلاس های مورد استفاده تان باشد ( مثلا در اینجا TextView ) . با یک ctrl + shift + o  خودتان را راحت کنید و import های جامانده را اضافه کنید.

در مثال بالا ما یک TextView را پیدا کردیم و متن آن را با متد setText عوض کردیم. شما میتوانید متد setVisibility(View.GONE) را امتحان کنید که موجب پنهان شدن متن مان می شود.

 

در مطلب بعدی، بحث درباره Activity ها را با یک مثال کاربردی ادامه می دهیم. سوالات خود را تا اینجا میتوانید در قسمت نظرات بیان نمایید.

 

9 فکر می‌کنند “آموزش اندروید، فصل ۱۸: شروع برنامه نویسی در Activity (بخش ۱)

  1. sahar

    سلام من وقتی TextView t = (TextView) findViewById(R.id.textView1) را منویسم .قسمت textview1 را ارور میگیره تو پیشنهادایی هم که میده اصلن نمیاد خودم دستی وارد میکنمش.با اینکه من تو xml همه چیزو کامل و درست انجام دادم.مشکل از کجاست؟

    پاسخ
    1. احسان قربان نژاد نویسنده

      احتمالا این آیدی به فایل آر R اضافه نشده.چند حالت داره:
      ۱- داخل صفت آیدی @+id نزدید. به + دقت کنید.
      ۲- یکی از فایل های پوشه res دارای مشکل است. ( از جمله فابل xml ای که در آن قالبتان را طراحی کردید.)
      ۳- ممکن است یکی از فایل هایی که در پوشه res قرار دارد، اسمش از حروف بزرگ، فاصله، خط تیره و مابقی حروف غیر مجاز تشکیل شده باشد. همه اینها باعث میشود فایل R خراب شود.

      پاسخ

دیدگاهتان را بنویسید

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