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