ProgressBar Nedir?
ProgressBar, senkron ya da asenkron olarak yapılan bir işlemin durumunun gösterildiği bileşendir. Yandaki resimde gördüğünüz gibi bir görüntüsü vardır.
Bilmemiz Gereken Public Metodları
[blockquote ] Örneklerde, progressBar ismindeki değişkenin oluşturulduğunu varsaydım. Örnek Uygulama kısmında bu değişkenin nasıl oluşturduğunu görebilirsiniz. [/blockquote]1- void setMax(int max)
Bu metod, ProgressBar‘ın maximum değerini belirlememizi sağlar. Maximum değer, varsayılan olarak 100’dür. Değiştirmek için bu metod kullanılır. Kullanımı şu şekildedir;
[syntax type=”html|php|js|css”]progressBar.setMax(60);[/syntax]
2- void setProgress(int progress)
Bu metod, ProgressBar‘ın anlık değerini belirlemek için kullanılır. Kullanımı şu şekildedir;
[syntax type=”html|php|js|css”]progressBar.setProgress(0);[/syntax]
3- void setIndeterminate(boolean indeterminate)
Bu metod ise, ProgressBar’ın yanda gördüğünüz gibi sürekli tekrar eden bir animasyon şeklinde olup olmayacağını ayarlamak içindir. Kullanımı şu şekildedir;
[syntax type=”html|php|js|css”]progressBar.setIndeterminate(false);[/syntax]
Örnek Uygulama
Şimdi de örnek bir uygulama ile bu bileşenin kullanımını iyice anlayalım.
Öncelikle her zamanki gibi bir proje oluşturalım ve uygulamamıza başlayalım.
Uygulama İçeriği
Uygulamamızda, 1 dakikalık bir kronometre olacak. Bu kronometrenin kontrolünü sağlamak için başlatma, durdurma, sıfırlama gibi işlemleri gerçekleştirebilecek butonlar bulunacak. Evet, hemen uygulamayı hazırlamaya başlayalım.
Layout’un Hazırlanması
activity_main.xml dosyamızı açıyoruz ve tasarım kısmına (Graphical Layout)geçiyoruz. Burada Form Widgets sekmesi altından iki tane TextView, üç tane Button ve bir tane de ProgressBar‘ı sürükle bırak mantığıyla Linear Layout‘umuzun içerisine alıyoruz. Layouts sekmesi altından da bir tane Horizontal Linear Layout alıyoruz ve butonları bu layout‘un içine koyuyoruz.
Şimdi, XML kısmını aşağıdaki gibi düzenliyoruz.
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_margin="10dp" android:orientation="vertical" > <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Kronometre" android:textSize="20sp" android:layout_gravity="center" android:layout_marginTop="40dp" android:textStyle="bold" /> <ProgressBar android:id="@+id/progressBar1" style="?android:attr/progressBarStyleHorizontal" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="20dp"/> <TextView android:id="@+id/textView2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="0 sn" android:textSize="20sp" android:layout_marginTop="10dp" android:layout_gravity="center" /> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:layout_marginTop="40dp" > <Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Başlat" /> <Button android:id="@+id/button2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Durdur" /> <Button android:id="@+id/button3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Sıfırla" /> </LinearLayout> </LinearLayout>
Tasarım kısmında yapacaklarımız bu kadar. Şimdi MainActivity’yi düzenlemeye geçelim.
Kodlama (MainActivity)
MainActivity sınıfını da aşağıdaki gibi güncelleyelim.
public class MainActivity extends Activity { private ProgressBar progressBar; private TextView textView; private Handler handler = new Handler(); private Button baslat; private Button durdur; private Button sifirla; private int progressStatus = 0; private boolean suspended = false;//Durdur butonuna basıldığında bu değeri true yapacağız. private boolean stopped = false;//Sıfırla butonuna basıldığında bu değeri true yapacağız. @Override // Bu metod uygulama açıldığında çalıştırılan metod. protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // Bileşenleri eşleştiriyoruz. progressBar = (ProgressBar) findViewById(R.id.progressBar1); textView = (TextView) findViewById(R.id.textView2); baslat = (Button) findViewById(R.id.button1); durdur = (Button) findViewById(R.id.button2); sifirla = (Button) findViewById(R.id.button3); progressBar.setMax(60); //ProgressBar'ın Max değerini belirliyoruz. progressBar.setIndeterminate(false); //ProgressBar'ın tekrar eden bir animasyon ile çalışmasını önlüyoruz. initValues(); baslat.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { setKronometre().start(); stopped=false; baslat.setEnabled(false); durdur.setEnabled(true); sifirla.setEnabled(true); } }); durdur.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { if (suspended) { suspended = false; durdur.setText("Durdur"); } else { suspended = true; durdur.setText("Devam Et"); } } }); sifirla.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { stopped=true; initValues(); } }); } private void initValues() { //Başlangıç değerlerini set ediyoruz. progressStatus=0; progressBar.setProgress(progressStatus); textView.setText("0sn / 60sn"); baslat.setEnabled(true); durdur.setEnabled(false); sifirla.setEnabled(false); durdur.setText("Durdur"); suspended=false; } private Thread setKronometre(){ return new Thread(new Runnable() { public void run() { while (progressStatus < 60) { while (suspended) { //Eğer kronometre durdurulduysa bekle try { Thread.sleep(300); } catch (InterruptedException e) { e.printStackTrace(); } } if(stopped) // Eğer kronometre sıfırlandıysa işlemi sonlandır break; progressStatus += 1; // yeni değeri ekranda göster ve progressBar'a set et. handler.post(new Runnable() { public void run() { progressBar.setProgress(progressStatus); textView.setText(progressStatus + "sn / " + progressBar.getMax()+"sn"); } }); try { // Sleep for 1 second. // Just to display the progress slowly Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } }); } }
Evet uygulamamız hazır. Kodlar arasına gerekli açıklamaları yazdım. Anlaşılmayan noktaları yorum olarak yazabilirsiniz. Cevaplamaktan memnuniyet duyarım.
Ekran Görüntüleri
Kaynak Kodlar
Uygulamanın kaynak kodları : https://github.com/mursidyazar/Android-ProgressBar.git
buttonların setonclick fonksiyonlarında hatalar alıyorum. import etmem gerekne birşey mi var acaba daha yeniyim
Muhtemelen importlarda eksik vardır. Eğer ‘shift+ctrl+o’ tuşlarına basarsanız otomatik olarak gerekli importları yapacaktır. Ayrıca hatayı aldığınız metodun üzerine tıkladıktan sonra ‘Ctrl+1’ tuşarına basarsanız ya da aynı satırın solunda yanan hata işaretine(ampul üzerinde kırmızı bir çarpı) tıklarsanız size hatanın çözümleri için öneriler sunacaktır. Öneriler arasında muhtemelen ilk sırada bir sınıfı import etmeniz gerektiği yazıyordur. O öneriye çift tıkladığınızda da gerekli import işlemini yapmış olursunuz. Bunlar işe yaramaz ise, hata veren yerin ekran görüntüsünü gönderirseniz yardımcı olmaya çalışırım.