Site icon Mobilhanem

Fragmentler Arası Data Alış Verişi (Interface Kullanarak)

Fragment Data Alışverişi

Merhaba Arkadaşlar,
Bir önceki dersimde bahsettiğim gibi bundan sonraki derslerimde Fragment‘ları ağırlıklı olarak kullanmaya devam edeceğim ve derslerimi Android Studio ortamında geliştireceğim.Android Studio kurulumu hakkında dersime buradan ulaşabilirsiniz.mobilhanem.com üzerinden anlattığım derslere bugün Fragmentlar arasında yada Fragment-Activity arasında nasıl data alış verişi yapacağımızı anlatacağım.

Activity’ler arası data alışverişlerini intentler üzerinden basit bir şekilde gerçekleştiriyorduk.Bunun hakkında ki dersimize buradan ulaşabilirsiniz. İki activity arasında direk bağlantı kurup veri alış verişi yaparken Fragmentlar da ise durum biraz daha farklıdır. Fragmentlar arasındaki data alışverişini direk kendi aralarında yapmıyor, bağlı bulundukları Activity’ler üzerinden yapıyoruz.Doğru olan yöntem budur. Bu bağlantıyı yaparken’de Interfaceler kullanarak daha esnek bir yapıda Object Oriented mantığına uygun şekilde gerçekleştiriyoruz.

Peki neden Interfacelere ihtiyaç duyarız .Bunu daha iyi anlamak için ufak bir uygulama yazdım. Uygulamanın görseli üzerinde pek durmadım. Genel olarak internetteki dersler gibi bir fragmenttan aldığım kişi bilgilerini ikinci fragmentta yazdırdım.XML dosyalarını derste paylaşmıyorum.Kaynak kod içerisinde bulabilirsiniz.Ayrıca kaynak kodları indirip incelerseniz daha iyi anlayabileceğinizi düşünüyorum. Kaynak kod üzerinde gerekli açıklamaları yapmaya çalıştım.

Anasayfa.java

import android.app.Activity;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.os.Bundle;

public class Anasayfa extends Activity implements KaydetInterface{

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

        FragmentManager fm = getFragmentManager();//Fragment Manager objesi oluşturuyoruz.//getFragmentManager() methodu Activity class ının methodudur
        FragmentTransaction ft = fm.beginTransaction();//Fragment oluşturabilmek için fm objesinin beginTransaction() methodunu çağırıyoruz
        ft.add(R.id.frame1,new Fragment1()); // Fragmentları ekleyeceğimiz yerleri ve class larını set ediyoruz
        ft.add(R.id.frame2,new Fragment2()); //Fragmentları ekleyeceğimiz yerleri ve class larını set ediyoruz
        ft.commit();//commit methodu ile değişiklikleri uyguluyoruz

    }

    @Override
    public void kaydetClick(String isim, String soyisim) {
        //kaydetClick() methodu KaydetInterface class methodudur
        //KaydetInterface implement ettiğimiz için bu methodu tanımlamak zorunludur.
        //Bu methodu Fragment1 içinden çağırıyoruz ve isim,soyisim değerlerini gönderiyoruz
        //Method içindede bu değerleri Fragment2 içindeki textDegistir() methoduna yolluyoruz
        //Böylelikle interface yardımı ile fragmentlar arasında data alışverişini bağlı oldukları activity üzerinden yapıyoruz

        FragmentManager fm = getFragmentManager();
        //Fragment2 içindeki textDegistir methodunu çağıracağımız için Fragment2 den obje oluşturuyoruz
        Fragment2 f2 = (Fragment2)fm.findFragmentById(R.id.frame2);
        f2.textDegistir(isim,soyisim);

    }
}

Fragment1.java

import android.os.Bundle;
import android.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;

public class Fragment1 extends Fragment {
    Button kaydet; //Buton referansı
    EditText isim_edittext,soyisim_edittext; //Edittext referansı
    String isim,soyisim;
    KaydetInterface kaydetinterface; //KaydetInterface referansı
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_fragment1, container, false);

        isim_edittext = (EditText)view.findViewById(R.id.isim_edittex);
        soyisim_edittext = (EditText)view.findViewById(R.id.soyisim_edittext);
        kaydet = (Button)view.findViewById(R.id.kaydet);

        kaydet.setOnClickListener(new View.OnClickListener() {//Kaydet buton click listener
            @Override
            public void onClick(View v) {
                isim = isim_edittext.getText().toString(); //Edittextteki değeri alıyoruz
                soyisim = soyisim_edittext.getText().toString();//Edittextteki değeri alıyoruz

                //Interface methodunu kullanacağız.Burda dikkat etmeniz gereken konu
                //getActivity() i KaydetInterface ile cast etmemiz
                //Çünkü biz suan Anasayfa içindeki methodu çağıracağız
                //İşte burda interface methodunun faydalarını görüyoruz
                //Burda interface üzerinden değilde direk Anasayfa içindeki bir methoduda aşağıdaki gibi çağırabilirdik
                //Anasayfa a =new Anasayfa();
                //a.kaydetClick("","");

                //Ama bu fragment o zaman sadece bu activity için kullanılırdı
                // İnterface kullanarak artık hangi Activity içinde bu fragment kullanılırsa o Activity KaydetInterface implement ederek
                //kaydetClick methodunu çağırabilir

                kaydetinterface = (KaydetInterface)getActivity();
                kaydetinterface.kaydetClick(isim, soyisim);
            }
        });

        return view;
    }

}

Fragment2.java

import android.os.Bundle;
import android.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

public class Fragment2 extends Fragment {
    TextView txtView;
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_fragment2, container, false);
        txtView = (TextView)view.findViewById(R.id.textView1);

        return view;
    }

    public void textDegistir(String isim,String soyisim){
        //Bu method Anasayfa Avctivity den çağırılıor.İsim ve soyisim değerleri gönderiliyor
        //Böylelikle Fragmnetler arasında veri alışverişi Activity üstünden oluyor
        txtView.setText(isim+" "+soyisim);

    }

}

Gelelim işin kilit noktası olan Interface’imize. Dediğim gibi kod üzerinde açıklama yaptım ama yinede bu ders içinde interface’i ne amaçla kullandık onu anlatayım.Burda kullandığımız Fragment1 classı içinden Anasayfa içindeki bir methodu çağırmamız gerekiyor ki bu methodla Fragment2 methoduna bilgi gönderebilelim veya gerekli başka işlemleri yapalım.Fragment1 içinden Anasayfa objesi oluşturup direk bu obje üzerinden gerekli methodu çağırabiliriz ama o zaman bu Fragment1 classı sadece Anasayfa Activity si içinden kullanılabilir. Başka bir activity içinde kullanılamaz çünkü Anasayfa içindeki methodu çağırabiliyor. İşte bunu önlemek ve Fragment1 classımızı başka activityler içinde de kullanabilmek için Interface tanımlıyoruz ve bu interface’i hangi activity implement ederse çağıracağımız method belli olur.Tabi interface’lerin çok daha fazla kullanım alanları var ancak ben daha derinlemesine girmiyorum.

KaydetInterface.java

/**
 * Created by tahakirca on 11/01/15.
 */
public interface KaydetInterface {

    public void kaydetClick(String isim,String soyisim);

}
Fragment Data Alışverişi

Evet arkadaşlar bu derste anlatmak istediklerim bu kadar. Bu derste fragmentlar arasında veri alışverişi nasıl yapılır onu anlattım. Bu ders ile bundan sonraki anlatacağım fragment dersleri için bir alt yapı oluşturdum.

Sizlerden ricamız facebook.com/mobilhanem sayfamızı beğenmenizdir. Bu ders hakkında aklınıza takılan her türlü soruyu sorabilir ve ya eklemek istediğiniz bir konu olursa yorum bırakabilirsiniz.Bir dahaki dersimde Fragment Listview kullanımını anlatacağım.O zamana kadar kendinize iyi bakın…

Tüm Android Ders, Proje ve Kaynak Kodlar için tıklayınız.

2
Exit mobile version