Search code examples
androidfragmentcall

How to call fragment from the BottomSheetDialogFragment in android


I find it very difficult to call the InsertSlider in the MainFragment from the BottomSheetDialog. Any help and thanks

In the BottomSheet :

public class AdminBottomSheetMainSave extends BottomSheetDialogFragment
{
 // One Method I don.t Know How To Work                  
 //((MainFragment)getContext()).InsertSliders(new ImageSlider(0,Name,Image,Price,Description));
 // Not Work Too
    MainFragment fragment = new MainFragment();
    fragment.InsertSliders(new ImageSlider(0,Name,Image,Price,Description));
}

In the Fragment :

public class MainFragment extends Fragment
{
public void InsertSliders(ImageSlider imageSlider)
{
    imageSliderViewModel.insert(imageSlider);
    Toast.makeText(getActivity(), "Done Insert"+imageSlider, Toast.LENGTH_SHORT).show();
}

What is the contact method how do I get to InsertSliders


Solution

  • you should use interface to communicate between two fragments and you need an activity to implement the interface.

    define interface in your bottomsheetdialogfragment:

    public class AdminBottomSheetMainSave extends BottomSheetDialogFragment
    {
        public Callback mCallback;
    
      public interface Callback{
       void insertSlider(ImageSlider slider);
      }
    
     @Override
      public void onAttach(Activity activity){
     super.onAttach(activity);
     mCallback = (Callback) activity;
    }
     @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
    //...
    
    mCallback.insertSlider(new ImageSlider(0,Name,Image,Price,Description));
      }
    }
    

    then in your activity in our case MainActivity implement Callback interface and override inserSlider method:

     public class MainActivity extends AppCompatActivity implements Callback{
      MainFragment mainFragment;
      @Override
      public void onCreate(Bundle savedInstanceState){
      super.onCreate(savedInstanceState);
      setContentView(R.layout.main);
      //...
      if(savedInstanceState == null){
         mainFragment = MainFragment.newInstance(new Bundle()); // use real bundle here
         getSupportFragmentManager()
             .beginTransaction()
             .add(R.id.fragment_holder, mainFragment, "FragMain").commit();
       }
      }
     // Interface method
     @Override
     public void insertSlider(ImageSlider slider){
     if(mainFragment != null){
          mainFragment.insertSlider(slider);
        }
     }
    

    now in your MainFragment:

    public class MainFragment extends Fragment{
    
      public static MainFragment newInstance(Bundle args){
          MainFragment fragment = new MainFragment();
          fragment.setArguments(args);
          return fragment;
      }
    
     //... Class overrides here onCreateView etc..
    
    // define insertSlider method 
    public void insertSlider(ImageSlider slider){
    
    imageSliderViewModel.insert(slider);
    Toast.makeText(getActivity(), "Done Insert"+slider, Toast.LENGTH_SHORT).show();
      }