I am passing data from the first tab fragment to the 3rd tab fragment using an interface in the pager adapter.
My Main Activity
public class MainActivity extends AppCompatActivity implements FragmentOne.SendMessage {
TabLayout tabLayout;
ViewPager viewPager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tabLayout = findViewById(R.id.tabLayout);
viewPager = findViewById(R.id.viewPager);
tabLayout.addTab(tabLayout.newTab().setText("Fragment1"));
tabLayout.addTab(tabLayout.newTab().setText("Fragment2"));
tabLayout.addTab(tabLayout.newTab().setText("Fragment3"));
tabLayout.setTabGravity(TabLayout.GRAVITY_FILL);
final MyAdapter adapter = new MyAdapter(this, getSupportFragmentManager(),
tabLayout.getTabCount());
viewPager.setAdapter(adapter);
viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));
tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
@Override
public void onTabSelected(TabLayout.Tab tab) {
viewPager.setCurrentItem(tab.getPosition());
}
@Override
public void onTabUnselected(TabLayout.Tab tab) {
}
@Override
public void onTabReselected(TabLayout.Tab tab) {
}
});
}
@Override
public void sendData(String message) {
System.out.println("message1"+message);
String tag = "android:switcher:" + R.id.viewPager + ":" + 2; // here i am getting the value of tag but in the line below it is throwing null object reference.
FragmentThree lah = (FragmentThree)getSupportFragmentManager().findFragmentByTag(tag);
if(message != null){
assert lah != null;
lah.displayReceivedData(message); // here i am getting null
}
My First Fragment
public class FragmentOne extends Fragment {
private SendMessage sendMessage;
public FragmentOne() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
return inflater.inflate(R.layout.fragment1, container, false);
}
@Override
public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
Button btnPassData = view.findViewById(R.id.btnPassData);
final EditText inData = view.findViewById(R.id.passMessage);
btnPassData.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
sendMessage.sendData("hlahari");
}
});
}
interface SendMessage {
void sendData(String message);
}
@Override
public void onAttach(@NonNull Context context) {
super.onAttach(context);
try {
sendMessage = (SendMessage) getActivity();
}
catch (ClassCastException e) {
throw new ClassCastException("Error in retrieving data. Please try again");
}
}
}
And in third fragment I am getting data
public class FragmentThree extends Fragment {
private TextView textView;
public FragmentThree() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
return inflater.inflate(R.layout.fragment3, container, false);
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
textView = view.findViewById(R.id.txtData);
}
public void displayReceivedData(String message)
{
System.out.println("message3"+message);
textView.setText("Data received: "+message);
}
}
My view Pager adapter class
class MyAdapter extends FragmentPagerAdapter {
Context context;
int totalTabs;
public MyAdapter(Context c, FragmentManager fm, int totalTabs) {
super(fm);
context = c;
this.totalTabs = totalTabs;
}
@Override
public Fragment getItem(int position) {
switch (position) {
case 0:
FragmentOne frag1 = new FragmentOne();
return frag1;
case 1:
FragmentTwo frag2 = new FragmentTwo();
return frag2;
case 2:
FragmentThree frag3 = new FragmentThree();
return frag3;
default:
return null;
}
}
@Override
public int getCount() {
return totalTabs;
}
}
Please help me how to solve the problem. Is there any method to pass data from tab 1 fragment to 3rd tab fragment.