پس از فراخوانی موفقیت آمیز کلاس Button در آموزش قسمت چهل و دوم، در این آموزش در ادامه ساخت اپلیکیشن "ذکر شمار مادر بزرگ" قصد داریم تا به معرفی متدهای مرتبط با کلاس Button در اندروید بپردازیم. در حقیقت با استفاده از متدهای مرتبط می بایست به اپلیکیشن خود دستور دهیم تا زمانیکه روی دکمه کلیک شد چه کاری را انجام دهد.
برای شروع کار پروژه ای که تحت عنوان My Prayer Counter ایجاد کردیم را باز کرده و همانگونه که در آموزش گذشته توضیح دادیم فایل MainActivity.java را در محیط برنامه نویسی اکلیپس باز می کنیم:
-
package com.behzadmoradi.myprayercounter;
-
import android.app.Activity;
-
import android.os.Bundle;
-
import android.widget.Button;
-
import android.widget.TextView;
-
public class MainActivity extends Activity {
-
/** Called when the activity is first created. */
-
int counter;
-
@Override
-
public void onCreate(Bundle savedInstanceState) {
-
super.onCreate(savedInstanceState);
-
setContentView(R.layout.main);
-
counter = 0;
-
TextView tView = (TextView) findViewById(R.id.txt_textTwo);
-
Button btn = (Button)findViewById(R.id.btn_buttonOne);
-
}
-
}
همانگونه که در کد فوق می بینیم موفق شده ایم تا یک شیئ از روی کلاس Button که در SDK اندروید قرار دارد تحت عنوان btn بسازیم. حال از آنجا که کلاس Button را به اپلیکیشن خود import کرده ایم می توانیم به کلیه متدهای مرتبط با این کلاس دسترسی داشته باشیم. از این رو اول نام شیئ ساخته شده از روی کلاس Button را نوشته سپس یک نقطه قرار داده و همانطور که در تصویر زیر مشخص است به کلیه متدهای مرتبط با کلاس Button دسترسی خواهیم داشت. چنانچه بخواهیم دکمه ای پس از آنکه روی آن کلیک شد کاری انجام دهد به متدی تحت عنوان setOnClickListener نیاز داریم. در واقع اگر بخواهیم این متد را به صورت تحت الفظی ترجمه می کنیم بایستی بگوییم که این متد معادل است با "اگر دکمه فشار داده شد به حرف کاربر گوش بده و یه کاری انجام بده" :
همانگونه که در تصویر فوق مشخص است پس از نوشتن نام شیئی که از روی کلاس Button ایجاد کردیم و قرار دادن یک نقطه و نوشتن ابتدای نام متد مد نظر و فشردن هم زمان کلیدهای Ctrl و Space پنجره ای باز خواهد شد که کلیه متدهای مرتبط با کلاس Button را به ما نشان خواهد داد. اکنون متد مد نظر را از این لیست پیدا نموده و روی آن کلیک می کنیم. حال کد ما به شکل زیر در خواهد آمد:
در حقیقت آنچه که مابین دو پرانتز این متد قرار می گیرد به عنوان پارامتر این متد خواهد بود. به طور کلی می توان گفت که ما در حال حاضر هیچ گونه OnClickListener یی نداریم پس بایستی یکی برای این دکمه بسازیم. از این روی کلید واژه new را نوشته یک فاصله قرار داده سپس عبارت View را نوشته و کلید های Ctrl و Space را به صورت هم زمان فشار می دهیم:
همانطور که در تصویر فوق نشان داده شده است می بایست روی گزینه ای که حاوی View.OnClickListener است کلیک کنیم. در واقع از آنجا که متد OnClickListener بخشی از کلاس View است، می بینیم که ابتدا کلاس View نوشته شده و این متد به آن ضمیمه شده است:
همانطور که در کد فوق با یک فلش قرمز رنگ مشخص شده است، کلاس View به برنامه ما Import شد. جایی که با یک دایره قرمز رنگ نشان داده شده است به منزله نقطه پایانی جایی است که متدهای مرتبط با کلاس Button در آن قرار گرفته و قرار است به محض کلیک شدن روی دکمه کاری انجام دهند. اگر به داخل دایره خوب توجه کنیم می بینیم که دور پرانتز نقطه چین قرار گرفته است و این نقطه چین حاکی از آن است که مشکلی در ارتباط با این متد وجود دارد. با قرار دادن نشانگر موس خود روی نقطه چین با تصویر زیر مواجه خواهیم شد:
عبارتی که در باکس زرد رنگ وجود دارد حاکی از آن است که می بایست یک علامت ; در آن نقطه قرار داده تا دستور ما تکمیل شود. حال با قرار دادن یک علامت ; پس از پرانتز خواهیم دید که مشکل بر طرف خواهد شد:
تا اینجای کار موفق شده ایم تا متدهای لازم برای عملکرد یک دکمه را وارد برنامه کنیم. در واقع اگر به کد فوق نگاهی بیندازیم خواهیم دید که دارای یک کامنت است. محل قرارگیری این کامنت جایی است که می بایست دستورات مد نظر خود را به منظور عملی شدن آنها نوشت. به عبارت دیگر متدی تحت عنوان onClick که از جنس void است به منزله جایگاهی است که قرار است دستورات ما را در مورد دکمه اجرا کند. اکنون از آنجا قرار است هر بار که ذکری گفتیم یکبار روی دکمه کلیک کنیم تا یک واحد به تعداد ذکرها اضافه شود نیاز است تا کد خود را به شکل زیر تکمیل کنیم:
-
package com.behzadmoradi.myprayercounter;
-
import android.app.Activity;
-
import android.os.Bundle;
-
import android.view.View;
-
import android.widget.Button;
-
import android.widget.TextView;
-
public class MainActivity extends Activity {
-
/** Called when the activity is first created. */
-
int counter;
-
@Override
-
public void onCreate(Bundle savedInstanceState) {
-
super.onCreate(savedInstanceState);
-
setContentView(R.layout.main);
-
counter = 0;
-
TextView tView = (TextView) findViewById(R.id.txt_textTwo);
-
Button btn = (Button) findViewById(R.id.btn_buttonOne);
-
btn.setOnClickListener(new View.OnClickListener() {
-
-
@Override
-
public void onClick(View v) {
-
counter++;
-
-
}
-
});
-
}
-
}
در واقع داخل متد onClick نام متغیر خود را نوشته و دو علامت به علاوه پس از آن قرار می دهیم و در نهایت یک علامت ; می نویسیم. این خط از کد یک واحد به مقدار متغیر counter اضافه می کند. به عنوان راه کار جایگزین می توانیم از دستور counter = couner +1; نیز استفاده کنیم (به منظور آشنایی با اعمال Operator ها به سری آموزش های برنامه نویسی جاوا در سایت نردبان آموزش هشتم مراجعه نمایید). در واقع پس از وارد کردن کلاس TextView به اپلیکیشن خود به کلیه متدهای این کلاس دسترسی خواهیم داشت. یکی از متدهایی که در این اپلیکیشن استفاده خواهیم کرد متد setText است که این وظیفه را دارا است تا متنی را به یک TextView اختصاص دهد. حال کد خود را به صورت زیر تکمیل می کنیم:
همانطور که در تصویر فوق می بینیم ابتدا نام TextView خود را نوشته سپس یک نقطه قرار داده و متد setText را می نویسیم. اگر در تصویر فوق دقت کنیم می بینیم که دوره tView نقطه چین قرار گرفته است. برای اینکه ببینیم اکلیپس با چه مشکلی رو به رو شده است، نشانگر موس خود را روی tView قرار می دهیم:
همانطور که در باکس زرد رنگ مشخص است، از آنجا که ما کلاس TextView خود را داخل کلاس تعریف نکرده بلکه داخل متد onCreate تعریف کرده ایم قابل دسترسی نیست. راه کاری که اکلیپس به ما پیشنهاد می دهد این است که tView را به final تبدیل کنیم. برای این منظور با نشانگر موس خود روی خط آبی رنگ کلیک کرده تا دستور final را عملی سازیم:
همانطور که در تصویر فوق مشخص است کلید واژه final به کلاس TextView اضافه شده است. به طور خلاصه کاری که این کلید واژه final انجام می دهد این است که کلاس TextView را محدود کرده و از این پس امکان وارثت از این کلاس از بین خواهد رفت (به منظور آشنایی بیشتر با مفهوم final به سری آموزش های زبان برنامه نویسی جاوا در سایت نردبان آموزش چهل و نهم مراجعه نمایید). به عبارت دیگر با این کار این تضمین را به اندروید خواهیم داد که هیچ کلاسی را از روی این کلاس ایجاد نخواهیم کرد. چنانچه تمایل داشته باشیم که از کلید واژه final استفاده نکنیم می توانیم کلاس TextView خود را از داخل متد onCreate به داخل کلاس MainActivity انتقال دهیم که در این صورت دیگر نیازی به نوشتن کلید واژه final نیست:
-
package com.behzadmoradi.myprayercounter;
-
import android.app.Activity;
-
import android.os.Bundle;
-
import android.view.View;
-
import android.widget.Button;
-
import android.widget.TextView;
-
public class MainActivity extends Activity {
-
/** Called when the activity is first created. */
-
int counter;
-
TextView tView;
-
@Override
-
public void onCreate(Bundle savedInstanceState) {
-
super.onCreate(savedInstanceState);
-
setContentView(R.layout.main);
-
counter = 0;
-
tView = (TextView) findViewById(R.id.txt_textTwo);
-
Button btn = (Button) findViewById(R.id.btn_buttonOne);
-
btn.setOnClickListener(new View.OnClickListener() {
-
@Override
-
public void onClick(View v) {
-
counter++;
-
tView.setText("" + counter);
-
}
-
});
-
}
-
}
همانطور که در تصویر فوق مشخص است کلاس TextView در کنار متغیر counter داخل کلاس MainActivity تعریف شده است سپس داخل متد onCreate مقداری را به آن اختصاص داده ایم. اگر به تصویر فوق خوب دقت کنیم می بینیم که متد setText نیز دارای مشکلی است و دور آن نقطه چین قرار گرفته است. در واقع علت آن است که داخل آن هیچ پارامتری قرار نداده ایم و به محض اینکه پارامتری برای آن در نظر بگیریم این مشکل برطرف خواهد شد. به طور خلاصه tView شیئی است که از روی کلاس TextView ساخته شده است. این کلاس نیز به یک TextView دیگر که در فایل XML تحت عنوان txt_textTwo ایجاد کردیم لینک شده است. متدی هم تحت عنوان setText که به tView ضمیمه شده است این وظیفه را دارا است تا هرآنچه که داخل پرانتز مقابل آن قرار گیرد را به txt_textTwo اختصاص دهد. حال از آنجا که می خواهیم با هر بار کلیک شدن روی دکمه یک واحد به متغیر counter اضافه شود پس می توانیم نتیجه بگیریم که با قرار دادن متغیر counter داخل پرانتز مرتبط با متد setText می توانیم به نتیجه مد نظر دست پیدا کنیم. اکنون کد خود را به صورت زیر تکیمل می کنیم:
-
@Override
-
public void onCreate(Bundle savedInstanceState) {
-
super.onCreate(savedInstanceState);
-
setContentView(R.layout.main);
-
counter = 0;
-
final TextView tView = (TextView) findViewById(R.id.txt_textTwo);
-
Button btn = (Button) findViewById(R.id.btn_buttonOne);
-
btn.setOnClickListener(new View.OnClickListener() {
-
@Override
-
public void onClick(View v) {
-
counter++;
-
tView.setText(counter);
-
}
-
});
-
}
حال برنامه خود را اجرا می کنیم:
با کلیک کردن روی دکمه به علاوه قصد داریم تا یک ذکر گفته شده را به شمارنده اضافه کنیم:
به محض کلیک کردن می بینیم که اپلیکیشن اصطلاحاً Crash می کند. مسلماً مشکلی وجود دارد که از آن بی خبریم. در حقیقت بنده از یک نکته غفلت کرده و آن هم اینکه پارامتر مرتبط با متد setText حتماً می بایست چیزی از جنس یک string یا نوشته باشد که در غیر اینصورت عملکرد این متد با مشکل مواجه خواهد شد. برای رفع این مشکل می توانیم یا متنی را همچون "ذکر شمار" به پارامتر داخل پرانتز اضافه نموده و یا صرفاً یک علامت " " به متغیر counter اضافه کنیم که در این آموزش راه کار دوم را مد نظر قرار خواهیم داد:
-
@Override
-
public void onClick(View v) {
-
counter++;
-
tView.setText(""+counter);
-
}
به عنوان یک قانون کلی همواره بایستی این نکته را مد نظر داشته باشیم که هرگاه چیزی از جنس یک string یا متن را به دیگر متغیرها مثلا یک int یا به عبارتی یک عدد صحیح اضافه کنیم جمع هر دوی آنها یک string یا متن خواهد بود. اکنون با دانستن این نکته که پارامتر مرتبط با متد setText می بایست یک string باشد به سادگی می توانیم دو علامت " " داخل پرانتز نوشته و یک علامت به علاوه پس آنها قرار داده و در نهایت نام متغیر خود را بنویسیم که با اینکار متد setText فکر خواهد کرد که داخل گیومه ها متنی وجود دارد که این مسئله هم می تواند درست باشد و هم نادرست. از دید اندروید درست است چرا که وجود این دو علامت را به عنوان یک متن تلقی خواهد کرد اما از دید ما نادرست است چرا که چیزی داخل گیومه ها نوشته نشده است. به هر حال این راه کاری است که از آن طریق می توان مشکل خود را حل کنیم. اکنون مجدد اپلیکیشن خود را اجرا می کنیم:
همانطور که در تصویر فوق مشاهده می کنیم، با هفت بار ذکر گفتن هفت واحد به شمارنده اضافه شده است.