Bu yeşil ufaklık Bugdroid kod adıyla da biliniyor.

Android Programlama Ders 8: Olayların İşletmesinde Optimizasyon

In Mobil, Teknoloji by Victor CuiumjuLeave a Comment

Optimizasyon ile Android belleğini daha az kullanmanın yolları: Bu derste bir işleticiye birden fazla View nesnesini işletmeyi öğreneceğiz. Sonra etkileşimi bir işletici olarak kullanmayı öğreneceğiz…

Android uygulamalarında optimizasyonu öğrenmeye başlamak için yeni bir proje açalım:

  • Project name: P008-Listener
  • Build Target:Android 4.2
  • Application name: Listener
  • Package name: tr.androidApp.Listener
  • Create Activity: MainActivity

Geçen derste kullandığımız View nesneleri kullanacağız. main.xml kodu:

<?xml version=”1.0″ encoding=”utf-8″?>
<LinearLayout
xmlns:android=”http://schemas.android.com/apk/res/android”
android:layout_height=”match_parent”
android:layout_width=”match_parent”
android:orientation=”horizontal”>
<LinearLayout
android:id=”@+id/linearLayout1″
android:layout_height=”match_parent”
android:orientation=”vertical”
android:layout_width=”match_parent”
android:layout_margin=”30dp”>
<TextView
android:layout_width=”wrap_content”
android:text=”TextView”
android:layout_height=”wrap_content”
android:id=”@+id/tvOut”
android:layout_gravity=”center_horizontal”
android:layout_marginBottom=”50dp”>
</TextView>
<Button
android:layout_height=”wrap_content”
android:layout_gravity=”center_horizontal”
android:id=”@+id/btnOk”
android:text=”OK”
android:layout_width=”100dp”>
</Button>
<Button
android:layout_height=”wrap_content”
android:layout_gravity=”center_horizontal”
android:id=”@+id/btnCancel”
android:text=”Cancel”
android:layout_width=”100dp”>
</Button>
</LinearLayout>
</LinearLayout>

1 – Bir işleticinin iki butonunun çalıştırması

Şu anda iki tane  buton ve bir tane TextView’ımız mevcut. Geçen dersteki gibi uygulama butonlara basıldığı zaman TextView mesajı verecektir. Ama şimdi bunu bir işletici vasıtasıyla gerçekleştireceğiz.

Hatırlatayım, bir buton kendi kendine bir şey yapamaz. Butonu etkinleştirmek için bir dinleyici (listener) gerekir. Bunu setOnClickListener metoduyla yapıyoruz.  Dinleyicinin fonksiyonu, butona basılıp basılmadığını kontrol etmektir. Basıldığı zaman dinleyici onClick metodunun içinde olan kodları çalıştırır.

Aşağıdaki algoritmayı yapıyoruz:

Dinleyici yaratıyoruz

onClick metodu dolduruyoruz

Dinleyici butona bağlıyoruz

Bizim örneğimizde  tek dinleyici iki butonu birden çalıştıracak. Dinleyicinin içinde hangi butona basıldığını belirleriz.

Nesneleri hazırlayalım ve işleticisi yaratalım:

public class MainActivity extends Activity {

TextView tvOut;
Button btnOk;
Button btnCancel;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

// View-nesnelerini buluyoruz
tvOut = (TextView) findViewById(R.id.tvOut);
btnOk = (Button) findViewById(R.id.btnOk);
btnCancel = (Button) findViewById(R.id.btnCancel);

// isleticiyi yaratiyoruz
OnClickListener oclBtn = new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub

}
};

}
}

 

Şimdi onClick metodunu dolduralım. Aşağıda göreceğiniz üzere kodun girişinde View’ı bir nesne olarak kullanacağız, View değişkenine göre program gelişecek. Örneklerimizde bu View Ok veya Cancel butonu olacaktır. Bu View nesnenin ID öğrendikten sonra R.id.btnOk ve R.id.btnCancel karşılaşacağız. Sonuca göre hangi butona basıldığı belli oluyor. ID öğrenmek için getID metodu kullanılıyor. Sonuçları taramak için java-operatörü (switch) kullanacağız.

onClick metodu belirlenmesi:

 
 public void onClick(View v) {
         // id gore hangi buton basilmis ogrenecegiz
         switch (v.getId()) {
         case R.id.btnOk:
           // ОК butonu
           tvOut.setText("ОК butona bastiniz");
           break;
         case R.id.btnCancel:
           // Cancel butonu
           tvOut.setText("Cancel butona basiniz");
           break;
         }
       }

Eğer uygulamayı şimdi çalıştırırsak bir şey olmayacaktır. Çünkü dinleyiciyi yarattık ama onu butonlara bağlanmadık. İki buton için aynı dinleyiciyi bağlayalım:


btnOk.setOnClickListener(oclBtn);
btnCancel.setOnClickListener(oclBtn);

Programı çalıştıralım, program şimdi düzgünce çalışmalı. Tabii ki işletici sadece iki tane buton değil, daha da fazla buton için de uygulanabilir. Sadece buton değil, başka View nesneler için de geçerlidir. İleride bu özellikleri daha çok kullanacağız. Geçen ders ile aradaki en önemli fark, aynı işlem yapmak için iki tane değil, bir tane işletici kullanmış olmamız. Bu bize bellekten tasarrufu sağlıyor ki bu da cep telefonu ve tabletler önemli bir şey. Ve ikinci avantaj programın kodları anlamak ve takip etmek için kolaylık sağlıyor. Şimdi işletici yaratmak için başka bir yönteme bakalım. Bu yöntemde etkileşimin yaratığı nesne kullanacağız.

2 – Etkileşim(Activity) işletici olarak kullanılması

setOnClickListener (View.OnClickListener l) metodu kullanarak buton işleticiyi kendine bağlıyor. Bunu yapmak için herhangi arayüzü View.OnClickListener özelliği taşıyan nesneyi kullanabiliriz. Etkileşim(Activity) da olabilir. Biz sadece etkileşiminin klas olduğunu belirleyiciyiz ve View.OnClickListener ara yüzü kullanıyor. Sonra onCreate metodu dolduracağız. Yeni bir proje açalım:

 

  • Project name: P00801-ActivityListener
  • Build Target:Android 4.2
  • Application name: ActivityListener
  • Package name: tr.androidApp.ActivityListener
  • Create Activity: MainActivity

Aynı kodları kullanacağız:

<?xml version=”1.0″ encoding=”utf-8″?> <LinearLayout xmlns:android=”http://schemas.android.com/apk/res/android” android:layout_height=”match_parent” android:layout_width=”match_parent” android:orientation=”horizontal”> <LinearLayout android:id=”@+id/linearLayout1″ android:layout_height=”match_parent” android:orientation=”vertical” android:layout_width=”match_parent” android:layout_margin=”30dp”> <TextView android:layout_width=”wrap_content” android:text=”TextView” android:layout_height=”wrap_content” android:id=”@+id/tvOut” android:layout_gravity=”center_horizontal” android:layout_marginBottom=”50dp”> </TextView> <Button android:layout_height=”wrap_content” android:layout_gravity=”center_horizontal” android:id=”@+id/btnOk” android:text=”OK” android:layout_width=”100dp”> </Button> <Button android:layout_height=”wrap_content” android:layout_gravity=”center_horizontal” android:id=”@+id/btnCancel” android:text=”Cancel” android:layout_width=”100dp”> </Button> </LinearLayout> </LinearLayout>

Nesneleri hazırlıyoruz ve arayüzü ekliyoruz (implements onClickListener)

public class MainActivity extends Activity implements OnClickListener {

   TextView tvOut;
   Button btnOk;
   Button btnCancel;

   /** Called when the activity is first created. */
   @Override
   public void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
     setContentView(R.layout.main);

     // View-nesneleri buluyoruz
     tvOut = (TextView) findViewById(R.id.tvOut);
     btnOk = (Button) findViewById(R.id.btnOk);
     btnCancel = (Button) findViewById(R.id.btnCancel);
   }
 }

 

OnClickListener kırmızı çizgiyle işaretleniyor çünkü import bölümünde yoktur. İmport bölümüne eklemek için CTRL+SHIFT+O basıyoruz ve View.OnClickListener seçiyoruz.

Şimdi Eclipe MainActivity hatalı olduğunu ifade ediyor. Bunun sebebi etkileşim klası için bir arayüzü vardır ama arayüzü için metodlar eksiktir. Bunu çözmek için kursoru MainActivity yönlendirip Add unimplemented methods  seçiyoruz.

Eclipse onClick metodu ekleyecek. Ama bu sefer onClick metod etkileşim içinde olacaktır. Daha önce yaptığımız gibi metodu dolduralım.

public void onClick(View v) {
         // id gore hangi buton basilmis ogrenecegiz
         switch (v.getId()) {
         case R.id.btnOk:
           // ОК butonu
           tvOut.setText("ОК butona bastiniz");
           break;
         case R.id.btnCancel:
           // Cancel butonu
           tvOut.setText("Cancel butona bastiniz");
           break;
         }
       }

 

onCreate metodu butonlara bağlacağız. Bunu MainActivity’e ait this metodu gerçekleşecektir.

btnOk.setOnClickListener(this);
btnCancel.setOnClickListener(this);

 

Bu yöntemi kullandığı zaman biz gerekmeyen nesneleri yaratmadık. Belki bu yöntem size zor gelebilir. Bu durumda size en basit gelen yöntemi kullanabilirsiniz. Aşağıda size kodun tamamını veriyorum:

public class MainActivity extends Activity implements OnClickListener {

   TextView tvOut;
   Button btnOk;
   Button btnCancel;

   /** Called when the activity is first created. */
   @Override
   public void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
     setContentView(R.layout.main);

     // View-nesneleri buluyoruz
     tvOut = (TextView) findViewById(R.id.tvOut);
     btnOk = (Button) findViewById(R.id.btnOk);
     btnCancel = (Button) findViewById(R.id.btnCancel);

     // işleticiyi butonlara bağlıyoruz
     btnOk.setOnClickListener(this);
     btnCancel.setOnClickListener(this);
   }

   @Override
   public void onClick(View v) {
     // id gore hangi buton basilmis ogrenecegiz
     switch (v.getId()) {
     case R.id.btnOk:
       // ОК buton
       tvOut.setText("Ok butona bastiniz ");
       break;
     case R.id.btnCancel:
       // Cancel buton
       tvOut.setText("Cancel butona bastiniz ");
       break;
     }
   }

 }

Ders Sonu Notları:

Bu derste bir işleticinin iki butonu nasıl yönetmesi gerektiğini öğrendik. Sonra etkileşim işletici olarak kullanması nasıl kullanabildiğini gördük.

Sonraki derste res/values klasörü inceleceğiz. Ve sonra uygulamanın kaynakları kullanma örneklere bakacağız.