در قسمت بیست و هشتم آموزش اندروید شی ProgressBar یا نوار پیشرفت را معرفی و به طور کامل آموزش داده ایم.
این ابزار برای نمایش پیشرفت یک عملیات در حال انجام استفاده میشود.حال این عملیات میتواند در پس زمینه در حال اجرا باشد یا قابل مشاهده توسط کاربر باشد.برای مثال وقتی که در حال دانلود یک فایل هستید میتوانید کاربر را از پیشرفت آن آگاه کنیم پس باید از ProgressBar استفاده کنیم.
برای درک بیشتر یک پروژه با نام View2Prj ایجاد کرده و در فایل activity_main.xml یک شی progressBar به صورت زیر ایجاد میکنیم
<ProgressBar android:id="@+id/prg1" android:layout_width="wrap_content" android:layout_height="wrap_content"/>
حال در فایل MainActivity.java چنین کدنویسی میکنیم
package com.example.view2prj; import android.os.Bundle; import android.app.Activity; import android.os.Handler; import android.view.View; import android.widget.ProgressBar; public class MainActivity extends Activity { static int progress; ProgressBar progressBar; int progressStatus = 0; Handler handler= new Handler(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); progress=0; progressBar = (ProgressBar) findViewById(R.id.prg1); //--do some work in back ground-- new Thread(new Runnable(){ public void run() { //--do some work here-- while(progressStatus < 10){ progressStatus = doSomeWork(); } //--hides the progress bar-- handler.post(new Runnable() { public void run() { //---۰ - VISIBLE; 4-INVISIBLE; 8 - GONE--- progressBar.setVisibility(View.GONE); } }); } //--do some long running work here-- private int doSomeWork() { try{ //--simulate doing some work-- Thread.sleep(500); }catch (InterruptedException e){ e.printStackTrace(); } return ++progress; } }).start(); } }
حال برنامه را اجرا کرده و نتیجه را مطابق شکل زیر ببینید
خواهید دید که پس از ۵ ثانیه ProgressBar ناپدید خواهد شد.
حالت پیشفرض این شی به صورت indeterminate است(به صورت یک دایره در حال چرخش).این حالت برای زمانی مناسب است که زمان مشخصی برای پایان کار در نظر نگرفته باشیم برای مثال زمانی که اطلاعاتی را به یک وب سرور ارسال و منتظر دریافت پاسخ آن هستیم.اگر تنها از شی ProgressBar استفاده کنیم و دستوری در فایل جاوا برای پایان آن ننویسیم این شی مدام در حال چرخش خواهد بود.
هنگامی که برنامه اجرا میشود سیستم یک Thread از اجرا برای برنامه بنام main ایجاد میکند.این Thread بسیار مهم است چرا که آن مسئول انتقال Eventها به ابزارهای رابط کاربری مناسب مانند Event مربوط به نقاشی است
پس ما کدی را به فایل جاوای پروژه برای متوقف کردن آن درنظر گرفته ایم که از یک Thread جهت شبیه سازی یک عملیات در پس زمینه استفاده میکند.برای اینکار نیز از یک Thread و یک شی Runnable استفاده کرده ایم.متد ()run اجرای Thread را به عهده دارد که دراین مثال از متد ()doSomeWork برای شبیه سازی عملیات استفاده شده.بعد از اینکه شبیه سازی تمام شد(پس از ۵ ثانیه)از یک شی Handler برای ارسال یک پیام به Thraed جهت توقف ProgressBar استفاده میکنیم
//--do some work in back ground-- new Thread(new Runnable(){ public void run() { //--do some work here-- while(progressStatus < 10){ progressStatus = doSomeWork(); } //--hides the progress bar-- handler.post(new Runnable() { public void run() { //---۰ - VISIBLE; 4-INVISIBLE; 8 - GONE--- progressBar.setVisibility(View.GONE); } }); } //--do some long running work here-- private int doSomeWork() { try{ //--simulate doing some work-- Thread.sleep(500); }catch (InterruptedException e){ e.printStackTrace(); } return ++progress; } }).start();
وقتی عملیات تمام شد خصوصیت Visibility ابزار ProgressBar را برابر view.GONE(مقدار ۸) قرار میدهیم تا از نظرها پنهان شود.تفاوتی که بین مقدار INVISIBLE و GONE وجود دارد این است که وقتی از INVISIBLE استفاده میکنیم ProgressBar تنها پنهان میشود ولی همچنان فضایی را که در اکتیویتی اشغال کرد بود در تصرفش است.اما زمانی که از GONE استفاده میشود دیگر دراکتیویتی نیز نخواهد بود.
در این تمرین میخواهیم نوعی از ProgressBar را نمایش دهیم که کاربر را از پیشرفت عملیات در حال انجام اگاه میسازد.در همان تمرین قبل در فایل activity_main.xml شی ProgressBar را چنین تغییر میدهیم
<ProgressBar android:id="@+id/prg1" android:layout_width="wrap_content" android:layout_height="wrap_content" style="@android:style/Widget.ProgressBar.Horizontal" />
تنها مقدار style را برای تغییر ظاهر این شی اضافه کردیم حال در فایل MainActivity.java نیز خطوط پررنگ شده را اضافه میکنیم
package com.example.view2prj; import android.os.Bundle; import android.app.Activity; import android.os.Handler; import android.view.View; import android.widget.ProgressBar; public class MainActivity extends Activity { static int progress; ProgressBar progressBar; int progressStatus = 0; Handler handler= new Handler(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); progress=0; progressBar = (ProgressBar) findViewById(R.id.prg1); progressBar.setMax(200); //--do some work in back ground-- new Thread(new Runnable(){ public void run() { //--do some work here-- while(progressStatus < 100){ progressStatus = doSomeWork(); //--update the progress bar-- handler.post(new Runnable(){ public void run() { progressBar.setProgress(progressStatus); } }); } //--hides the progress bar-- handler.post(new Runnable() { public void run() { //---۰ - VISIBLE; 4-INVISIBLE; 8 - GONE--- progressBar.setVisibility(View.GONE); } }); } //--do some long running work here-- private int doSomeWork() { try{ //--simulate doing some work-- Thread.sleep(500); }catch (InterruptedException e){ e.printStackTrace(); } return ++progress; } }).start(); } }
برنامه را اجرا کرده و نتیجه را مطابق تصویر زیر مشاده کنید و خواهید دید وقتی به ۵۰درصد رسید محو میشود
برای نمایش ProgressBar در حالت عمودی نیز تنها کافی است در خصوصیت style از vertical استفاده کنیم
<ProgressBar android:id="@+id/prg1" android:layout_width="wrap_content" android:layout_height="wrap_content" style="@android:style/Widget.ProgressBar.Vertical" />
علاوه بر این حالات میتوان از ثابت های زیر استفاده کرد و نتیجه گرفت:
برای نمایش پیشرفت عملیات متد ()setProgress را فراخوانی و یک عدد که نشان دهنده مقدار پیشرفت است به آن ارسال میکنیم
//--update the progress bar-- handler.post(new Runnable(){ public void run() { progressBar.setProgress(progressStatus); }
در این مثال محدوده ۰تا ۲۰۰ قابل درج است(به وسیله متد ()setMax حداکثر مقدرا را مشخص میکنیم)اما همانگونه که مشاهده کردید شی به محض اینکه به وسط کار برسد ناپدید میشود(در حالی که هنوز متد ()doSomeWork فراخوانی میگردد و progressStatus کمتر از صد است)برای اینکه مطمین شویم که ProgressBar تا انتها میرود و ۱۰۰در صد تکمیل میشود مقدار حداکثر را برابر ۱۰۰ قرار میدهیم ویا حلقه را به صورت زیر تا ۲۰۰ تکرار میکنیم
//--do some work here-- while(progressStatus < 100){