Fragment Nedir?

Android kullanıcı arayüzlerinden Activity’ leri tüm android geliştiriciler duymuştur. API level 11 ile birlikte geliştiriciler Fragment sınıfı ile muhatap olmaya başladı. Fragmentler nedir?

Fragment’ ler  Activity’ ler gibi kullanıcı arayüzlerini oluştururlar. Peki neden bu sınıfa ihtiyaç duyuldu? İlk ve temel amaç performansın artırılması, kullanılabilirliğin arttırılmasıydı. Activity’ lere göre daha performanslı, daha kullanışlı bir yapıya sahip olan Fragment’lar, bu işlemi başarıyla gerçekleştiren bir sınıf olarak geliştiricilere sunuldu.

Fragmentlerin en güzel tarafı  uygulamada Fragment olarak oluşturulan görsel bir arayüz, istenilen yerde çağırılarak kullanılabilir. Fragment gösterimi, yeni bir Activity çağırmaktan daha performanslı gerçekleşmektedir. Üstelik, Activity’ ler Fragment’ lar gibi yer değiştirilebilir bir yapıya sahip değildirler. Bu da geliştirici için tasarımda büyük bir esneklik sağlar. Tasarımda bu güzellikler var, Fragment’ lara şimdi biraz daha yakından bakalım.

Fragment’ lar Nasıl Çalışır?

Fragment’ lerin çalışma mantığı şu şekildedir; tüm Fragment nesneleri, bir Activity sınıfı içinde gösterilir. Yani uygulamada bir Activity sınıfı olmalı, tasarlanan tüm görseller(Fragment’ lar) bu Activity sınıfı içinde yer değiştirme işlemi ile gösterilmeli.

Fragment Life Cycle

Fragment’ ler de Activity’ ler gibi bir hayat döngüsüne sahiptirler. Bir çok kaynakta Fragment Life Cycle tablosunu bulabilirsiniz. Ben de developer.android.com
fragment_lifecyclesitesinden aldığım resmi burada hatırlatıp başka şeylerden bahsetmek istiyorum.

Bir Fragment ne kadar kendi yaşam döngüsüne sahip olsa da aslında bu döngüyü belirleyen, başlamasını ya da bitmesini sağlayan şey içinde bulunduğu Activity’ dir. Fragment’ lar Activity içinde gösterilir. Doğal olarak yaşam döngüsü de Activity’ lere bağımlı olarak devam eder. Fragment’ların bağlı olduğu Activity sınıfını bitirirseniz, Fragment’ larınız da yok olacaktır. Bu da demek oluyor ki, ancak Activity nesnesi normal bir şekilde devam ederken Fragment nesneleri normal yaşam döngüsünü sürdürebilir. Activity nesnesinin yaşam döngüsünde gerçekleşen tüm değişiklikler barındırdığı Fragment nesnelerini de etkileyecektir.

Fragment yapısını;

  • Activity mantığından daha performanslı
  • Tekrar tekrar kullanılabilir
  • Kendine ait yaşam döngüsü (Life Cycle) vardır
  • Activity’ ler içinde, onların davranışlarına bağımlı olarak çalışır.

(serefakyuz.com’dan alınmıştır)

Fragment Örneği:

Bir uygulama yapacağız, uygulamamızda bir buton ve bir sayacımız olucak, butona her tıkladığımızda sayacımız artacak,buton ve sayacımızı ayrı fragmentlerde tanımlayacağız.

MainActivity.java

public class MainActivity extends AppCompatActivity implements Communicator {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

    }


    public void respond(String data)
    {
        android.app.FragmentManager manager=getFragmentManager();
    fragment_b f2=(fragment_b) manager.findFragmentById(R.id.fragment);
        f2.yaziyiDegis(data);
    }



    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
}

 

fragment_a.java

public class fragment_a extends Fragment implements OnClickListener {

    Button button;
    int counter=0;
    Communicator com;

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        View view =inflater.inflate(R.layout.fragment_a,container,false);
        return view;
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        button=(Button)getActivity().findViewById(R.id.button);
        button.setOnClickListener(this);
        com=(Communicator)getActivity();
    }

    @Override
    public void onClick(View view) {
    counter++;
        com.respond("Butona"+ counter+ " kere tıklandı");
    }
}

 

fragment_b.java

public class fragment_b extends Fragment {
    String veri;
    TextView degis;

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        View view = inflater.inflate(R.layout.fragment_b,container,false);
        return view;
    }
    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onActivityCreated(savedInstanceState);

        degis = (TextView) getActivity().findViewById(R.id.tvsayac);
    }

    public void yaziyiDegis(String gelenVeri) {
        this.veri = gelenVeri;
        degis.setText(veri);

    }

}

 

Communicator.java

public interface Communicator {
    public void respond(String data);

}

 

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <fragment
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:name="com.example.comert.fragmentornek.fragment_b"
            android:id="@+id/fragment"
            android:layout_alignParentTop="true"
            android:layout_alignParentStart="true" />

        <fragment
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:name="com.example.comert.fragmentornek.fragment_a"
            android:id="@+id/fragment2"
            android:layout_centerVertical="true"
            android:layout_alignParentStart="true" />
    </RelativeLayout>
</LinearLayout>

 

fragment_a.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/holo_orange_light"
    >

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Bana Tıkla"
        android:id="@+id/button" />
</LinearLayout>

 

fragment_b.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:text="Sayac"
        android:id="@+id/tvsayac" />

</LinearLayout>

 

Kaynak kodları: https://github.com/CBaldemir/Fragment_Example

#fragment, #fragment-ornegi, #fragment-example, #fragment-nedir, #fragmentin-yasam-dongusu, #fragmentler-nasil-calisir

Java da Static ve Instance Initialize Bloklar

Java 2 tür Initialize blok vardır.

->Static Block
->Instance Block

Static initialize blocklar main metodundan önce sınıf yüklendiğinde çalışacaktır.
Static blocklar ilk önce ve sadece 1 kereliğine çalışır.
Instance blocklar ilgili obje/instance oluşunca çalışacaktır.
Instance blocklar her obje oluşturulduğunda tekrar çalışacaklardır.

class Test {
	
}

public class InitializeTest {

	// static initialize block
	// static initialize blocklar main metodundan once sinif yuklendiginde
	// calisacaktir.
	// birden fazla initialize block oldugunda tanimlanma sirasina gore
	// calisacaktir.
	static {
		System.out.println("static initialize block 1");
	}

	static {
		System.out.println("static initialize block 2");
	}

	static {
		System.out.println("static initialize block 3");
	}

	// instance initialize block
	// instance initalize blocklar ilgili sinif tipinde obje olusunca calisacaktir.
	// tanimlandigi sirada calisirlar.
	// 
	{
		System.out.println("instance initialize block");
	}

	// instance initialize block
	{
		System.out.println("instance initialize block2");
	}
	
	InitializeTest(){
		System.out.println("Constructor!!!");
	}

	public static void main(String[] args) {
		System.out.println("main");
		
		InitializeTest test = new InitializeTest();
		InitializeTest test2 = new InitializeTest();
//kactane obje olusturursak okadar kez instance blocklar calisacaktir.
//Bir obje oluşuturulduğunda ilk önce instance block çalışır daha sonra constuctor çalışır.

/* Çıktı:
static initialize block 1
static initialize block 2
static initialize block 3
main
instance initialize block
instance initialize block2
Constructor!!!
instance initialize block
instance initialize block2
Constructor!!!
*/
	}

}

#initialize-block, #instance-block, #java, #java-dersleri, #static-block

Java da Pass By Value Kavramı

Java da Pass By Value:

Metotlara parametreler geçilmeden önce parametrenin değeri belirlenir.Bu belirlenen değer bellekte bir alana kopyalanır ve daha sonra parametre aktarımı yapılır.Parametre aktarımı yapılırken ise,bu bellek alanının adresinin kendisi değil kopyası metoda gönderilir.
Bu olaya “Pass by value” denir.

public class passbyvalue {

 public static void main(String[] args) {
  int num=5;
  // 5 degerini temsil eden bit yapisinin kopyasi alinir ve add metoduna gecer.
  addvalue(num);
  System.out.println("Ilk deger"+ num);
  
  
 }
 
 public static void addvalue(int num)
 {
 int numa=num+5;
  System.out.println("Son deger"+numa);
}
}

#bit-pattern, #java, #java-dersleri, #pass-by-value

Java da – Veri Tipleri ve Değişkenler

Declaration nedir ? 

Declaration bir class içerisinde veri tipini tanımlamaktır . Ayrıca bellekte de yer ayrılır.

Local Variable(Local değişken nedir )? 

Java da metod içerisinde tanımladığımız değişkenlere local değişken diyebiliriz.
Local değişkenleri metod içerisinde kullanıyorsak ilk değer vermek zorundayız (initialize)
Değer vermediğimizde hata verecektir.

public static void main(String[] args) {

  int number ;
  //java number degiskenine 0 atamaz!
  //local degiskenler icin initialize yapilmaz!
  //burada degiskenin degeri 0 degildir.

  //compile error
}




Instance Variable nedir ? 

Bir class içerisinde tanımlanan static olmayan değişkenlere verilen isimdir.
İlk değer vermek zorunda değiliz (initialize)

Javada static ve instance degiskenlere otomatik olarak bir değer atanır.
Byte , short , int , long icin -> 0 atanir.
Float , double -> 0.0
Boolean -> false
Char –> ‘\u0000’
Object reference ve reference type icin -> null
 
Numeric Literals
Literal kavramı bir değişkenin alabileceği değerler kümesidir.
Eğer numeric değerin sonuca onun tipini belirten bir harf koymazsak int gibi davranılır.
Örnek verirsek long değişkenin sonuna L yada l harfini koyabiliriz
Ondalıklı sayılarda veri tipinin sonunda harf belirtmezsek double gibi davranır
Örnek verirsek float bir değişkenin sonuna F yada f harfini koyabiliriz
Java 7 de numeric literals arasına underscore koyarak sayının okunmasını kolaylaştırabiliriz
long numberOfUnits = 1234_567_897; 
byte b1 = 100; 
100 -> int tipindedir. //Burada otomatik olarak daraltma yapilir/narrow
byte b2 = (byte) 100;
 
 

#declaration, #instance-variable, #java, #java-dersleri, #local-variable, #numeric-literals, #veri-tipleri

Coupling(Bağlaşım) ve Cohesion(Yapışkanlık) Kavramları

Bağlaşım(Coupling):

 Bir yazılımda,uygulamada sınıflar birbiriyleriyle etkileşim haline girer ve çeşitli işler yapılır.
 Bu sınıflar birbirleriyle etkileşim haline girdiğinde aralarında bir bağımlılık oluşacaktir. Yani  bir sınıf üzerinde yapılan değişikliklerin diğer sınıflara sıçramaması gerekir.

Yapışkanlık(Cohesion):
 Cohesion kavramı sınıfın metodunun nasıl tasarlandığı ile ilgilidirHer sınıfın metodu iyi tanımlanmış görevi,amacı olmalıdır. Bir sınıf içerisinde birbiriyle alakasız metotlar olmamalıdır.
Her sınıfın sorumluluğu belli olmalıdır.
Her sınıfın sorumluluğu rolü net ve iyi tanımlı olmalıdır.
Bu yaklaşıma uyduğumuzda high cohesiona uygun olacaktır.

#baglasim, #cohesion, #coupling, #java, #java-dersleri, #yapiskanlik

Super ve This Anahtar Kelimeleri

Java da Super():

Bir alt-sınıf ne zaman üst-sınıfına erişmek isterse super anahtar sözcüğünü kullanabilir. super ‘in kullanımı iki türlü olur. Birincisi, üst-sınıfa ait nesne oluşturmak içindir. İkincisi, üst-sınıfın öğelerine erişmek içindir.(Bir üst sınıftaki default constructorı çağırır.)

Java da This():

This anahtar kelimesi o anda hangi nesne üzerinde işlem yapılıyorsa o nesnenin referansını döndürür. (Ayni sınıfta yer alan constructor i cağırmak için this() anahtar kelimesini kullanırız.)


class Animal {

 Animal(int a) {
  this();
  System.out.println("animal int ");
 }

 Animal() {
  super();
  System.out.println("Animal default");
 }
}

class Dog extends Animal {
 Dog() {
  // System.out.println("compile error. this ifadesi ilk ifade olmalidir!");
  this(10);

  System.out.println("dog default constructor");
  // super(); // hem super hem this olmaz. legal degildir, derleme hatasi
  // verecektir.

  // ayni sinifta yer alan constructor i cagirmak icin this() keywordunu
  // kullaniriz.

  // bir yapilandiricida ilk ifade ya this ifadesidir ya da super
  // ifadesidirir.
  // ikisi ayni anda olmaz!
 }

 Dog(int a) {
  super(a);
  System.out.println("dog int constructor");
  // this(); //Recursive constructor invocation Dog(int)
  // recursif olarak constructorlari cagirmaya calisirsak java bizim icin
  // derleme hatasi verecektir 🙂
 }
}

public class Test {
 public static void main(String[] args) {
  Dog dog = new Dog();
 }
}
/*
Ekran Çıktısı:
Animal default
animal int 
dog int constructor
dog default constructor
*/

#java, #java-da-anahtar-kelimeler, #java-dersleri, #super, #this

Constructor

Java da Constructor:

Javada yeni bir obje olustugunda (new anahtar kelimesi kullanıldığında) constructorlar çalışır.
Javada abstract/soyut classlar dahil tum sınıflarda en az bir tane constructor olmak zorundadır!
Eğer biz herhangi bir yapilandirici/constructor tanimlamazsak Java bizim icin bir tane constructor tanimlayacaktir. Bu constructer her zaman no-arg constructor. olacaktır.
Eğer bir tane bile constructor tanimlarsak bu durumda java bizim işimize karışmaz ve constructor tanımlamaz.

public class Yapilandirici {

 public Yapilandirici(){/* Biz eğer böyle bir yapılandırıcı tanımlamazsak 
         bunu java kendisi arka planda tanımlar.
 Eğer şimdiki gibi biz tanımlarsak java bizim işimize karışmaz.*/
  System.out.println("Comert Baldemir"); 
 }
 
 
 
 public static void main(String[] args) {
  
  Yapilandirici cs=new Yapilandirici();

 }

}

#constructor, #java, #java-dersleri, #yapilandirici

Overloaded

Java da Overloaded:

Javada metot parametreleri farkli olmak sartiyla (sira,sayi,tip,farklilidir.) tanimladigimiz metotlar constructorlar ; overloaded metotlar overloaded constructorlar ismini veriririz.

public class OverloadedTest1 {

 public static void main(String[] args) {

  overloaded(10, 100); // int
  // 10 --> int tipindedir.
  // 1.0 --> double tipindedir.
  // javada tamsayilar/integerlar varsayilan olarak "int" tipindedir.
  // noktali sayilar/kusuratli sayilar ise varsayilan olarak "double"
  // tipindedir.

  overloaded(1.0, 100); // 1.arguman double tipinde 2.arguman int tipinde
        // tam uyan metot(overloaded) yok bu nedenle
  // minimum yaklasim sergiler ve uyan en yakin metoda gider.
  overloaded(1.5, 1.567); //1.arguman ve 2.arguman double tipindedir.
  
  overloaded(1, 100.0); //1.arguman int tipinde 2.arguman double tipinde.
 }

 public static void overloaded(int a, int b) {
  System.out.println("int int");
 }
 

 public static void overloaded(double a, int b) {
  System.out.println("double int");
 }
 

 public static void overloaded(int a, double b) {
  System.out.println("int double");
 }

 public static void overloaded(double a, double b) {
  System.out.println("double double");
 }
}
       // double > float > int > short > byte sıralama bu şekildedir.

#java, #java-dersleri, #overloaded

Override

Java da Override:

Override türkçede ezmek, geçersiz kılmak anlamındadır. Bizim yapacağımız da budur  üst sınıftan alınan bir özelliği,alt sınıfta değiştirmektir.

class Animal{
 
 public void seslen()
 {System.out.println("Hayvannn");}
  
}

class Dogs extends Animal
{
@Override
public void seslen()
{
 System.out.println("Hav havv");
}
 
}

class Cats extends Animal
{
@Override
public void seslen()
{
System.out.println("Miyav miyavvv"); 
}

}


public class OverrideOrnek {

  public static void main(String[] args) {
 
  Cats kedi = new Cats();
 // Burada Cats sınıfına yazdığımız 'miyav' çalışır, animal sınıfından kalıttık ve override ile üzerine ezme yaptık.
  
  Dogs kop= new Dogs();// Dogs sınıfına yazdığımız çalışır.
  Animal hay = new Animal();//Animal sınıfında yazdığımız çalışır.
  Animal kopek= new Dogs();// Obje Dogs sınıfında tanımlandığından 'Hav Havv' yazdırır.
  kedi.seslen();
  kop.seslen();
  hay.seslen();
  kopek.seslen();
 }
/*Static metodlar ve değişkenler override edilemezler.
 * public > protected > default >private
 * Private sınırlı erişim old. override edilemezler.
 */




}

#java, #java-dersleri, #override

Kalıtım

Java da Kalıtım:
Nesne Yönelimli Programlama dillerinde kalıtım olgusu, bir sınıfta (class) tanımlanmış değişkenlerin ve/veya metotların (fonksiyon, procedure) yeniden tanımlanmasına gerek olmaksızın yeni bir sınıfa taşınabilmesidir. Bunun için yapılan iş, bir sınıftan bir alt-sınıf (subclass) türetmektir. Türetilen alt-sınıf, üst-sınıfta tanımlı olan bütün değişkenlere ve metotlara sahip olur. Bu özeliğe kalıtım özeliği (inheritance) diyoruz.



class Animal{
 
 public void seslen()
 {System.out.println("Hayvannn");}
  
}

class Dogs extends Animal
{
@Override
public void seslen()
{
 System.out.println("Hav havv");
}
 
}

class Cats extends Animal
{
@Override
public void seslen()
{
System.out.println("Miyav miyavvv"); 
}

}


public class OverrideOrnek {

  public static void main(String[] args) {
 
  Cats kedi = new Cats();
 // Burada Cats sınıfına yazdığımız 'miyav' çalışır, animal sınıfından kalıttık ve override ile üzerine ezme yaptık.
  
  Dogs kop= new Dogs();// Dogs sınıfına yazdığımız çalışır.
  Animal hay = new Animal();//Animal sınıfında yazdığımız çalışır.
  Animal kopek= new Dogs();// Obje Dogs sınıfında tanımlandığından 'Hav Havv' yazdırır.
  kedi.seslen();
  kop.seslen();
  hay.seslen();
  kopek.seslen();
 }
/*Static metodlar ve değişkenler override edilemezler.
 * public > protected > default >private
 * Private sınırlı erişim old. override edilemezler.
 */




}

#inheritance, #java, #java-dersleri, #kalitim