Bu dersimizde greenrobot eventbus kütüphanesini fragmentten activity’e ve de activity’den fragmente veri gönderdiğimiz bir uygulama üzerinde gerçekleştirmeye çalışıcaz.
Bu örnekte fragmentA içerisinde kullanıcıdan iki sayı alınıyor ve main activity’e gönderiliyor. Main activity bu sayıları alıp topluyor ve toplam değerini fragmentBye gönderiyor. GragmentB ise aldığı bu değeri bir textview’da gösteriyor.
Eventbus kullanmasaydık, fragmentten activity’e veri gönderirken bir interface kullanmamız gerekirdi. Activityden de fragmente veri atarken ya bundle ya da fragment sınıfından bir nesne oluşturup veri gönderimi yapabilirdik.
Ama eventbus sayesinde basit bir şekilde bu veri akışını bağımlılıkları en aza indirerek gerçekleştirebiliyoruz. FragmentA sayıları alıp bir yayın başlatıyor ve de onu dinleyen sınıflara bu sayıları gönderiyor. Bu olayla ilgilenen MainActivityi bu sayıları alıp topluyor ve kendisi bu sefer bir yayın yapıyor.
MainActiviy’nin yaptığı bu yayınla ilgilenen FragmentB’ye toplam değeri gönderilip, ekrana bastırılıyor.
Uygulamanın kodları aşağıdaki gibidir, daha önce yapılan bir örnek eventbus ile yeniden gerçekleştirilmiştir. Eventbus kullanılmadan veri alış verişini sağlayan kodlar yorum satırı içine alınmıştır. Karar sizin, sizce hangisi daha kolay? 🙂
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 |
public class MainActivity extends AppCompatActivity implements MyListener { FragmentManager manager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); manager=getFragmentManager(); addFragmentA(); addFragmentB(); } private void addFragmentA() { FragmentA fragmentA=new FragmentA(); FragmentTransaction transaction=manager.beginTransaction(); transaction.add(R.id.containerA, fragmentA, "fragA"); transaction.commit(); } private void addFragmentB() { FragmentB fragmentB=new FragmentB(); FragmentTransaction transaction=manager.beginTransaction(); transaction.add(R.id.containerB, fragmentB, "fragB"); transaction.commit(); } /*@Override public void sayilariTopla(int sayi1, int sayi2) { FragmentB fragmentb= (FragmentB) manager.findFragmentByTag("fragB"); fragmentb.sayilariTopla(sayi1, sayi2); }*/ @Subscribe public void onDataEvent(DataEvent.SayilariAl event){ int sayi1=event.getSayi1(); int sayi2=event.getSayi2(); int toplam=sayi1+sayi2; Log.e("emre", "Main activtiy sayıları aldı ve topladı, Fragment B'ye gönderdi"); EventBus.getDefault().post(new DataEvent.ToplamDeger(toplam)); } @Override protected void onStart() { super.onStart(); EventBus.getDefault().register(this); } @Override protected void onStop() { super.onStop(); EventBus.getDefault().unregister(this); } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
package com.example.emrealtunbilek.fragmentverialisverisitekrar; import android.app.Fragment; import android.os.Bundle; import android.support.annotation.Nullable; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Button; import android.widget.EditText; public class FragmentA extends Fragment { EditText sayi1; EditText sayi2; Button sayilariGOnder; @Nullable @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View v= inflater.inflate(R.layout.fragment_a, container, false); sayi1= (EditText) v.findViewById(R.id.etSayi1); sayi2= (EditText) v.findViewById(R.id.etSayi2); sayilariGOnder= (Button) v.findViewById(R.id.btnActivityeSayilariGonder); sayilariGOnder.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { sendDatatoActivity(); } }); return v; } private void sendDatatoActivity() { int s1=Integer.parseInt(sayi1.getText().toString()) ; int s2=Integer.valueOf(sayi2.getText().toString()) ; /* MyListener mylistener = (MyListener) getActivity(); mylistener.sayilariTopla(s1, s2);*/ Log.e("emre", "Fragment a main activity'e sayıları gönderdi"); EventBus.getDefault().post(new DataEvent.SayilariAl(s1, s2)); } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
public class FragmentB extends Fragment { TextView sonuc; @Nullable @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View v=inflater.inflate(R.layout.fragment_b, container, false); sonuc= (TextView) v.findViewById(R.id.tvSonucFragment); return v; } /* public void sayilariTopla(int sayi1, int sayi2) { int toplam=sayi1+sayi2; sonuc.setText("TOPLAM = "+ toplam); }*/ @Subscribe public void onToplamEvent(DataEvent.ToplamDeger event){ int toplam=event.getToplam(); sonuc.setText("TOPLAM ="+ toplam); Log.e("emre", "Fragment b main activityden gelen toplam değişkenini aldı"); } @Override public void onAttach(Context context) { super.onAttach(context); EventBus.getDefault().register(this); } @Override public void onDetach() { super.onDetach(); EventBus.getDefault().unregister(this); } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
public class DataEvent { static class SayilariAl{ private int sayi1; private int sayi2; public SayilariAl(int sayi1, int sayi2) { this.sayi1 = sayi1; this.sayi2 = sayi2; } public int getSayi1() { return sayi1; } public void setSayi1(int sayi1) { this.sayi1 = sayi1; } public int getSayi2() { return sayi2; } public void setSayi2(int sayi2) { this.sayi2 = sayi2; } } static class ToplamDeger{ private int toplam; public ToplamDeger(int toplam) { this.toplam = toplam; } public int getToplam() { return toplam; } public void setToplam(int toplam) { this.toplam = toplam; } } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="com.example.emrealtunbilek.fragmentverialisverisitekrar.MainActivity"> <FrameLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/containerA" android:layout_alignParentTop="true" android:layout_centerHorizontal="true"> </FrameLayout> <FrameLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@+id/containerA" android:id="@+id/containerB" android:layout_centerHorizontal="true"> </FrameLayout> </RelativeLayout> |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:background="#0ec" > <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <EditText android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:text="0" android:inputType="number" android:id="@+id/etSayi1" /> <EditText android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:text="0" android:inputType="number" android:id="@+id/etSayi2" /> </LinearLayout> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:text="Activity'e Gönder" android:id="@+id/btnActivityeSayilariGonder" /> </LinearLayout> |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#033" android:orientation="vertical"> <TextView android:text="TextView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_centerHorizontal="true" android:layout_marginTop="10dp" android:id="@+id/tvSonucFragment" android:textColor="@android:color/white" android:textAppearance="@style/TextAppearance.AppCompat.Medium" /> </RelativeLayout> |
Hocam önce kendim yaptım olmadı sonra sizin yaptığınızı kopyala yapıştır olarak yaptım aynı problem var.
Problem şudur: Fragment B ye sayılar gidip toplamı vermiyor yani;
@Subscribe
public void onToplamEvent(DataEvent.ToplamDeger event){
int toplam=event.getToplam();
sonuc.setText(“TOPLAM =”+ toplam);
Log.e(“emre”, “Fragment b main activityden gelen toplam değişkenini aldı”);
}
bu kısma kod gelemiyor. Problem nereden olabilir acaba?
Selam; bu koda bakarak bişey diyemem; debug pointler koyup uygulama nerde nereye gidiyor, o kod bloguna girmiyorsa başka bir yerde döngüde kalıyordur veya başka bir yere dallanıyordur bakmak lazım.
Bir de sticky event kullanarak dene belki o şekilde düzelir, bir sonraki videoda onu anlatmıştım