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.
Fragmentler Arası Veri Alış Verişi (Interface Kullanarak)
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); }
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.
Yaş Hesaplama uygulamasını nasıl yapabiliriz acaba
Ne gibi bir uygulama yapacaksın? Bu konuyla pek ilgisi yok sorunun. Soru-cevap kısmından sorarsan yardım etmeye çalışacağım.
çok teşekkürler
Selamlar Taha Bey, ve Diğer geliştirici arkadaşlar.
slider Menü kullanarak bi uygulama yaptımi fakat slider menü deki fragmentler arası veri aktaramıyorum.
Activity lerde intent var. fragment te nasıl olacak bu yapı? internetteki örneklerin hepsi aynı activity üzerindeki fragmentler arasında veri transferi yapıyor.
fragmentler arası geçiş reklamı olurmu? menüden o fragment seçilirse geçiş reklamı çıkmasını istiyorum nasıl olabilir acaba
Elinize Sağlık Çok teşekkürler
Yorum için biz teşekkür ederiz,
Kolay gelsin..
kaydet.setOnClickListener(new View.OnClickListener() {}
Viewdan onClickListener interface ‘ini nasıl türettiniz mantığı nedir?neden böyle bir şey kullandık?Teşekkürler.
bu dersimizi inceleyebilirsiniz daha kolay bir anlatım mevcut:
https://www.mobilhanem.com/android-fragmentlar-arasi-veri-gonderimi-bundle-ile/
benim anlayamadığım View bir class ve kodda Viewdan OnClickListener interface ini çağırıyorsunuz bu nasıl oluyor?
hocam merhaba .siz 2 fragmenti aynı sayfada açık vaziyetteyken veri aktarımı yaptınız peki yeni fragment açıcakken nasıl yapıcaz . javafx de ben yeni bir form açarken Sayfa2 sayfa2=new Sayfa2(String deger1,Integer deger2);
sayfa2.Show;
şeklinde açabiliyorum androidde bu tarz bi olayı başarmaya çalışyıroum fakat bir türlü yapamadım . bu konuda yardımcı olabilir misiniz?