
مقدمه:
در قسمت قبل یکی از فرمهای مهم این برنامه طراحی و توضیح داده شد، و به عنوان تمرین، ساخت سایر فرمها در نظر گرفته شد. در این قسمت برنامه نویسی فرم ساخته شده در قسمت قبل آورده خواهد شد و برنامه نویسی باقی قسمتها بر عهده شما خواهد بود.
تصویر متحرک پروژه نهایی:
alt
آموزش:
با توجه به پروژه ساخته شده در جلسه قبل که UnitConverter نام داشت و پکیج اصلی آن com.uncocoder.course.project.unitconverter بود و با فرض اینکه تمرین ساخت سایر ui ها انجام داده اید ( فایلهای xml متناسب بوجود آمده اند ) کارهای زیر را انجام دهید:
» یک کلاس زیر کلاس Activity با نام DistanceActivity در پکیج اصلی بسازید، و آنرا به شکل زیر edit کنید، کد زیر را بخوبی مطالعه کنید. در این لحظه کد قابل اجرا نیست و نیاز به تغییرات دیگری داریم که بعد از کد نوشته شده است. اما شما آنرا خط به خط بخوانید و با کمک comment های فارسی کل کار این کد را خوب خواهید فهمید.
package com.uncocoder.course.project.unitconverter;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.onclickListener;
import android.view.View.onfocusChangeListener;
import android.widget.Button;
import android.widget.EditText;
/* تعریف یک کلاس زیر کلاسی از اکتیویتی */
public class DistanceActivity extends Activity {
/* تعریف یک فیلد از کلاس رابط گرافیک که در زیر توضیح داده شده */
private Ui mUi = null;
/* ساخت یک کلاس خصوصی جهت قرار دادن عناصر رابط گرافیک و دسترسی آسان به آن */
private class Ui {
/* اشاره گرها به ریسورسهای تعریف شده در فایل رابط گرافیک */
private Button btn_convert;
private Button btn_reset;
private Button btn_retu;
private EditText edt_meter;
private EditText edt_centimeter;
private EditText edt_inch;
/* ذخیره کردن یک اشاره گر به همین اکتیویتی جهت دسترسی در آینده */
private Activity mActivity;
/* تعریف کانستراکتور برای کلاس فوق الذکر */
public Ui(Activity activity) {
/* نگه داشتم نسخه ای از اشاره گر به این اکتیویتی در بدو ساخت این کلاس */
mActivity = activity;
/* اجرای متدی جهت الصاق ریسورس های رابط گرافیک به اشاره گرهای جاوا که پیشتر در کلاس تعریف شدند */
assignControls();
/* اجرای متدی جهت تعریف عملکرد عناصر رابط گرافیک از جمله دکمه ها */
initializeEvents();
}
/* تعریف متدی جهت الصاق ریسورس های رابط گرافیک به اشاره گرهای جاوا که پیشتر در کلاس تعریف شدند */
private void assignControls() {
btn_reset = (Button) mActivity.findViewById(R.id.btn_reset);
btn_retu = (Button) mActivity.findViewById(R.id.btn_retu);
btn_convert = (Button) mActivity.findViewById(R.id.btn_convert);
edt_meter = (EditText) mActivity.findViewById(R.id.edt_meter);
edt_centimeter = (EditText) mActivity.findViewById(R.id.edt_centimeter);
edt_inch = (EditText) mActivity.findViewById(R.id.edt_inch);
}
/* تعریف متدی جهت تعریف عملکرد عناصر رابط گرافیک از جمله دکمه ها */
public void initializeEvents() {
/* تعیین عملکرد کلیک روی دکمه زیر */
btn_reset.setonclickListener(new onclickListener() {
@Override
public void onclick(View v) {
/* با زدن کلیک ریست هر سه کنترل ورود عدد خالی می شوند */
edt_meter.setText("");
edt_centimeter.setText("");
edt_inch.setText("");
}
});
/* تعیین عملکرد کلیک روی دکمه زیر */
btn_retu.setonclickListener(new onclickListener() {
@Override
public void onclick(View v) {
/* با زدن کلیک بازگشت این اکتیویتی بسته می شود */
mActivity.finish();
}
});
/* تعیین عملکرد کلیک روی دکمه زیر */
btn_convert.setonclickListener(new onclickListener() {
@Override
public void onclick(View v) {
/* اگر محتوای درون کنترل مربوط به متر پر باشد آنگاه */
if (edt_meter.getText().toString().length() > 0) {
/* محتوای آنرا به عنوان یک عدد اعشاری بگیرد */
float value = Float.parseFloat(edt_meter.getText().toString());
/* محاسباتی انجام داده و سایر کنترل ها را مقدار دهی کند */
edt_centimeter.setText("" + (value * 100));
edt_inch.setText("" + (value * 100 / 2.54f));
}
/* مانند بالا با تفاوت اینکه برای سانتیمتر عددی وارد شده است */
if (edt_centimeter.getText().toString().length() > 0) {
float value = Float.parseFloat(edt_centimeter.getText().toString());
edt_meter.setText("" + (value / 100));
edt_inch.setText("" + (value / 2.54f));
}
/* مانند بالا با تفاوت اینکه برای اینچ عددی وارد شده است */
if (edt_inch.getText().toString().length() > 0) {
float value = Float.parseFloat(edt_inch.getText().toString());
edt_centimeter.setText("" + (value * 2.54f));
edt_meter.setText("" + (value * 2.54f / 100));
}
}
});
/* تعریف یک عملکرد ورود به کنترل */
onfocusChangeListener mFocusListener = new onfocusChangeListener() {
@Override
public void onfocusChange(View v, boolean hasFocus) {
btn_reset.performClick();
}
};
/* الصاق عملکرد ورود به کنترل تعریف شده در بالا به سه کنترل زیر */
edt_meter.setonfocusChangeListener(mFocusListener);
edt_centimeter.setonfocusChangeListener(mFocusListener);
edt_inch.setonfocusChangeListener(mFocusListener);
}
}
/* تعریف مقدمات اجرای یک اکتیویتی */
@Override
public void onCreate(Bundle state) {
super.onCreate(state);
/* تعیین و اتصال رابط گرافیک به این اکتیویتی */
setContentView(R.layout.form_distance);
/* ساخت یک نمونه از کلاس رابط گرافیک و ذخیره اشاره گر آن در فیلد تعریف شده */
mUi = new Ui(this);
}
}
از آنجاییکه در قسمت قبل کلاس اتوماتیک ساخته شده در پروژه را پاک کردیم پس باید یک کلاس اصلی جهت اجرای برنامه وجود داشته باشد. این کلاس معمولاً زیر کلاسی از Activity خواهد بود. ممکن است در یک پروژه چندین Activity وجود داشته باشد ( که معمولاً هم چنین است )، در این شرایط باید در برنامه ما مشخص شده باشد که کدام Activity شروع کننده نرم افزار است. پس:
برای شناساندن یک Activity جدید در برنامه ( مثلا DistanceActivity ) در AndroidManifest.xml به عنوان Content تگ Application خواهیم نوشت:
توجه داشته باشید که در قسمت android:name باید نام صحیح کلاس نوشته شود و اگر این کلاس درون پکیج اصلی برنامه باشد با یک نقطه یا حتی بدون آن شناسانده می شود، اما اگر خارج از پکیج اصلی برنامه باشد نیاز به نوشتن نام کامل پگیج قبلا از نقطه و نام کلاس خواهد بود.
توجه داشته باشید در صورتیکه یک کلاس زیر کلاس Activity تعریف شود اما در Manifest شناسانده نشود برنامه بدون دلیل موجهی Crash خواهد کرد. پس حتماً هر زیر کلاس Activity را در Manifest بشناسانید.
تا اینجا Activity یا Activity ها به برنامه شناسانده شدند اما کدامیک شروع کننده نرم افزار است؟ برای تعیین این موضوع به Content اکتیویتی مورد نظر این خطوط را اضافه کنید:
بطور مثال یک برنامه که دارای دو Activity به نامهای DistanceActivity و TimeActivity است، همچنین DistanceActivity شروع کننده نرم افزار هست به شکل زیر خواهد بود:
» با توجه به مطالب فوق و به ترتیب که گفته شد کد Manifest را بگونه ای تغییر دهید که یک Activity شروع کننده به نام DistanceActivity داشته باشیم ( که کار راحتی است و فقط با حذف خطوط مربوط به TimeActivity حاصل می شود. )
» برنامه را اجرا کنید و نتیجه را آزمایش کنید. در صورتیکه با اجرای برنامه مشکل داشتید مطالب را با دقت بیشتری بخوانید و عمل کنید یا اینکه از سورس کد این قسمت جهت بررسی اشتباهات کد خود استفاده کنید. در این شرایط استفاده از نرم افزار ویندوز Beyond Compare توصیه می شود.
تمرین:
برای سایر فرمهایی را که در جلسه پیش ساخته بودید، یک Activity جدید ایجاد کرده و آنها را به Manifest بشناسانید. سپس فرم اصلی را Activity که form_main.xml را بار گذاری می کند برای Manifest مشخص کنید. در نهایت با برنامه نویسی هر فرم یک برنامه کامل را خواهید داشت.
سورس برنامه:
می توانید سورس این قسمت و قسمت قبل را از آدرس زیر دانلود کنید:
http://dl1.uncocoder.com/free/source/UnitConverter.zip
می توانید سورس تکمیل تر پروژه را ( شامل بیشتر کدها و UI ها ) را از آدرس زیر دانلود کنید:
http://dl1.uncocoder.com/free/source/UnitConverterComplete.zip
توصیه ها:
- حتماً خودتان سایر UI ها را که به عنوان تمرین قرار داده شد بسازید.
- حتماً خودتان سایر فرمها را برنامه نویسی کنید و فقط به سورس نهایی داده شده اکتفا نکنید.
- بسیار مهم است که به بیشتر خواص کنترل ها و انواع کنترل ها مسلط باشید، پس سعی کنید همه چیز را آزمایش کنید. البته در جلسات باقی این موضوع بیشتر هم توضیح داده خواهد شد.
- سعی کنید یک UI بسیار پیچیده روی یک کاغذ طراحی کنید و آنرا در Android بسازید. همینطور سعی کنید با برنامه نویسی کنترل های UI بیشتر کار کنید تا خواص آنرا بهتر بشناسید.

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