Android Programlama Ders 14’te Ekranı layout- dosyasını kullanmadan programlamayı ve LayoutParams’ı öğreneceğiz.
Daha önce ekranı oluştururken layout – dosyasını kullanmıştık. Aynı şeyi programlayarak da yapabiliriz.
Yeni projeyi oluşturalım:
Project name: P0014_DynamicLayout
Build Target: Android 4.2
Application name: DynamicLayout
Package name: tr.androidApp.dynamicLayout
Create Activity: MainActivity
MainActivity.java dosyasını açalım ve aşağıdaki satırı inceleyelim:
setContentView(R.layout.main);
Bu satırda etkileşim (Activity) ekranı oluşturmak için layout – dosyasını main.xml’de kullanacağını söylüyor. Bu metodu başka bir yöntemle de gerçekleştirebiliriz. Bu metod giriş olarak View – nesnesini kullanıyor ve bu nesneden ana kaynak olarak da yararlanıyor. Layout – dosyasında genelde kök olarak LinearLayout kullanılıyor. Biz da LinearLayout’tu kullanacağız.
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // LinearLayout olusturuyoruz LinearLayout linLayout = new LinearLayout(this); // dikey pozisyonu olusturuyoruz linLayout.setOrientation(LinearLayout.VERTICAL); // LayoutParams olusturuyoruz LayoutParams linLayoutParam = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT); // linLayout kok olarak olusturuyoruz setContentView(linLayout, linLayoutParam); }
CTRL+SHIFT+O kullanarak import bölümünü yeniliyoruz. Eclipse bize hangi LayoutParams’ı kullanacağımızı soracaktır. Buruyı biraz ayrıntılı inceleyelim, ekranın oluşumunu hatırlayalım. Ekran ViewGroup’tan ve Vew’lerden oluşuyor.
Daha önce kullandığımız ViewGroup örnekleri – LinearLayout, TableLayout, RelativeLayout v.b. Herkes bu ViewGroup’tan bir LayoutParams içerik klası içeriyor. ViewGroup.LayoutParams, LayoutParams’ın temelini oluşturuyor. ViewGroup.LayoutParams’ın height ve width olmak üzere iki parametresi vardır. Bu metodun alt klası olan ViewGroup.MarginLayoutParams,bu iki parametreyi miras alıyor. Kendisinin dört tane parametresi vardır : bottomMargin, leftMargin, rightMargin, topMargin. LinearLayout.LayoutParams klası ViewGroup’un klasın alt klasıdır. MarginLayoutParams LinearLayout.LayoutParams’dan altı tane parametre miras alıyor ve iki tane de kendi (Gravity, Weight) parametresini ekliyor. Yani LinearLayout nesnesi LinearLayout.LayoutParams alt klası ile layout-parametrelerini içeriyor. Bu parametre tüm alt View ve ViewGroup’lara uygulanıyor.
LinearLayout’daki View nesnesi aynı layout-parametrelerini içeriyor:
RelativeLayout’da ait View nesnesi başka parametre kullanıyor:
Aynı nesneler de vardır. Çünkü ViewGroup’ları aynı kaynakları kullanıyorlar.
Tekrar Eclipse dönelim ve ViewGroup.LayoutParams temel klası seçelim.
Şimdi kodu inceleyelim. LinearLayout’u oluşturuyoruz ve dikey pozisyonu belirliyoruz. Sonra LayoutParams oluşturuyoruz. Tasarımcı giriş olarak iki parametre (Width ve Height) kullanıyor. İki parametre için de MATCH_PARENT’i kullanılıyor. Sonra setContentView metodunu çağırıyoruz. Bu metod, giriş değişkeni LinearLayout ve LayoutParams’ı kullanıyor. Bu demek oluyor ki Activity’nin ana nesnesi LinearLayout ve layout-özelleği LayoutParams’dan olacaktır.
Eğer şimdi uygulamayı çalıştırsaydık, bir şey göremeyecektik. Çünkü LinearLayout’un View – nesneleri mevcut değildir. Onları ekleyelim:
LayoutParams lpView = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); TextView tv = new TextView(this); tv.setText("TextView"); tv.setLayoutParams(lpView); linLayout.addView(tv); Button btn = new Button(this); btn.setText("Button"); linLayout.addView(btn, lpView);
Tekrar LayoutParams nesnesini oluşturuyoruz. Nesnenin iki parametresi (width = wrap_content ve height = wrap_content) vardır. Eğer bu nesneye herhangi bir View – nesnesi uygularsak, View parametrelerine göre genişliğini ve yüksekliğini ayarlayacağız.
Sonra TextView’i oluşturuyoruz, onun metnini ayarlıyoruz ve daha önce oluşturduğumuz LayoutParams’ı bağlıyoruz. LinearLayout’da addView (View child) metodu kullanarak ekliyoruz.
Butonu (Button) oluşturduktan sonra metnini değiştiriyoruz ve sonra addView (View child, ViewGroup.LayoutParams params) metodunu kullanıyoruz. Bu metod aynı anda Button’u LinearLayout’a ekliyor ve buton için LayoutParams belirliyor. Sonuç TextView gibi olacak ama burada bir satır kodu kullandık.
Dikkat ettiyseniz iki tane View – nesnesi için bir tane LayoutParams nesnesi kullandım. Eğer şimdi LayoutParams nesnesinin özelliğini değiştirirsem, bu iki View nesnesinin özelliğinde değişime sebep olur.
Uygulamayı kaydedelim ve çalıştıralım. Ekranda bileşenlerin oluştuğunu görebiliriz. Bileşenlerin yüksekliği ve genişliği wrap_content’e göre belirlenir.
lpView nesnesi temel android.view.ViewGroup.LayoutParams tipine aittir. Bu demek oluyor ki bize sadece yüksekliği ve genişliği ayarlama imkanı verecek. LinearLayout’ta View nesnesi için soldan mesafeyi (Boşluğu) ve sağ kenara göre düzeltmeyi kullanabiliriz. Bu özellikleri kullanmak için LinearLayout.LayoutParams kullanmamız gerekecek:
LinearLayout.LayoutParams leftMarginParams = new LinearLayout.LayoutParams( LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); leftMarginParams.leftMargin = 50; Button btn1 = new Button(this); btn1.setText("Button1"); linLayout.addView(btn1, leftMarginParams);
Kodu inceleyelim: LinearLayout.LayoutParams nesnesini LayoutParams tasarımcıyı kullanarak oluşturduk. width ve height’i belirledikten sonra soldan mesafeyi 50 piksele eşitliyoruz. Sonraki adımlar: Nesneyi oluşturuyoruz, metnini belirliyoruz ve bu metni LinearLayout’a ekliyoruz.
Butonu sağa tarafa geçirmek için:
LinearLayout.LayoutParams rightGravityParams = new LinearLayout.LayoutParams( LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); rightGravityParams.gravity = Gravity.RIGHT; Button btn2 = new Button(this); btn2.setText("Button2"); linLayout.addView(btn2, rightGravityParams);
Kaydedelim ve çalıştıralım. Button1 50px soldan kaydı ve Button2 sağa tarafa kaydı:
Belki ilk başta bu konu karmaşık gelebilir. Bunun için gelecek iki derste öğrendiğimiz bu konuyu tekrarlayacağız ve pratikte ekrana yeni nesne ekleyeceğiz.
Uygulamanın tam kodu:
public class MainActivity extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // LinearLayout’un olusumu LinearLayout linLayout = new LinearLayout(this); // dikey pozisyonu olusturuyoruz linLayout.setOrientation(LinearLayout.VERTICAL); // LayoutParams olusturuyoruz LayoutParams linLayoutParam = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT); // linLayout ekranin kok nesne olarak belirliyoruz setContentView(linLayout, linLayoutParam); LayoutParams lpView = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); TextView tv = new TextView(this); tv.setText("TextView"); tv.setLayoutParams(lpView); linLayout.addView(tv); Button btn = new Button(this); btn.setText("Button"); linLayout.addView(btn, lpView); LinearLayout.LayoutParams leftMarginParams = new LinearLayout.LayoutParams( LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); leftMarginParams.leftMargin = 50; Button btn1 = new Button(this); btn1.setText("Button1"); linLayout.addView(btn1, leftMarginParams); LinearLayout.LayoutParams rightGravityParams = new LinearLayout.LayoutParams( LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); rightGravityParams.gravity = Gravity.RIGHT; Button btn2 = new Button(this); btn2.setText("Button2"); linLayout.addView(btn2, rightGravityParams); } }
Android Programlama dersleri devam ediyor, gelecek derste uygulama çalıştığı zaman ekrana bileşenleri eklemeyi öğreneceğiz.
Layout params’ın işlevi tam oalrak ney? Biraz daha açıklayıcı olasanız?
teşekkürler hocam