Adem KALIN – Yazılım Mühendisi

“Desktop Programlama” Gözüyle “Android Programlama” ya Bakış – 2

Bir önceki yazımda desktop programlama ile android programlama arasındaki farkları, ortamsal ve kaynaksal yönüyle dilim döndüğünce anlatmaya çalışmıştım. (Okumak isteyenler için : “Desktop Programlama” Gözüyle “Android Programlama” ya Bakış ) Bu yazıda ise işin daha çok kod ve tasarım tarafındaki farklardan bahsetmek istiyorum. Bu kısmı birçok yazılımcı için daha ilgi çekici olacaktır sanırım. Çok lafı uzatmadan hemen başlıyorum.

Desktop uygulaması yazarken, bildiğiniz üzere ekran kodu tek parçadır. Form tasarım kodları ile arkada çalışacak yani buttonClick, itemChanged vs gibi projenin business yani iş tarafındaki asıl mantığı içeren kısmı, aynı kod parçası içerisindedir (OOP için partial class, diğer diller için kod dosyası/kütüphane şeklinde).

Örneğin C# ile bir Windows Forms Application yazarken, projeye bir Form eklediğinizde, proje ağacı altında görüleceği gibi 2 farklı, fakat birbiriyle ilişkili .cs dosyası ([FormName].cs ve [FormName].Designer.cs) görüntülenir. [FormName].Designer.cs isimli dosya, tasarım ile alakalı kodların bulunduğu, ekrana eklenen button, textbox, combobox, checkbox…. vs bütün bileşenleri çalışma anında create edip, ekranda ilgili konuma yerleştiren komutların yer aldığı .cs dosyasıdır. Bu iki .cs dosyasının ismi farklı olsa da aslında ikisi aynı class ın birer partial class olan dosyalarıdır ve uygulama derlendiğinde tek bir class olarak derlenirler. Dolayısıyla ekran kodu ile tasarım kodu tamamen aynı sınıftır. Bu sebepledir ki, mesela form üzerine eklediğiniz bir butona çift tıklayarak click eventinin içeriğini direkt kodlayabilirsiniz. Aynı zamanda form tasarımında kullanılan herhangi bir bileşene, örneğin textbox ‘a ve onun bütün özelliklerine, içerisine doldurulan değerlere direkt olarak erişebilir, event ‘lerini de yine direkt olarak ilişkilendirebilirsiniz.

C_Sharp_Form_Code

Ancak, Android uygulaması geliştirirken bu durum biraz farklıdır. Öncelikle unutmamanız gereken şey, ekran tasarımının arka tarafta çalışan koddan tamamen bağımsız olarak XML formatında oluşturulduğudur. İlk olarak ekran tasarımları hazırlanır burada. Görüntülenecek her ekran için bir Layout tanımlanır. Daha sonra gerekli bileşenler (button, textbox, combobox, listbox…) layout’a ekleyerek tasarım tamamlanır. Ekran tasarımı yapılırken, ilk olarak tasarımı yapılan layout ‘a verilen isim, ve sonrasında ise eklenen her bir bileşene yazılımcı tarafından atanan id ‘ler, birer unique id olarak IDE (ben Android Studio kullanıyorum) tarafından R dosyasına otomatik olarak eklenir. Bu aşamada artık bir ekran tasarım dosyanız oluşmuş olur.

Layout

İkinci aşamada ise oluşturulan her bir layoutun gerekli olduğu anda çağrıldığı/ekrana basıldığı, ekrandan verilen komutların ise işlendiği, özet olarak işin business ‘inin işletildiği, Activity veya Fragment yapısındaki Java class ları kodlanır. (Activity ve Fragment konularının ayrıntısına burada girme şansımız yok, her ikisi de başlı başına ayrı konular. Şimdilik ikisini birden sadece class olarak düşünebilirsiniz) Bu class lardan, istenilen layout çağrılır, layoutun üzerinde bulunan bileşenlerin özelliklerine, içerisindeki değerlere erişilir. Özetle ekran tasarımı yani Layout yönetilir. Ancak bu yönetim sırasında, direkt olarak layout dosyasına ve bileşenlerine erişme şansımız yoktur, layoutlar sadece birer XML dosyalarından ibrettirler. Ve bu sebeple, layoutların yönetimi sırasında, daha önce her bir layout ve bileşene ayrı ayrı atanan ve R dosyasına yazılan unique id ‘ler kullanılmak zorundandır.

Activity

Bir örnek ile daha konuyu biraz daha aydınlatmak istiyorum. Diyelim ki layoutunuza bir buton eklediniz, id olarak ise “button1” verdiniz ve butona tıklandığında birşeyler yaptırmak istiyorsunuz. (En basit örnek olarak “Hello World” yazdıracaksınız diyelim 🙂 ) Burada yapmanız gereken, layoutun yönetildiği class’ın override edilmiş onCreate metodu içerisinde aşağıdaki gibi bir kod yazmak.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
@Override
protected void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   /* 1 - Öncelikle, bu class dan çağrılacak ve ekrana basılacak, 
   activity_main id li layoutu belirtiyoruz. */
   setContentView(R.layout.activity_main);
 
   /* 2 - Botton tipinde bir nesne tanımlayıp, button1 id si atanan 
   buton ile eşleştiriyoruz. */
   Button button = (Button)findViewById(R.id.button1);
 
   /* 3 - Bu aşamada olarak button ismi ile oluşturduğumuz 
   ve layouttaki buton ile eşleştirdiğimiz nesne için onClick 
   eventini oluşturuyoruz.*/
   button.setOnClickListener(new View.OnClickListener() {   
      @Override
      public void onClick(View v) {
          /* 4 - Son olara onClick eventi içerisinde yani 
          butona tıklandığında yapılması gereken işleri kodluyoruz*/
          Toast.makeText(getApplicationContext(), "Hello World!", Toast.LENGTH_SHORT).show();
      }
   });
}

Görüldüğü üzere, ekrana basılacak layout belirlendikten sonra, onClick event ‘i için kullanmadan önce layout üzerinde bulunan buton’un karşılığı olan bir Button nesnesi ekleniyor. Daha sonrasında ise oluşturulan Button objesi için bir event ekleniyor ve içeriği dolduruluyor.

Örnekten de anlaşılacağı gibi, layout ‘a eklenen ve yönetilmek istenen her bir bileşen için, class içerisinde bir obje create edilmesi gerekiyor. Daha sonra create edilen bu objeler üzerinden, ekrandaki değerlere ulaşmak ve yönetmek imkanlı hale geliyor.

Kısa bir özet geçmek gerekirse, desktop uygulaması geliştiriken, ekran ve arkada çalışacak kodlar tek bir kod parçası olduğu için ekrandaki herhangi bir bileşene ve onun özelliğine direkt olarak ulaşabiliyorsunuz. Aslında yukarıda anlattığım gibi Designer.cs partial class ‘ı ile arka planda onlar da class ın birer attribute ‘ü olarak otomatik üretiliyor ancak bizler uğraşmayarak direkt kullanabiliyoruz. Android için geliştirme yaparken ise öncelikle tasarım dosyasını ayrı hazırlıyor, sonra o tasarımı ve üzerindeki bileşenleri yöneten ayrı bir class yazıyorsunuz.

Buraya kadar her iki taraf için de en bariz fark olarak ekran kodlarının yönetilmesini anlatmaya çalıştım. Şimdilik bu kadar diyorum. Öğrenmeye ve öğrendiklerimi pekiştirmeye devam ettikçe arkası gelebilir. Takipte kalın 🙂

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir