简体   繁体   中英

Getting null object reference when passing data from 1st tab to 3rd tab activity in android

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.

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.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM