ساخت یک برنامه ساده برای اندروید (قسمت دوم)

شنبه ۸ شهریور ۹۳ • اشتراک گذاری در توییتر و فیسبوک

در قست قبل رابط کاربری برنامه رو ساختیم و چون بحث اصلی ما روی برنامه‌نویسی اندروید هست زیاد روی رابط کاربریمون کار نکردیم فقط در حدی که نیازمون رو برآورده کنه،شرح عملکرد برنامه که قبلا توضیح داده شد به این صورتِ که:

در این پروژه ما قصد داریم یک اپ اندروید درست کنیم که یک عدد دلخواه رو از ما بگیره و به توانی که ما میخوایم برسونه،مثلا عدد ۲ رو به توان ۳ برسونه،نحوه کلی کارکرد این برنامه به این صورت هستش که دو ورودی از کاربر میگیره،ورودی‌ها رو چک میکنه که خالی نباشن و در صورت خالی بودن پیغام مناسب رو روی صفحه نمایش بده و در صورت وارد کردن مغادیر درست اون وروردی‌ها رو محاسبه کنه و جواب رو به ما نشون بده

برای برنامه‌نویسی عملکرد این برنامه قصد داریم از ساخت یک متُد و استفاده اون در برنامه و تبدیل متغیرها به همدیگه،نحوه معتبرسازی فیلدها در اندروید (به طور ساده) استفاده کنیم.

معرفی کنترل‌ها

برای ساخت رابط کاربریمون از ۴ نوع کنترل استفاده کردیم (به تمام عناصری که در ساخت رابط کاربری برنامه دخیل هستند و چیزی را نمایش میدهند کنترل میگوییم)،برای استفاده از این کنترل‌ها در برنامه باید اونها رو معرفی کنیم در غیر اینصورت دسترسی بهشون نمیتونیم داشته باشیم.
برای معرفی کنترل‌ها به این صورت عمل میکنیم:


// view
EditText edtNumOne = (EditText) findViewById(R.id.edtNumOne);
EditText edtPow = (EditText) findViewById(R.id.edtPow);
Button btnResult = (Button) findViewById(R.id.btnResult);
TextView txtShowResult = (TextView) findViewById(R.id.txtShowResult);

در این کد چهار قسمتی در ابتدا نوع کنترل رو مینویسیم ( EditText )،اسمی به دلخواه برای کنترل تعیین میکنیم ( edtNumOne )،کنترل رو کَست میکنیم ((EditText) فعلا در این آموزش کَست کردن رو توضیح نمیدم) و کنترل مورد نظرمون رو توسط findViewById بهش معرفی میکنیم،آدرس توی findViewById نشانگر محل کنترلمونه : R = res

setOnClickListener

پس از معرفی کنترل‌ها به برنامه نیاز داریم که وقتی کاربر بر روی دکمه تاچ یا کلیک کرد یه سری کارها انجام بشه،برای اینکار باید از setOnClickListener استفاده کنیم،به این صورت که نام دکمه مورد نظرمون رو مینویسیم و setOnClickListener رو برای اون دکمه صدا میزنیم:


btnResult.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
//area code
}
});

نکته: در اکلیپس برای کامل کردن کُد میتونید از کلیدهای ترکیبی Ctrl + Space استفاده کنید،به این صورت که نام کنترل یا متغیر رو نوشته و با گذاشتن . و زدن Ctrl + Space توابع مربوطه برای استفاده رو مشاهده و انتخاب کنید.
نکته: به این توجه داشته باشید که در قسمت بالای صفحه کتابخانه setOnClickListener به برنامه اضافه شده باشه کُد کتابخانه:


import android.view.View.OnClickListener;

در غیر اینصورت اکلیپس از ما ایراد میگیره،میتونید به طور دستی این قطعه کُد رو اضافه کنید یا با نگه داشتن انتخابگر ماوس بر روی کُد گذینه Import OnClickListener رو انتخاب کنید تا خود اکلیپس کتابخونه رو وارد کنه.

اعتبارسنجی فیلدهای ورودی‌

برای عملیات روی ورودی‌ها ما حتما نیاز به اعتبارسنجی داریم که کاربر به اشتباه ورودی که مدنظر ما نیست رو وارد نکنه یا اینکه اون وروردی رو خالی بزاره که در این صورت ممکنه برنامه ما کِرَش کنه و متوقف بشه پس در ابتدای کار چک میکنیم وروردی‌هامون خالی فرستاده نشده باشند،برای اعتبار سنجی ما از قواعد شرطی if استفاده کردیم،که به این صورت نوشته میشود:


if(شرط){
// عمل انجام شده در صورت درست بودن شرط   
}
else{
// عمل انجام شده در صورت غلط بودن شرط   
}

پس با توجه به نحوه نوشتن if کُد برنامه رو به این صورت مینویسیم:


// validation input field
if (edtNumOne.getText().toString().equals("")) {
txtShowResult.setText("Number One Is Empty!");
return; // exit if()
}
if (edtPow.getText().toString().equals("")) {
txtShowResult.setText("Power Is Empty!");
return; // exit if()
}
else {
//area code
}

در کُد بالا ما برای شرط از edtNumOne.getText().toString().equals استفاده کردیم که getText().toString باعث میشه به ورودی فیلد edtNumOne دسترسی پیدا کنیم و اون رو به یک رشته متنی تبدیل کنیم و با استفاده از equals میتونیم تعیین کنیم که انتظار داریم ورودی ما چه چیزی باشه که در این کد من از ("") استفاده کردم به معنی اینکه اگر ورودی ما خالی بود یه سری کارها رو انجام بده.
توسط txtShowResult.setText متنی رو به عنوان خطای خالی بودن فیلد به کاربر نشون میدیم که setText برای نوشتن متن یا کلمه‌ای بر روی یک کنترل استفاده میشه و در آخر توسط return از شرط خارج میشیم و فیلد دوم رو هم مانند فیلد اول اعتبار سنجی میکنیم.
برنامه در ابتدا وارد شرط اول میشه و فیلد اولی رو چک میکنه و اگر فیلد خالی بود پیغام خطا رو نشون میده در غیر اینصورت به شرط دوم میره و اون رو چک میکنه و اگر فیلد دوم خالی بود پیغام خطا رو به کاربر نشون میده در غیر اینصورت وارد else میشه و ادامه عملکرد برنامه رو در پیش میگیره.
تا اینجای کار ما از خالی نبودن فیلدهای ورودیمون اطمینان حاصل کردیم و انتظار داریم دو عدد در ورودی از کاربر دریافت کنیم و اعداد رو ذخیره کنیم و محاسبات رو انجام بدیم پس کُد رو به اینصورت کامل میکنیم:


// validation input field
if (edtNumOne.getText().toString().equals("")) {
txtShowResult.setText("Number One Is Empty!");
return; // exit if()
}
if (edtPow.getText().toString().equals("")) {
txtShowResult.setText("Power Is Empty!");
return; // exit if()
} else {
// convert String to int
int numberOne = Integer.parseInt(edtNumOne.getText().toString());
// convert String to int
int numberPow = Integer.parseInt(edtPow.getText().toString());
int result = power(numberOne, numberPow);
txtShowResult.setText("Result : " + result); // show result for user
}

برای ذخیره اعداد در جاوا از int که مخفف کلمه integer هست استفاده میکنیم ولی مشکلی که وجود داره اینه که ما نمیتونیم یک رشته متنی از نوع string رو توی یک متغیر عددی از جنس int ذخیره کنیم (در بالا هنگامی که توسط getText().toString ورودی‌ها رو دریافت میکنیم به string تبدیل میشوند) پس باید رشتمون رو به حالت عددی برای متغیر int تبدیل کنیم که این کار توسط Integer.parseInt انجام میشه، و اون رو درون متغیری به نام دلخواهمون numberOne ذخیره میکنیم،عدد دوم رو هم به همین صورت در یک متغیر به نام numberPowذخیره میکنیم،در اینجا اکلیپس از ما میخواد که کنترل‌های مورد استفاده در این قسمت رو به final تبدیل کنیم (در آموزش‌های آینده توضیح داده میشه) به این صورت:


// view
final EditText edtNumOne = (EditText) findViewById(R.id.edtNumOne);
final EditText edtPow = (EditText) findViewById(R.id.edtPow);
Button btnResult = (Button) findViewById(R.id.btnResult);
final TextView txtShowResult = (TextView) findViewById(R.id.txtShowResult);

یک متغیر عددی به نام result (به معنای نتیجه) درست میکنیم و نتیجه محاسبه توسط متُد power رو در اون ذخیره میکنیم.

استفاده از متُد

تا اینجای کار ما فیلدها رو چک کردیم و در صورت خالی نبودن دو عدد (اولین فیلد به عنوان عدد دلخواه هست و دومین فیلد به عنوان عدد توان) رو دریافت کردیم،اونها رو جداگانه از string که رشته متنی هست به int که عددی هست تغییر دادیم و هر کدوم رو توی دو متغیر به نام‌های عدد اول و عدد توان ذخیره کردیم،حالا باید عملیات به توان رسوندن عدد رو توسط یک متُد انجام بدیم،نحوه نوشتن یک متد به صورت زیر است:


public int sampleMethod(int a, int b){
return c;   
}

به این صورت که ما دو عدد به نام‌های a و b رو دریافت میکنیم،یک سری عملیات روی اونها انجام میدیم و نتیجه رو در متغیری به نام c ذخیره میکنیم و توسط return c متغیر c رو از متُد خارج میکنیم.
با توجه به روش نوشتن متُد کد زیر رو برای انجام محاسبه مینویسیم:


// start power method
public int power(int numberOne, int numberPow) { // sample: two to the power of 4
int power = numberOne; // power = 2
for (int i = 1; i < numberPow; i++) {
power = numberOne * power;
// power = 2 x 2 = 4
// power = 4 x 2 = 8
// power = 8 x 2 = 16
}
return power;
}

یک متُد به اسم power درست میکنیم و برای ورودی‌های اون دو عددی رو که قبلا در دو متغیر به نام‌های numberOne و numberPow ذخیره کرده بودیم تعیین میکنیم،یک متغیر به اسم power مسازیم و مقدار تغیر numberOne رو بهش اختصاص میدیم.
نیاز به یک حلقه for داریم،از حلقه for ، زمانی استفاده می شود که می خواهیم مجموعه دستورالعمل‌های حلقه به تعداد دفعات معینی انجام شود
این حلقه در هنگام تعریف ۳ پارامتر اصلی دارد:
مقدار اولیه متغیر: به وسیله این مقدار،مقدار اولیه برای شروع شمارنده حلقه تعیین می شود.
عبارت کنترلی: در این قسمت یک عبارت کنترلی مرتبط با شمارنده حلقه تعیین می شود ، که در هر بار اجرای مجدد حلقه ، شرط عبارت کنترل شده و در صورت برقرار بودن شرط ، دستورات حلقه اجرا می شود.
گام افزایش یا کاهش: در این قسمت،میزانی که متغیر شمارنده حلقه،در هر بار اجرای دستورات آن افزایش یا کاهش می یابد را تعیین می کنیم.
نحوه عملکرد این حلقه به صورت زیر است :
در این حلقه،از یک متغیر به عنوان شمارنده یا کنترل کننده حلقه استفاده می شود.این متغیر در ابتدای اجرای حلقه،مقدار دهی اولیه شده و اجرای مجدد حلقه با یک عبارت شرطی کنترل شده که در صورت درست بودن شرط،دستورات حلقه یکبار اجرا می شود و با هر بار اجرای حلقه متغیر حلقه به اندازه گام تعیین شده،افزایش یا کاهش می یابد .
شکل کلی تعریف یک حلقه for به صورت زیر است :


for( گام افزایش یا کاهش  ; تعیین عبارت کنترلی   ; تعیین مقدار اولیه متغیر )
{
دستورات بدنه حلقه
} 

پس با دونستن این روش ما در حلقه خودمون یک متغیر i با مقدار اولیه ۱ درست میکنیم،از numberPow به عنوان عبارت کنترلی استفاده میکنیم و تعیین میکنیم i تا زمانی به افزایش خودش ادامه بده که کوچکتر از مقدار ذخیره شده در numberPow باشه،برای گام حلقه توسط ++ در کنار متغیر i تعیین میکنیم که i یکی‌یکی افزایش پیدا کنه و در دستور حلقه هم توسط * متغیر numberOne رو در power ضرب میکنیم و نتیجه اون رو دوباره درون متغیر power ذخیره میکنیم،در آخر هم توسط return power مقدار نهایی متغیر power رو به بیرون از متُد انتقال میدیم.
نکته: چون این قسمت از آموزش شاید برای بعضی‌ها گیج کننده باشه من توی خود کُد یک مثال رو خط به خط جلو بردم که نحوه کار و انجام شدنش رو بیشتر متوجه بشید.
قبلا در کدهای بالا تعیین کردیم که نتیجه نهایی عملیات متُد power درون متغیری به نام result ذخیره بشه،حالا وقته اینه که نتیجه عملیات خودمون رو توسط کنترل txtShowResult به کاربر نشون بدیم،برای این کار کُد زیر رو مینویسیم:


txtShowResult.setText("Result : " + result); // show result for user

قبلا هم گفتیم که توسط setText میتونیم بر روی کنترلی متن یا جمله‌ای بنویسیم پس متغیر result رو درون setText میذاریم تا نتیجه نهایی رو بر روی صفحه به کاربر نشون بده.
کد نهایی برنامه ما در آخر باید به این صورت در اومده باشه:


package me.imohamad.power_calculation;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;


public class PowerCalculation extends Activity {

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

// view
final EditText edtNumOne = (EditText) findViewById(R.id.edtNumOne);
final EditText edtPow = (EditText) findViewById(R.id.edtPow);
Button btnResult = (Button) findViewById(R.id.btnResult);
final TextView txtShowResult = (TextView) findViewById(R.id.txtShowResult);

// start setOnClickListener() for btnResult
btnResult.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View arg0) {
// validation input field
if (edtNumOne.getText().toString().equals("")) {
txtShowResult.setText("Number One Is Empty!");
return; // exit if()
}
if (edtPow.getText().toString().equals("")) {
txtShowResult.setText("Power Is Empty!");
return; // exit if()
} else {
// convert String to int
int numberOne = Integer.parseInt(edtNumOne.getText().toString());
// convert String to int
int numberPow = Integer.parseInt(edtPow.getText().toString());
int result = power(numberOne, numberPow);
txtShowResult.setText("Result : " + result); // show result for user

}
}


// start power method
public int power(int numberOne, int numberPow) { // sample: two to the power of 4
int power = numberOne; // power = 2
for (int i = 1; i < numberPow; i++) {
power = numberOne * power;
// power = 2 x 2 = 4
// power = 4 x 2 = 8
// power = 8 x 2 = 16
}
return power;

}
});

    }
}

نکته: محاسبات ریاضی در برنامه‌نویسی گیج کنندست که تسلط پیدا کردن روی اون‌ها فقط با تمرین زیاد به دست میاد.
نکته: متُدها رو میشه به روشهای مختلف نوشت و متُدهای مختلفی وجود دارند که به دلیل طولانی شدن آموزش نمیشد همه‌ی اونها رو شرح داد.
نکته: چون آموزش طولانی میشد نتونستم که دلیل نوشتن کلمه public در ابتدای متُد رو شرح بدم،در آموزش‌های آینده به طور کامل شرح داده میشه.
نکته: زبان جاوا به بزرگی و کوچکی حروف حساسه،به بزرگی و کوچکی حروف دقت کنید.
این برنامه رو میتونید از اینجا دانلود و توی اکلیپس وارد کنید.

نوشته شده در آموزش ، اندروید

مرتبط با برچسب‌های ، ، ،



شنبه ۱۳ تیر ۹۴ • نوشته شده توسط مرتضی

با عرض سلام و خسته نباشید
من برنامه تون رو اکسپورت کردم ولی ران نمیشه

شنبه ۱۸ اردیبهشت ۹۵ • نوشته شده توسط sami

سلام
طراحی وب سایتت خیلی باحاله جدا دمت گرم
اما سوال: چطور میشه از دوتا تکست باکس مقدار رو گرفت و روی انها عملیات ریاضی انجام داد و جواب اونا در یک تکست باکس دیگه نمایش داده بشه
فرض کن تکست باکس ها ۱ و تکست باکس ۲ برای گرفتن مقدار و یک button برای کلیک انجام عملیات و در اخر تکست باکس ۳ برای نمایش جواب
کلا توی رویداد کلیک button چی بنویسم
ممنون میشم راهنمایی کنید

چهارشنبه ۲۲ اردیبهشت ۹۵ • نوشته شده توسط محمدرضا

باید مثل همین برنامه عمل کن، فقط بجای آیدی TextView آیدی EditText رو بنویست، همین.

پنجشنبه ۱۷ تیر ۹۵ • نوشته شده توسط شهرام

ممنون خوب بود

یکشنبه ۲۰ تیر ۹۵ • نوشته شده توسط اندیشه پویان

سپاس بابت توضیحات کاملتون

شنبه ۶ خرداد ۹۶ • نوشته شده توسط maryam

سلام. متشکرم از توضیحات زیباتون . اگه بخوایم شرط اینو بزاریم ک ۱۰ تا عدد بگیره و اگه بیشتر یا کمتر بود ارور بده چطور باید شرطشو بنویسیم

سه شنبه ۳۰ خرداد ۹۶ • نوشته شده توسط eli

بسیار عالی توضیح دادید دست مریزاد
من همین برنامه را برای جمع دو عدد نوشتم اما بعد از اینکه دکمه را کلیک می کنم که جواب را نشان بدهد کرش می کند .لطفا پاسخ دهید