Communication between Fragments in ViewPager

android, android-fragments, fragmentstatepageradapter

Solution

- You could use Intents (register broadcast receiver in fragment B and send broadcasts from fragment A.

- Use EventBus: https://github.com/greenrobot/EventBus. It's my favorite approach. Very convinient to use, easy communications between any components (Activity & Services, for example).

Steps to do:

First, create some class to represent event when your text changes:

public class TextChangedEvent {
  public String newText;
  public TextChangedEvent(String newText) {
      this.newText = newText;
  }
}

Then, in fragment A:

//when text changes
EventBus bus = EventBus.getDefault();
bus.post(new TextChangedEvent(newText));

in fragment B:

EventBus bus = EventBus.getDefault();

//Register to EventBus
@Override
public void onCreate(SavedInstanceState savedState) {
 bus.register(this);
}

//catch Event from fragment A
public void onEvent(TextChangedEvent event) {
 yourTextView.setText(event.newText);
}

Problem

I'm trying to do this: http://android-er.blogspot.com/2012/06/communication-between-fragments-in.html Except that I'm using a FragmentStatePagerAdapter I have an Activity with two fragments(FragmentA & FragmentB) FragmentA has an edittext and a button, FragmentB has a textview Now all I want is that whenever I enter something in the edittext and click the button, that something will appear on my textview. MainActivity: ``` public class MainActivity extends FragmentActivity { ViewPager viewPager = null; String TabFragmentB; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); viewPager = (ViewPager)findViewById(R.id.pager); FragmentManager fragmentManager = getSupportFragmentManager(); viewPager.setAdapter(new MyAdapter(fragmentManager)); } public class MyAdapter extends FragmentStatePagerAdapter { public MyAdapter (FragmentManager fm) { super(fm); } @Override public Fragment getItem(int i) { Fragment fragment = null; if (i == 0) { fragment = new FragmentA(); } if (i == 1) { fragment = new FragmentB(); } return fragment; } @Override public int getCount() { return 2; } } public void setTabFragmentB(String t) { TabFragmentB = t; } public String getTabFragmentB() { return TabFragmentB; } } ``` FragmentA: ``` public class FragmentA extends Fragment { EditText et; Button bt; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View v = inflater.inflate(R.layout.fraga, container, false); et = (EditText)v.findViewById(R.id.edit1); bt = (Button)v.findViewById(R.id.button1); bt.setOnClickListener(Click); return v; } OnClickListener Click = new OnClickListener(){ @Override public void onClick(View v) { String textPassToB = et.getText().toString(); String TabOfFragmentB = ((MainActivity)getActivity()).getTabFragmentB(); FragmentB fragmentB = (FragmentB)getActivity() .getSupportFragmentManager() .findFragmentByTag(TabOfFragmentB); fragmentB.updateText(textPassToB); } }; } ``` FragmentB: ``` public class FragmentB extends Fragment { TextView tv; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View v = inflater.inflate(R.layout.fragb, container, false); tv = (TextView)v.findViewById(R.id.text1); String myTag = getTag(); ((MainActivity)getActivity()).setTabFragmentB(myTag); return v; } public void updateText(String t){ tv.setText(t); } } ``` LogCat: ``` FATAL EXCEPTION: main java.lang.NullPointerException at lmf.sample1.FragmentA$1.onClick(FragmentA.java:43) at android.view.View.performClick(View.java:4212) at android.view.View$PerformClick.run(View.java:17476) at android.os.Handler.handleCallback(Handler.java:800) at android.os.Handler.dispatchMessage(Handler.java:100) at android.os.Looper.loop(Looper.java:194) at android.app.ActivityThread.main(ActivityThread.java:5371) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:525) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:833) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600) at dalvik.system.NativeStart.main(Native Method) ``` Whenever I click the button on my first fragment, my app crashes. What the hell is the problem?

Original source