استفاده از مفاهیم آشکار (explicit intents)
تماشای برخط [لینک مستقیم] فیلم «آموزش نحوه استفاده از مفاهیم آشکار»
زیر نویس انگلیسی [English Subtitle]
نسخه pdf این آموزش[1.75 مگابایت]
تا اینجا یاد گرفتیم که چطور با فعالیت ها (activities) کار کنیم، اگه یادتون باشه برای شروع فعالیت Dovomi از intent استفاده کردیم، کار مفهوم (intent) اینه که یه عنصری از برنامه تون رو فعال کنه.
دو نوع مفهوم (intent) وجود داره، مفاهیم آشکار و مفاهیم ضمنی یا مجازی.
با مفاهیم آشکار، یک عنصر مشخصی از برنامه رو برای فعال شدن تعیین میکنیم. مثلا میخوایم یه فعالیت(activity) دیگه رو تو برناممون اجرا کنیم، از یه مفهوم آشکار استفاده میکنیم که آشکارا به سیستم بگه میخوام اون فعالیت رو فعال(اجرا) کنم.
مفاهیم ضمنی (که تو پست بعدی بهش میپردازیم) در واقع یک پیام کلی برای سیستم میفرستن : که آیا برنامهای در سیستم عامل این گوشی وجود داره که بتونه این مفهوم رو اجرا کنه؟ اگه وجود داشته باشه لیست این برنامهها به کاربر پیشنهاد میشه و کاربر یکی رو انتخاب میکنه و از این طریق اون چیزی که با مفهوم فرستاده شده (ورودیهای intent) اجرا میشه.
خوب الان میخوایم رو مفاهیم آشکار تمرکز کنیم. برای شروع یه پروژه بسازید با دوتا فعالیت (activitie) که تو فعالیت اصلی (main) یه متنی که قابل نوشتن باشه یعنی کاربر میتونیه توش متن وارد کنه (از توی Text Fields اولی رو انتخاب کنید) و یه دکمه (برای اینکه به فعالیت دوم بره)، فعالیت دوم هم یه فیلد متنی ساده داشته باشه.(حواستون باشه که فعالیت دوم رو هم تو فایل manifest تعریف کنید).
۲.کاری که با این برنامه میخوایم بکنیم اینه که : کاربر یه متنی رو تو فیلد متنی قابل نوشتن مینویسه و دکمه رو میزنه، فعالیت دوم باز میشه و متنی که نوشته بوده رو نشون میده. یعنی میخوایم یاد بگیریم اطلاعاتی رو از یه فعالیت به فعالیت دیگه منتقل کنیم.
اول به فایل main.java می ریم و یه مرجع(اشارهگر) از دکمه و فیلد متنی میگیریم. با نوشتن این کد
EditText matn = findViewById(R.id.editText1);
یه مرجع از فیلد متنی قابل نوشتنمون میگیریم. خوب بازهم با ctrl+1 خطاهای برنامه رو درست میکنیم. (اینجا کافیه فقط cast انجام بدید.) همین کارو برای دکمه انجام میدیم.
Button d = findViewById(R.id.button1);
و برای دکمه تابع setOnclickListener رو صدا میزنیم تا کارایی که قراره با فشردن دکمه انجام بشه رو تعیین کنیم. با نوشتن این کد :
d.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
}
});
همون طور که قبلا گفته شد بعد از نوشتن new (خط اول) اگه بنویسید onclick و بعد ctrl+space رو بزنید خودش بهتون ادامهاش رو پیشنهاد میده و روی OnClickListener که کلیک کنید، بقیهاش رو خودش مینویسه.
۳.الان قصد داریم که یه intent بسازیم، همون طور که قبلا اشاره شد intent یک راه برای فعال کردن جزئی از برنامه است. پس برای اینکه یه نمونه از کلاس Intent بسازیم، مینویسیم Intent و یه اسم براش میذاریم و newاش میکنیم. (با ctrl+space، اون گزینه رو انتخاب میکنیم که مناسبه پاس کردن یه فعالیته -تو تصویر مشخصه-)
برای ورودیهای سازندهی intent، اول باید مولفهای که این درخواست رو کرده بنویسیم یعنی Main.this (که یه مرجع به این فعالیت اصلی هست). برای ورودی دوم، باید کلاس فعالیتی رو بدیم که میخوایم اجرا بشه یعنی Dovomi.class. پس کدمون اینجوری میشه :
Intent mafhoom = new Intent(Main.this, Dovomi.class);
در واقع ما میتونستیم همین قسمت (new Intent(Main.this, Dovomi.class رو به عنوان ورودی startActvity به کار ببریم (مثل آموزش قبلی) ولی این دفعه میخوایم یه چیزایی رو ضمیمهی mafhoom کنیم. چیزی که میخوایم اضافه کنیم همون متنیه که کاربر تو matn وارد میکنه. برای این کار از تابع putExtra از شی mafhoom استفاده میکنیم.
۴.ورودی اول این تابع یه رشته (String) است که به عنوان اسم اون کلیدی که میخوایم اضافه کنیم به کار برده میشه و ورودی دوم از هر نوعی میتونه باشه و ما چون اون متن رو میخوایم بفرستیم، برای ورودی دوم هم نوع رشته (String) رو انتخاب میکنیم. اسم کلید رو میذارم "matneVaredShode" و برای بازیابی اطلاعاتی که داخل matn (متنی که قراره کاربر وارد کنه) وجود داره، باید از تابع getText استفاده کنیم و اگه دقت کنید میبینید که خروجی این تابع از نوع Editable هست نه از نوع رشتهی خام پس با اضافه کردن ()toString. اونو به رشتهی خام تبدیل میکنیم.
mafhoom.putExtra("matneVaredShode", matn.getText().toString());
از matn ایراد میگیره و با زدن ctrl+1 بهمون پیشنهاد میکنه که اونو به final تغییر بدیم (چون قراره ازش تو یه کنترل کننده وقایع ناشناس استفاده کنیم).
ما اون اطلاعاتی که میخواستیم به فعالیت Dovomi بفرستیم رو به mafhoom اضافه کردیم، حالا وقتی میخوایم فعالیت جدید رو شروع کنیم، این اطلاعات براش فرستاده میشه. تابع startActivity رو استفاده میکنیم و mafhoom رو به عنوان ورودی براش میفرستیم.
startActivity(mafhoom);
۵.خوب تا اینحا دیگه کار ما با Main.java تموم میشه، حالا باید به Dovomi.java بریم و اطلاعاتی که همراه mafhoom فرستاده شده بازیابی کنیم و تو textView نشون بدیم. برای شروع اول یه مرجع از فیلد متنی میگیریم با این کد :
TextView matni = (TextView) findViewById(R.id.textView1);
برای اینکه این فیلد متنی، متن دلخواه ما رو نشون بده باید از تابع setText استفاده کنیم(هرچی به عنوان ورودی بفرستیم رو نشون میده)، برای گرفتن همون متنی رو که توسط mafhoom فرستاده شده، اول باید با getIntent مفهومی که این فعالیت رو اجرا کرده رو به دست بیاریم، و بعد از تابع getExtra برای گرفتن اطلاعات داخل intent استفاده میکنیم، که در واقع تمام اطلاعاتی که بهش داده بودیم رو برمیگردونه. اما ما فقط اون قسمتی از اطلاعاتش رو میخوایم که با کلید "matneVaredShode" مشخص شده (اگرچه در این تمرین قفط همین یدونه رو همراه mafhoom فرستادیم). و چون اون اطلاعاتی که میخوایم از نوع رشته است، از تابع getString استفاده میکنیم و کلید رو بهش میدیم.
matni.setText(getIntent().getExtras().getString("matneVaredShode"));
۶.حالا برنامه رو اجرا میکنیم و میبینیم همون متنی که تو فعالیت اصلی وارد کردیم تو فعالیت دوم نشون داده میشه :)