0

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.

Lahari Areti
  • 627
  • 2
  • 10
  • 30

1 Answers1

1

Is there any method to pass data from tab 1 fragment to 3rd tab fragment.

you should use SharedViewModel approach which is recommended by Google now and it is very easy and best approach

https://developer.android.com/topic/libraries/architecture/viewmodel

Please refer to the above link.

  • Yeah in interface i call senddata method. this send data method invoked in activity and from activity i am calling 3 fragment with view pager index – Lahari Areti May 31 '20 at 11:51
  • Plz tell me how to pass multiple data in a container.I have 5 edittext in a fragment i want to send the 5 data to fragc. i am able to send 1 data to fragc . But when i passing 2variable to same method i am getting an fragc while i am getting the data. – Lahari Areti May 31 '20 at 14:08
  • Please create a Custom model class and add All of your edit text field data in that model class object and then share it to the next fragment through shared ViewModel and make sure your model should be Serializable or parceable – Daniyal Irfan May 31 '20 at 16:37
  • yes i did i created a model class and passed all the data ..thanks for helping me – Lahari Areti Jun 01 '20 at 04:48