با حمایت ما%۵
تخفیف بگیرد

logo-samandehi

برنامه نويسي اندرويد 8- پروژه « تبدیل واحد » - برنامه نویسی

مقدمه:

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

 

تصویر متحرک پروژه نهایی:

 

آموزش:

با توجه به پروژه ساخته شده در جلسه قبل که UnitConverter نام داشت و پکیج اصلی آن com.uncocoder.course.project.unitconverter بود و با فرض اینکه تمرین ساخت سایر ui ها انجام داده اید ( فایلهای xml متناسب بوجود آمده اند ) کارهای زیر را انجام دهید:

» یک کلاس زیر کلاس Activity با نام DistanceActivity در پکیج اصلی بسازید، و آنرا به شکل زیر edit کنید، کد زیر را بخوبی مطالعه کنید. در این لحظه کد قابل اجرا نیست و نیاز به تغییرات دیگری داریم که بعد از کد نوشته شده است. اما شما آنرا خط به خط بخوانید و با کمک comment های فارسی کل کار این کد را خوب خواهید فهمید.


  1. package com.uncocoder.course.project.unitconverter;
  2.  
  3. import android.app.Activity;
  4. import android.os.Bundle;
  5. import android.view.View;
  6. import android.view.View.OnClickListener;
  7. import android.view.View.OnFocusChangeListener;
  8. import android.widget.Button;
  9. import android.widget.EditText;
  10.  
  11. /* تعریف یک کلاس زیر کلاسی از اکتیویتی */
  12. public class DistanceActivity extends Activity {
  13.  
  14.     /* تعریف یک فیلد از کلاس رابط گرافیک که در زیر توضیح داده شده */
  15.     private Ui mUi = null;
  16.  
  17.     /* ساخت یک کلاس خصوصی جهت قرار دادن عناصر رابط گرافیک و دسترسی آسان به آن */
  18.     private class Ui {
  19.  
  20.         /* اشاره گرها به ریسورسهای تعریف شده در فایل رابط گرافیک */
  21.         private Button   btn_convert;
  22.         private Button   btn_reset;
  23.         private Button   btn_return;
  24.  
  25.         private EditText edt_meter;
  26.         private EditText edt_centimeter;
  27.         private EditText edt_inch;
  28.  
  29.         /* ذخیره کردن یک اشاره گر به همین اکتیویتی جهت دسترسی در آینده */
  30.         private Activity mActivity;
  31.  
  32.  
  33.  
  34.         /* تعریف کانستراکتور برای کلاس فوق الذکر */
  35.         public Ui(Activity activity) {
  36.             /* نگه داشتم نسخه ای از اشاره گر به این اکتیویتی در بدو ساخت این کلاس */
  37.             mActivity = activity;
  38.  
  39.             /* اجرای متدی جهت الصاق ریسورس های رابط گرافیک به اشاره گرهای جاوا که پیشتر در کلاس تعریف شدند */
  40.             assignControls();
  41.  
  42.             /* اجرای متدی جهت تعریف عملکرد عناصر رابط گرافیک از جمله دکمه ها */
  43.             initializeEvents();
  44.         }
  45.  
  46.  
  47.  
  48.         /* تعریف متدی جهت الصاق ریسورس های رابط گرافیک به اشاره گرهای جاوا که پیشتر در کلاس تعریف شدند */
  49.         private void assignControls() {
  50.             btn_reset = (Button) mActivity.findViewById(R.id.btn_reset);
  51.             btn_return = (Button) mActivity.findViewById(R.id.btn_return);
  52.             btn_convert = (Button) mActivity.findViewById(R.id.btn_convert);
  53.  
  54.             edt_meter = (EditText) mActivity.findViewById(R.id.edt_meter);
  55.             edt_centimeter = (EditText) mActivity.findViewById(R.id.edt_centimeter);
  56.             edt_inch = (EditText) mActivity.findViewById(R.id.edt_inch);
  57.         }
  58.  
  59.  
  60.  
  61.         /* تعریف متدی جهت تعریف عملکرد عناصر رابط گرافیک از جمله دکمه ها */
  62.         public void initializeEvents() {
  63.             /* تعیین عملکرد کلیک روی دکمه زیر */
  64.             btn_reset.setOnClickListener(new OnClickListener() {
  65.  
  66.                 @Override
  67.                 public void onClick(View v) {
  68.                     /* با زدن کلیک ریست هر سه کنترل ورود عدد خالی می شوند */
  69.                     edt_meter.setText("");
  70.                     edt_centimeter.setText("");
  71.                     edt_inch.setText("");
  72.                 }
  73.             });
  74.  
  75.             /* تعیین عملکرد کلیک روی دکمه زیر */
  76.             btn_return.setOnClickListener(new OnClickListener() {
  77.  
  78.                 @Override
  79.                 public void onClick(View v) {
  80.                     /* با زدن کلیک بازگشت این اکتیویتی بسته می شود */
  81.                     mActivity.finish();
  82.                 }
  83.             });
  84.  
  85.             /* تعیین عملکرد کلیک روی دکمه زیر */
  86.             btn_convert.setOnClickListener(new OnClickListener() {
  87.  
  88.                 @Override
  89.                 public void onClick(View v) {
  90.                     /* اگر محتوای درون کنترل مربوط به متر پر باشد آنگاه */
  91.                     if (edt_meter.getText().toString().length() > 0) {
  92.  
  93.                         /* محتوای آنرا به عنوان یک عدد اعشاری بگیرد */
  94.                         float value = Float.parseFloat(edt_meter.getText().toString());
  95.  
  96.                         /* محاسباتی انجام داده و سایر کنترل ها را مقدار دهی کند */
  97.                         edt_centimeter.setText("" + (value * 100));
  98.                         edt_inch.setText("" + (value * 100 / 2.54f));
  99.                     }
  100.  
  101.                     /* مانند بالا با تفاوت اینکه برای سانتیمتر عددی وارد شده است */
  102.                     if (edt_centimeter.getText().toString().length() > 0) {
  103.                         float value = Float.parseFloat(edt_centimeter.getText().toString());
  104.                         edt_meter.setText("" + (value / 100));
  105.                         edt_inch.setText("" + (value / 2.54f));
  106.                     }
  107.  
  108.                     /* مانند بالا با تفاوت اینکه برای اینچ عددی وارد شده است */
  109.                     if (edt_inch.getText().toString().length() > 0) {
  110.                         float value = Float.parseFloat(edt_inch.getText().toString());
  111.                         edt_centimeter.setText("" + (value * 2.54f));
  112.                         edt_meter.setText("" + (value * 2.54f / 100));
  113.                     }
  114.                 }
  115.             });
  116.  
  117.             /* تعریف یک عملکرد ورود به کنترل */
  118.             OnFocusChangeListener mFocusListener = new OnFocusChangeListener() {
  119.  
  120.                 @Override
  121.                 public void onFocusChange(View v, boolean hasFocus) {
  122.                     btn_reset.performClick();
  123.                 }
  124.             };
  125.  
  126.             /* الصاق عملکرد ورود به کنترل تعریف شده در بالا به سه کنترل زیر */
  127.             edt_meter.setOnFocusChangeListener(mFocusListener);
  128.             edt_centimeter.setOnFocusChangeListener(mFocusListener);
  129.             edt_inch.setOnFocusChangeListener(mFocusListener);
  130.         }
  131.     }
  132.  
  133.  
  134.  
  135.     /* تعریف مقدمات اجرای یک اکتیویتی */
  136.     @Override
  137.     public void onCreate(Bundle state) {
  138.         super.onCreate(state);
  139.  
  140.         /* تعیین و اتصال رابط گرافیک به این اکتیویتی */
  141.         setContentView(R.layout.form_distance);
  142.  
  143.         /* ساخت یک نمونه از کلاس رابط گرافیک و ذخیره اشاره گر آن در فیلد تعریف شده */
  144.         mUi = new Ui(this);
  145.     }
  146.  
  147. }

 

از آنجاییکه در قسمت قبل کلاس اتوماتیک ساخته شده در پروژه را پاک کردیم پس باید یک کلاس اصلی جهت اجرای برنامه وجود داشته باشد. این کلاس معمولاً زیر کلاسی از 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 مشخص کنید. در نهایت با برنامه نویسی هر فرم یک برنامه کامل را خواهید داشت.

 

مطالب مرتبط

آخرین شرکتهای طرف قرارداد

دارولند

طراحی فروشگاه اینترنتی

آف مکس

طراحی سایت تخفیف گروهی

نمایندگان بیمه ما

طراحی وب سایت و پورتال نمایندگان

پژند الکترونیک

طراحی وب سایت و پرتال

نمایندگی بوش

طراحی وب سایت شرکتی

ایران بزرگ

طراحی وب سایت، اتوماسیون اداری و خدمات شبکه پایگاه خبری ایران بزرگ

ستون فقرات تهران

طراحی پورتال تخصصی پزشکی ستون فقرات تهران

آخرین توییت ها

آخرین مقالات آموزشی

استفاده از تکنولوژی روز دنیا در شرکت فناوران راتا رایان