<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>نوشته های گروه برنامه‌های قرمز</title><link>https://virgool.ir/feed/@redapps.org</link><description>هدف این گروه آموزش در زمینه برنامه‌نویسی و هم‌چنین تولید برنامه‌های مفید برای گوشی‌های هوشمند و تبلت مبتنی بر سیستم‌عامل‌های اندروید و آی‌اواس می‌باشد. https://redapps.org</description><language>fa</language><pubDate>2026-11-11 04:12:57</pubDate><image><url>https://files.virgool.ir/upload/users/147340/avatar/KmBx2Q.png</url><title>گروه برنامه‌های قرمز</title><link>https://virgool.ir/@redapps.org</link></image><item><title>جاوا - ویدئو ۰۱ - آماده‌سازی محیط توسعه و اجرا</title><link>https://virgool.ir/@redapps.org/جاوا-ویدئو-۰۱-آمادهسازی-محیط-توسعه-و-اجرا-nyexgrkzpoog</link><description>ویدئو ۰۱ - آماده‌سازی محیط توسعه و اجرادر طول دوره آموزش برنامه‌نویسی جاوا، از نسخه ۸ جاوا و محیط توسعه  IntelliJ IDEA استفاده شده است. این ویدئو به شما آموزش می‌دهد که چگونه  نیازمندی‌های لازم برای آماده‌سازی محیط توسعه را فراهم و بر روی سیستم خود نصب نمائید. در انتها برای اطمینان از نصب و پیکربندی صحیح، برنامه‌ ساده‌ای را نوشته و آن را کامپایل و اجرا می‌نمائیم. برای مشاهده ویدئو لطفا به سایت گروه برنامه‌های قرمز مراجعه فرمائید و یا این‌جا کلیک کنید.</description><category>گروه برنامه‌های قرمز</category><author>گروه برنامه‌های قرمز</author><pubDate>Sun, 26 Jul 2020 19:17:26 +0430</pubDate></item><item><title>پروژه‌های کاربردی در اندروید: ۳- برنامه محاسبه دنگ</title><link>https://virgool.ir/@redapps.org/پروژههای-کاربردی-در-اندروید-۳-برنامه-محاسبه-دنگ-cyppnysaewch</link><description>گروهی دوستانه برای صرف شام به رستوران می­‌روند. برای محاسبه هزینه­‌ها و مشخص کردن دنگ هر فرد در این گروه، نیاز به محاسبات دستی برای درصد انعام و تقسیم مبلغ نهایی به تعداد افراد است. برنامه Tipster برای راحتی چنین محاسباتی پیاده‌سازی شده است تا در این برنامه با کدنویسی اندروید، عناصر گرافیکی رابط کاربری و انجام محاسبات ساده آشنایی بیش­تری کسب گردد. نمایی از برنامه Tipsterتوضیحاتدر این قسمت برنامه Tipster با جزئیات کامل بررسی خواهد شد.ساخت فایل Layout  با استفاده از ویجت‌­هاهدف نهایی ساخت Layoutای مانند شکل قبل است. برای رسیدن به چنین طرحی، نیاز است که از چندین ویجت­ رابط کاربری، که در ادامه لیست شده­، استفاده کنید.TableLayout: این ویجت، عناصر نما را در یک چینش جدولی قرار می­‌دهد.TableRow: یک سطر در TableLayout تعریف می‌کند.TextView:یک برچسب متنی برای نمایش متنی در صفحه‌­نمایش است.EditText:یک فیلد متنی برای دریافت مقداری از ورودی می­‌باشد.RadioGroup:تعدادی دکمه رادیویی در قالب یک گروه ایجاد می­‌کند که در هر لحظه فقط یکی از آن­‌ها می­‌تواند انتخاب شود.RadioButton:یک دکمه رادیویی برای استفاده در RadioGroup ایجاد می‌­کند.Button:یک دکمه معمولی می‌­سازد.View:یک جداکننده با ارتفاع و رنگ مشخص برای استفاده در بین ویجت‌­های دیگر ایجاد می‌­کند.فایل Layout اصلی برنامه به نام activity_main.xml، در زمان ساخت پروژه، به صورت پیش‌­فرض ساخته شده است. کدهای زیر را به این فایل اضافه کنید. ویجت TableRow یک سطر درون TableLayout ایجاد می‌کند و بنا به نیاز برنامه هر تعدادی از این ویجت را می­‌توانید به برنامه اضافه کنید. پنج سطر برای ورودی‌­های برنامه و دکمه‌­ها ایجاد و بعد از خط جداکننده، ۳ سطر دیگر را نیز برای نمایش نتایج، به کدهای XML اضافه کنید.&lt;TableLayout   xmlns:android=&#34;http://schemas.android.com/apk/res/android&#34;  android:id=&#34;@+id/TableLayout01&#34;  android:layout_width=&#34;fill_parent&#34;  android:layout_height=&#34;fill_parent&#34;  android:stretchColumns=&#34;1&#34;&gt;   &lt;TableRow&gt;    &lt;TextView      android:id=&#34;@+id/txtLbl1&#34;      android:layout_width=&#34;wrap_content&#34;      android:layout_height=&#34;wrap_content&#34;      android:layout_column=&#34;0&#34;      android:text=&#34;@string/total_amount&#34;   /&gt;    &lt;EditText      android:id=&#34;@+id/txtAmount&#34;      android:layout_width=&#34;wrap_content&#34;      android:layout_height=&#34;wrap_content&#34;      android:layout_column=&#34;1&#34;      android:layout_span=&#34;3&#34;      android:inputType=&#34;number&#34; /&gt;  &lt;/TableRow&gt;   &lt;TableRow&gt;    &lt;TextView      android:id=&#34;@+id/txtLbl2&#34;      android:layout_width=&#34;wrap_content&#34;      android:layout_height=&#34;wrap_content&#34;      android:layout_column=&#34;0&#34;      android:text=&#34;@string/no_of_people&#34;   /&gt;    &lt;Button      android:layout_width=&#34;wrap_content&#34;      android:layout_height=&#34;wrap_content&#34;      android:=&#34;decrement&#34;      android:text=&#34;@string/minus&#34; /&gt;    &lt;EditText      android:id=&#34;@+id/txtPeople&#34;      android:layout_width=&#34;wrap_content&#34;      android:layout_height=&#34;wrap_content&#34;      android:inputType=&#34;number&#34;      android:text=&#34;@string/initial_value&#34;   /&gt;    &lt;Button      android:layout_width=&#34;wrap_content&#34;      android:layout_height=&#34;wrap_content&#34;      android:=&#34;increment&#34;      android:text=&#34;@string/plus&#34; /&gt;  &lt;/TableRow&gt;   &lt;TableRow&gt;    &lt;TextView      android:id=&#34;@+id/txtLbl3&#34;      android:layout_width=&#34;wrap_content&#34;      android:layout_height=&#34;wrap_content&#34;      android:text=&#34;@string/tip_percentage&#34; /&gt;  &lt;/TableRow&gt;   &lt;TableRow&gt;    &lt;RadioGroup      android:id=&#34;@+id/RadioGroupTips&#34;      android:layout_width=&#34;wrap_content&#34;      android:layout_height=&#34;wrap_content&#34;      android:layout_column=&#34;0&#34;      android:layout_span=&#34;3&#34;      android:checkedButton=&#34;@+id/radioFifteen&#34;      android:orientation=&#34;horizontal&#34;&gt;       &lt;RadioButton        android:id=&#34;@+id/radioFifteen&#34;        android:layout_width=&#34;wrap_content&#34;        android:layout_height=&#34;wrap_content&#34;        android:text=&#34;@string/_15prc&#34;         android:textSize=&#34;15sp&#34; /&gt;       &lt;RadioButton        android:id=&#34;@+id/radioTwenty&#34;        android:layout_width=&#34;wrap_content&#34;        android:layout_height=&#34;wrap_content&#34;        android:text=&#34;@string/_20prc&#34;         android:textSize=&#34;15sp&#34; /&gt;      &lt;RadioButton        android:id=&#34;@+id/radioOther&#34;        android:layout_width=&#34;wrap_content&#34;        android:layout_height=&#34;wrap_content&#34;        android:text=&#34;@string/other&#34;        android:textSize=&#34;15sp&#34;   /&gt;   &lt;/RadioGroup&gt;    &lt;EditText      android:id=&#34;@+id/txtTipOther&#34;      android:layout_width=&#34;fill_parent&#34;      android:layout_height=&#34;wrap_content&#34;      android:inputType=&#34;number&#34; /&gt;  &lt;/TableRow&gt;   &lt;TableRow&gt;    &lt;Button      android:id=&#34;@+id/btnReset&#34;      android:layout_width=&#34;wrap_content&#34;      android:layout_height=&#34;wrap_content&#34;      android:layout_column=&#34;2&#34;      android:text=&#34;@string/btn_reset&#34;   /&gt;     &lt;Button      android:id=&#34;@+id/btnCalculate&#34;      android:layout_width=&#34;wrap_content&#34;      android:layout_height=&#34;wrap_content&#34;      android:layout_column=&#34;3&#34;      android:text=&#34;@string/btn_calculate&#34; /&gt;  &lt;/TableRow&gt;   &lt;View    android:layout_height=&#34;2dp&#34;    android:layout_marginBottom=&#34;5dip&#34;    android:layout_marginTop=&#34;5dip&#34;    android:background=&#34;#DDFFDD&#34; /&gt;   &lt;TableRow    android:paddingBottom=&#34;10dip&#34;     android:paddingTop=&#34;5dip&#34;&gt;      &lt;TextView        android:id=&#34;@+id/txtLbl4&#34;        android:layout_width=&#34;wrap_content&#34;        android:layout_height=&#34;wrap_content&#34;        android:layout_column=&#34;0&#34;        android:text=&#34;@string/tip_amount&#34;   /&gt;      &lt;TextView        android:id=&#34;@+id/txtTipAmount&#34;        android:layout_width=&#34;wrap_content&#34;        android:layout_height=&#34;wrap_content&#34;        android:layout_column=&#34;2&#34;        android:layout_span=&#34;2&#34; /&gt;  &lt;/TableRow&gt;   &lt;TableRow    android:paddingBottom=&#34;10dip&#34;    android:paddingTop=&#34;5dip&#34;&gt;     &lt;TextView      android:id=&#34;@+id/txtLbl5&#34;      android:layout_width=&#34;wrap_content&#34;      android:layout_height=&#34;wrap_content&#34;      android:layout_column=&#34;0&#34;      android:text=&#34;@string/total_to_pay&#34;   /&gt;    &lt;TextView      android:id=&#34;@+id/txtTotalToPay&#34;      android:layout_width=&#34;wrap_content&#34;      android:layout_height=&#34;wrap_content&#34;      android:layout_column=&#34;2&#34;      android:layout_span=&#34;2&#34; /&gt;  &lt;/TableRow&gt;   &lt;TableRow    android:paddingBottom=&#34;10dip&#34;     android:paddingTop=&#34;5dip&#34;&gt;    &lt;TextView      android:id=&#34;@+id/txtLbl6&#34;      android:layout_width=&#34;wrap_content&#34;      android:layout_height=&#34;wrap_content&#34;      android:layout_column=&#34;0&#34;      android:text=&#34;@string/total_per_person&#34;   /&gt;    &lt;TextView      android:id=&#34;@+id/txtTipPerPerson&#34;      android:layout_width=&#34;wrap_content&#34;       android:layout_height=&#34;wrap_content&#34;      android:layout_column=&#34;2&#34;      android:layout_span=&#34;2&#34; /&gt;   &lt;/TableRow&gt;   &lt;/TableLayout&gt;فایل Layout برنامه Tisterجدول و سطرهاتا این مرحله به فایل activity_main.xml یک TableLayout اضافه شده است. در این جدول هر تعداد دلخواهی سطر می­‌تواند قرار گیرد و سپس ویجتٰ­های دیگری مانند دکمه‌­ها، برچسب‌­ها و فیلدهای متنی در سطرها قرار خواهند گرفت. به ویژگی­‌های android:stretchColumns، android:layout_column و  android:layout_span دقت کنید.کنترل ورودی­‌های برنامهاولین ویجت EditText برنامه (با شناسه txtAmount) برای دریافت مبلغ کل از کاربر استفاده می­‌شود. ورودی این ویجت برای دریافت مبلغ باید از جنس عدد باشد، بنابراین ویژگی android:numeric را با number مقداردهی کنید. با تنظیم این ویژگی کاربر مجاز است که فقط مقادیر عددی را وارد کند. این ویژگی را برای ویجت EditText دوم نیز که مربوط به تعداد افراد است، تنظیم کنید. با استفاده از این ویژگی­‌ها کنترل‌­های لازم بر روی ورودی، به سادگی در همان کدهای XML صورت گیرد.کدهای جاوافایل TipsterActivity.java کلاس اصلی برنامه است و نمایش Layout و مدیریت برنامه را برعهده دارد. کدهای کلاس TipsterActivity به چند بخش دسته­‌بندی می­‌شوند. در بخش ۱ و ۲، ابتدا ویجت­‌های موردنیاز را به عنوان ویژگی از کلاس تعریف کنید. سپس با کمک تابع findViewById(int id) ویجت موردنظر را دریافت کرده و در متغیر مربوط به خود ذخیره نمائید (بخش ۳ و ۶). شناسه هر ویجت در فایل Layout مشخص شده است.public class   TipsterActivity extends Activity {   final static int DEFAULT_NUM_PEOPLE   = 3;  final static NumberFormat formatter   =  NumberFormat.getCurrencyInstance();  // Section 1: Widgets in the application  private EditText txtAmount;  private EditText txtPeople;  private EditText txtTipOther;  private RadioGroup rdoGroupTips;  private Button btnCalculate;  private Button btnReset;  // Section 2  private TextView txtTipAmount;  private TextView txtTotalToPay;  private TextView txtTipPerPerson;  private int radioCheckedId = -1;   private NumberPickerLogic mLogic;   @Override  public void onCreate(Bundle   savedInstanceState) {   super.onCreate(savedInstanceState);  setContentView(R.layout.activity_main);   // Section 3  txtAmount = (EditText)   findViewById(R.id.txtAmount);  // Section 4   txtAmount.requestFocus();  txtPeople = (EditText)   findViewById(R.id.txtPeople);  txtPeople.setText(String.valueOf(DEFAULT_NUM_PEOPLE));  txtTipOther = (EditText) findViewById(R.id.txtTipOther);  rdoGroupTips = (RadioGroup)   findViewById(R.id.RadioGroupTips);  btnCalculate = (Button)   findViewById(R.id.btnCalculate);  // Section 5  btnCalculate.setEnabled(false);  btnReset = (Button)   findViewById(R.id.btnReset);  // Section 6  txtTipAmount = (TextView)   findViewById(R.id.txtTipAmount);  txtTotalToPay = (TextView)   findViewById(R.id.txtTotalToPay);  txtTipPerPerson = (TextView)   findViewById(R.id.txtTipPerPerson);   // Section 7  txtTipOther.setEnabled(false);…}}بخش اول کدهای کلاس اصلی TipsterActivityدر بخش ۴ تابع requestFocus() مشاهده می­‌شود. این تابع مربوط به کلاس View است و از آن­‌جا که ویجت EditText نیز از کلاس View مشتق شده است، برای آن نیز مناسب می­‌باشد. با استفاده از این تابع، بعد از اجرای برنامه تمرکز رابط کاربری بر روی ویجت مبلغ کل است و نشانه‌گر در این قسمت آماده دریافت داده از کاربر می­‌باشد.دکمه محاسبه از ابتدای اجرای برنامه غیرفعال است (بخش ۵ از کد، با استفاده از تابع setEnabled(Boolean enabled)). قبل از کلیک بر روی این دکمه نیاز است که اطلاعات دیگری از رابط کاربری (مانند مبلغ کل و تعداد افراد) کامل شوند، به همین دلیل این دکمه در ابتدای اجرای برنامه، غیر فعال خواهد بود.به بخش ۷ توجه کنید. فیلد متنی مربوط به وارد کردن درصد غیرفعال شده است. با اجرای برنامه به صورت پیش­‌فرض دکمه ۱۵% از گروه دکمه‌­های رادیویی فعال است و این مورد در کدهای XML با ویژگی زیر تعیین شده است.android:checkedButton=&#34;@+id/radioFifteen&#34;در صورتی که کاربر از این گروه، گزینه Other را انتخاب کند، فیلد متنی مربوط به آن نیز فعال خواهد شد.رخدادهای رابط کاربریابتدا گروه دکمه‌­های رادیویی را بررسی کنید. برنامه باید به رخدادهایی که در هر کدام از اجزای این گروه صورت می‌­گیرد، گوش دهد و طبق این رخدادها تصمیم­‌گیری نماید. گوش دادن به رخدادها با استفاده از تابع OnCheckedChangeListener() امکان­‌پذیر است.در این تابع چندین مورد باید مدیریت شود. یکی این­‌که به محض انتخاب گزینه Other توسط کاربر فیلد متنی مربوط به درصد نیز فعال شود و اگر کاربر دوباره به دو گزینه دیگر برگردد، فیلد متنی غیرفعال گردد. از طرف دیگر دکمه Calculate، فقط در صورتی که مقادیر وارد شده Total Amount و No. of People صحیح باشند و یکی از دو حالت زیر اتفاق افتد، باید فعال و در غیر این­‌صورت غیرفعال گردد:گزینه Other از گروه دکمه‌­های رادیویی انتخاب شده باشد و در فیلد متنیِ درصد نیز مقدار صحیحی وارد گردد.یکی از گزینه‌­های ۱۵% و یا ۲۰% انتخاب شده باشد.rdoGroupTips.setOnCheckedChangeListener(new   OnCheckedChangeListener() {   @Override  public void   onCheckedChanged(RadioGroup group, int checkedId) {   if (checkedId ==   R.id.radioFifteen || checkedId == R.id.radioTwenty) {  txtTipOther.setEnabled(false);   btnCalculate.setEnabled(txtAmount.getText().length() &gt; 0  &amp;&amp;   txtPeople.getText().length() &gt; 0);  }  if (checkedId == R.id.radioOther)   {   txtTipOther.setEnabled(true);  txtTipOther.requestFocus();   btnCalculate.setEnabled(txtAmount.getText().length() &gt; 0  &amp;&amp;   txtPeople.getText().length() &gt; 0  &amp;&amp;   txtTipOther.getText().length() &gt; 0);  }   radioCheckedId = checkedId;  }  });بخش دوم کدهای کلاس اصلی TipsterActivityبررسی فعالیت کلیدها در فیلدهای متنیهمان‌طور که قبلا نیز گفته شد، دکمه Calculate تا زمانی که مقدار فیلدهای متنی صحیح نباشد، نباید فعال گردد. از آن­‌جا که ویژگی android:numeric برای ویجت‌­ها تنظیم شده است، بنابراین نگرانی در مورد نوع ورودی‌­های غیرعددی ندارید. پس فقط کافی­ست که از خالی نبودن فیلدها مطمئن شوید.برای آگاهی از رخداد فشرده شدن یک کلید از رابط ایستای OnKeyListener() استفاده کنید. با استفاده از این رابط می­‌توان از رخداد قبل از این­که برای ویجت فیلد متنی ارسال شود، آگاه شد. تابع setOnKeyListener(…) را برای ویجت‌­های موردنظر فراخوانی کنید.txtAmount.setOnKeyListener(mKeyListener);txtPeople.setOnKeyListener(mKeyListener);txtTipOther.setOnKeyListener(mKeyListener);بخش سوم کدهای کلاس اصلی TipsterActivityو سپس پیاده‌­سازی تابع mKeyListener رانجام دهید.private OnKeyListener   mKeyListener = new OnKeyListener() {  @Override  public boolean onKey(View v, int   keyCode, KeyEvent event) {    switch (v.getId()) {   case R.id.txtAmount:   case R.id.txtPeople:   btnCalculate.setEnabled(txtAmount.getText().length()   &gt; 0   &amp;&amp;   txtPeople.getText().length() &gt; 0);   break;   case R.id.txtTipOther:   btnCalculate.setEnabled(txtAmount.getText().length()   &gt; 0     &amp;&amp; txtPeople.getText().length()   &gt; 0     &amp;&amp; txtTipOther.getText().length()   &gt; 0);   break;    }  return false;  }  };بخش سوم کدهای کلاس اصلی TipsterActivityدر این کد ابتدا شناسه نما بررسی می‌شود. به یاد آورید که هر ویجت یک شناسه منحصر به فرد دارد که در فایل Layout مربوط به آن (activity_mani.xml) تنظیم شده است. در گام بعدی بررسی شده است که اگر رخداد مربوط به ویجت مبلغ کل و یا تعداد افراد است، در صورت مقدار داشتن هر دو فیلد، کلید Calculate فعال گردد. سپس به سراغ گزینه Other در دکمه‌­های رادیویی رفته است. در این حالت علاوه بر شرایط قبلی، متن مربوط به درصد نیز باید مقدار داشته باشد.گوش کردن به کلیک­‌های دکمهمراحل ذکر شده در بخش قبلی را در مورد دکمه­‌های Calculate و Reset نیز پیاده­‌سازی کنید. در این بخش از رابط ایستای Listener() استفاده کنید و درون این تابع براساس شناسه دکمه، تابع calculate() و یا reset() را فراخوانی نمائید. در ادامه ابتدا تابع setListener(…) را برای دکمه­‌ها تنظیم کنید.btnCalculate.setListener(mClickListener);btnReset.setListener(mClickListener);بخش چهارم کدهای کلاس اصلی TipsterActivityسپس پیاده‌­سازی این تابع را انجام دهید.private Listener   mClickListener = new Listener() {   @Override  public void (View v) {    if (v.getId() ==   R.id.btnCalculate) {       calculate();    } else {    reset();    }   }  };بخش پنجم کدهای کلاس اصلی TipsterActivityتنظیم دوباره فیلدهازمانی که کاربر بر روی دکمه Reset کلیک می­‌کند، تمامی مقادیر فیلدهای متنی باید حذف گردد، دکمه‌­های رادیویی به مقدار پیش­‌فرض خود یعنی ۱۵% برگردد و نتیجه محاسبات نیز از رابط کاربری پاک شود.private void reset() {  txtTipAmount.setText(&#34;&#34;);  txtTotalToPay.setText(&#34;&#34;);  txtTipPerPerson.setText(&#34;&#34;);  txtAmount.setText(&#34;&#34;);  txtPeople.setText(String.valueOf(DEFAULT_NUM_PEOPLE));  txtTipOther.setText(&#34;&#34;);  rdoGroupTips.clearCheck();  rdoGroupTips.check(R.id.radioFifteen);  // set focus on the first field  txtAmount.requestFocus();  }بخش ششم کدهای کلاس اصلی TipsterActivityبررسی صحت ورودی برای محاسباتعلاوه بر محدودیت­‌هایی که در مورد مقادیر ورودی‌­های متنی اعمال کردید، بررسی دیگری نیز برای محاسبات لازم است. مقدار فیلدهای مبلغ کل، تعداد افراد و مقدار درصد انعام (در صورت فعال بودن گزینه سوم دکمه‌های رادیویی) نباید صفر باشد، زیرا در محاسبات خطای تقسیم به صفر رخ خواهد داد.بنابراین اگر کاربر برای فیلدهای موردنظر مقدار صفر را وارد کند، با استفاده از تابع showErrorAlert(String errorMessage, final int fieldId) یک پنجره Pop-up در مورد خطای صورت گرفته، به او نمایش دهید.private void calculate() {  Double billAmount =   Double.parseDouble(txtAmount.getText().toString());  Double totalPeople =   Double.parseDouble(txtPeople.getText().toString());  Double percentage = null;  boolean isError = false;  if (billAmount &lt; 1.0) {  showErrorAlert(&#34;Enter a valid   Total Amount.&#34;, txtAmount.getId());  isError = true;  }  if (totalPeople &lt; 1.0) {  showErrorAlert(&#34;Enter a   valid number of people.&#34;, txtPeople.getId());  isError = true;  }   if (radioCheckedId == -1) {  radioCheckedId =   rdoGroupTips.getCheckedRadioButtonId();  }  if (radioCheckedId ==   R.id.radioFifteen) {  percentage = 15.00;  } else if (radioCheckedId ==   R.id.radioTwenty) {  percentage = 20.00;  } else if (radioCheckedId ==   R.id.radioOther) {  percentage =   Double.parseDouble( txtTipOther.getText().toString());  if (percentage &lt; 1.0) {  showErrorAlert(&#34;Enter   a valid Tip percentage&#34;, txtTipOther.getId());  isError = true;  }  }   if (!isError) {  double tipAmount = ((billAmount   * percentage) / 100);  double totalToPay = billAmount   + tipAmount;  double perPersonPays =   totalToPay / totalPeople;   txtTipAmount.setText(formatter.format(tipAmount));  txtTotalToPay.setText(formatter.format(totalToPay));  txtTipPerPerson.setText(formatter.format(perPersonPays));  }  }بخش هفتم کدهای کلاس اصلی TipsterActivityمقدار پیش­‌فرض دکمه‌­های رادیویی ۱۵% است و در صورتی که کاربر این مقدار را تغییر دهد، شناسه دکمه مربوطه در متغیر radioCheckedId ذخیره خواهد شد. اما اگر کاربر مقدار پیش‌­فرض را تغییری ندهد، متغیر radioCheckedId دارای ارزش 1- است (مقدار اولیه متغیر). بنابراین می‌­توان با منفی بود این متغیر پی برد که دکمه رادیویی فعال همان پیش‌­فرض (۱۵%) است و یا این‌که با فراخوانی تابع getCheckedRadioButtonId()، شناسه مربوط به آن را استخراج نمود.نمایش نتایج و هشدارهامحاسبات دنگ بسیار ساده است. اگر خطایی رخ ندهد (isError = false)، محاسبات انجام شده و در ویجت‌­های فیلد متنی نمایش داده می­‌شود.در اندروید کلاسی به نام AlertDialog وجود دارد که با استفاده از آن می­‌توان یک پنجره Pop-up را برای هشدار نمایش داد. این پنجره دارای سه دکمه و یک متن است. تابع showErrorAlert() پیاده‌­سازی شده است. این تابع یک رشته به عنوان متن خطا برای نمایش به کاربر و یک شناسه مربوط به فیلدی که خطا در آن رخ داده است را به عنوان ورودی دریافت می‌­کند تا بعد از پایان نمایش پنجره خطا، نشانه‌­گر بر روی این فیلد نمایش داده شود.private void   showErrorAlert(String errorMessage, final int fieldId) {  new AlertDialog.Builder(this)  .setTitle(&#34;Error&#34;)  .setMessage(errorMessage)  .setNeutralButton(&#34;Close&#34;,  new   DialogInterface.Listener() {  @Override  public void   (DialogInterface dialog,  int which) {   findViewById(fieldId).requestFocus();  }  }).show();  }بخش هفتم کدهای کلاس اصلی TipsterActivityمی‌توانید پروژه Tipsterرا از این‌جا دانلود کنید.برای کسب اطلاعات بیش‌تر در زمینه برنامه‌نویسی اندروید می‌توانید به منابع زیر مراجعه کنید:آموزش جامع برنامه نویسی اندروید (مقدماتی)آموزش جامع برنامه نویسی اندروید (پیشرفته)پروژه های کاربردی در اندرویدمنابع الکترونیکی:آموزش جامع برنامه نویسی اندروید (مقدماتی)آموزش جامع برنامه نویسی اندروید (پیشرفته)پروژه های کاربردی در اندروید</description><category>گروه برنامه‌های قرمز</category><author>گروه برنامه‌های قرمز</author><pubDate>Thu, 12 Mar 2020 19:04:28 +0330</pubDate></item><item><title>پروژه‌های کاربردی در اندروید: ۲- شمارنده در اندروید</title><link>https://virgool.ir/@redapps.org/پروژههای-کاربردی-در-اندروید-۲-شمارنده-در-اندروید-xplgvnh8na0w</link><description>برنامه کاربردی CountDownTimer یک شمارنده معکوس است. این برنامه از یک زمان مشخص (بر حسب ثانیه) به صورت معکوس شروع به شمردن می‌­کند تا زمانی که زمان به صفر برسد. اندروید برای زمان‌­سنج معکوس یک کلاس ویژه دارد و استفاده از این کلاس ساده و کارآمد می‌­باشد.نمایی از برنامه CountDownTimerمراحل ایجاد یک کلاس شمارنده در گام­‌های زیر تشریح شده است:۱- یک کلاس جدید با ارث­‌بری از کلاس CountDownTimer ایجاد کنید. تابع سازنده این کلاس دو پارامتر ورودی دارد. پارامتر اول مدت زمان شمارنده را مشخص می‌­کند که در تابع () استفاده خواهد شد. پارامتر دوم، مدت زمان دوره­ای است که در طول فعال بودن شمارنده، اطلاعات آن به کاربر نمایش داده می­‌شود. از این پارامتر در تابع onTick() استفاده خواهد شد. هر دو پارامتر برحسب میلی‌ثانیه می‌­باشند.CountDownTimer(long millisInFuture, long countDownInterval)۲- توابع () و onTick() را بازنویسی کنید.۳- نمونهٰ‌­ای از این کلاس را در اکتیویتی اصلی اندروید ایجاد نمائید.۴- برای نمونه جدید ایجاد شده، تابع start() را فراخوانی کنید.برنامه CountDownTimer، متشکل از یک فایل Layout با کدهای XML و هم­‌چنین کدهای جاوا است. بعد از اجرای برنامه، رابط کاربری آن به شما نشان داده خواهد شد.&lt;LinearLayout   xmlns:android=&#34;http://schemas.android.com/apk/res/android&#34;     android:layout_width=&#34;fill_parent&#34;     android:layout_height=&#34;fill_parent&#34;     android:orientation=&#34;vertical&#34;&gt;     &lt;Button          android:id=&#34;@+id/button&#34;          android:layout_width=&#34;fill_parent&#34;          android:layout_height=&#34;wrap_content&#34;          android:text=&#34;@string/start&#34; /&gt;     &lt;TableLayout          android:layout_width=&#34;fill_parent&#34;          android:layout_height=&#34;wrap_content&#34;          android:layout_gravity=&#34;center&#34;          android:padding=&#34;10dip&#34;&gt;          &lt;TableRow&gt;               &lt;TextView                    android:id=&#34;@+id/timer&#34;                    android:layout_width=&#34;wrap_content&#34;                    android:layout_height=&#34;wrap_content&#34;                    android:paddingRight=&#34;10dip&#34;                    android:text=&#34;@string/time&#34; /&gt;               &lt;TextView                    android:id=&#34;@+id/timeElapsed&#34;                    android:layout_width=&#34;wrap_content&#34;                    android:layout_height=&#34;wrap_content&#34;                    android:paddingRight=&#34;10dip&#34;                    android:text=&#34;@string/time_elapsed&#34; /&gt;          &lt;/TableRow&gt;     &lt;/TableLayout&gt;&lt;/LinearLayout&gt;فایل Layout برنامه CountDownTimerpublic class MainActivity   extends Activity implements Listener {     private MalibuCountDownTimer   countDownTimer;     private long timeElapsed;     private boolean timerHasStarted =   false;     private Button startB;     private TextView text;     private TextView timeElapsedView;      private final long startTime =   50000;     private final long interval = 1000;      @Override     public void onCreate(Bundle   savedInstanceState) {          super.onCreate(savedInstanceState);          setContentView(R.layout.activity_main);          startB = (Button)   this.findViewById(R.id.button);          startB.setListener(this);           text = (TextView)   this.findViewById(R.id.timer);          timeElapsedView = (TextView)   this.findViewById(R.id.timeElapsed);          countDownTimer = new   MalibuCountDownTimer(startTime, interval);          text.setText(text.getText() +   String.valueOf(startTime));     }      @Override     public void (View v) {           if (!timerHasStarted) {                countDownTimer.start();                timerHasStarted = true;                startB.setText(&#34;Start&#34;);          } else {               countDownTimer.cancel();               timerHasStarted = false;              startB.setText(&#34;RESET&#34;);         }    }   public class MalibuCountDownTimer   extends CountDownTimer {        public   MalibuCountDownTimer(long startTime, long interval) {            super(startTime, interval);        }        @Override       public void () {          text.setText(&#34;Time&#39;s   up!&#34;);          timeElapsedView.setText(&#34;Time Elapsed: &#34; + String.valueOf(startTime));       }       @Override        public void onTick(long   millisUntilFinished) {           text.setText(&#34;Time   remain:&#34; + millisUntilFinished);           timeElapsed = startTime -   millisUntilFinished;           timeElapsedView.setText(&#34;Time Elapsed: &#34; + String.valueOf(timeElapsed));      }   } }کدهای جاوا برنامه CountDownTimerمی‌توانید پروژه CountDownTimer را از این‌جا دانلود کنید.برای کسب اطلاعات بیش‌تر در زمینه برنامه‌نویسی اندروید می‌توانید به منابع زیر مراجعه کنید:آموزش جامع برنامه نویسی اندروید (مقدماتی)آموزش جامع برنامه نویسی اندروید (پیشرفته)پروژه های کاربردی در اندرویدمنابع الکترونیکی:آموزش جامع برنامه نویسی اندروید (مقدماتی)آموزش جامع برنامه نویسی اندروید (پیشرفته)پروژه های کاربردی در اندروید</description><category>گروه برنامه‌های قرمز</category><author>گروه برنامه‌های قرمز</author><pubDate>Wed, 11 Mar 2020 13:54:41 +0330</pubDate></item><item><title>پروژه‌های کاربردی در اندروید: ۱- ساخت اولین پروژه اندروید</title><link>https://virgool.ir/@redapps.org/ساخت-اولین-پروژه-اندروید-ykg1p629yrmq</link><description>برنامه اندروید استودیو را اجرا کنید. اگر برای اولین بار است که اندروید استودیو بر روی سیستم شما اجرا می‌شود، مانند شکل ۱، صفحه خوش‌آمدگویی اندروید را مشاهده خواهید کرد.صفحه خوش‌آمدگویی اندرویددر این صفحه، گزینه Start a new Android Studio project را انتخاب کنید. در صورتی که این صفحه برای شما نشان داده نشد، یعنی شما قبلا یک پروژه در اندروید استودیو ایجاد کرده‌اید و این بار مستقیما وارد برنامه اندروید استودیو شده‌­اید. در این حالت به ترتیب گزینه‌های زیر را برای ایجاد پروژه جدید، انتخاب کنید.File → New → New Project…در اولین صفحه‌ای که می‌بینید نام پروژه و دامنه (در این مثال org.redapps) موردنظر خود را وارد کنید. نام بسته[۱] برنامه شما به org.redapps تغییر می‌کند. در نهایت محل ذخیره شدن پروژه را بر روی سیستم خود مشخص نمائید.ایجاد یک برنامه کاربردی جدیدهمان‌طور که دیدید، نام بسته برنامه برعکس دامنه سازمان تنظیم می‌شود. این روش نام‌گذاری، نام بسته‌ها را یکتا کرده و تشخیص برنامه‌ها را در یک دستگاه و یا در بازارهای اینترنتی[۲] آسان می‌کند.بر روی دکمه Next کلیک کنید. صفحه بعدی جزئیات دستگاه‌هایی را نشان می‌دهد که برنامه می‌تواند بر روی آن‌ها اجرا شود. از آن­‌جا که برنامه مخصوص گوشی‌های اندروید است، بنابراین گزینه Phone and Tablet را فعال و برای گزینه Minimum SDK مقدار API 19: Android 4.4 (KitKat) را انتخاب کنید.مشخص کردن جزئیات دستگاه‌هادر ادامه، دکمه Next را کلیک کنید. در صفحه بعد می‌توان یک الگو برای اولین صفحه برنامه انتخاب کرد. ساده‌ترین الگو یعنی Empty Activity را انتخاب کرده و بر روی دکمه Next کلیک نمائید.انتخاب یک الگو برای اکتیویتیدر آخرین صفحه، نام کلاس اکتیویتی را با مقدار TestActivity پر کنید.پیکربندی اکتیویتی جدیدگزینه Generate Layout File را فعال کنید. بعد از وارد کردن نام اکتیویتی، نام Layout به صورت خودکار activity_test انتخاب می‌شود. گزینه‌های دیگر را تغییری ندهید و در آخر بر روی دکمه Finish کلیک کنید.راهنمای نرم‌افزار اندروید استودیوپروژه جدید در اندروید استودیو ایجاد می‌شود. پنجره سمت چپ، پنجره ابزار پروژه[۳] نام دارد و تمامی فایل‌های مربوط به پروژه در این قسمت قابل مشاهده هستند. پنجره اصلی که ویرایش­‌گر نامیده می‌­شود، در وسط قرار گرفته و کدهای برنامه در این قسمت نوشته می‌شود.پروژه در اندروید استودیوشما می‌توانید بر اساس نیاز خود، پنجره‌ها را تغییر وضعیت دهید و یا پنجره‌های جدیدی باز کنید.برای کسب اطلاعات بیش‌تر در زمینه برنامه‌نویسی اندروید می‌توانید به منابع زیر مراجعه کنید:آموزش جامع برنامه نویسی اندروید (مقدماتی)آموزش جامع برنامه نویسی اندروید (پیشرفته)پروژه های کاربردی در اندروید[1] Package[2] کافه بازار، اول مارکت، Google Play و غیره[3] Project tool window</description><category>گروه برنامه‌های قرمز</category><author>گروه برنامه‌های قرمز</author><pubDate>Tue, 10 Mar 2020 16:50:04 +0330</pubDate></item></channel></rss>