Passing data From Activity to Fragment using interface

24,563

Solution 1

Write this line of code after onCreate method.

public void passVal(FragmentCommunicator fragmentCommunicator) {
    this.fragmentCommunicator = fragmentCommunicator;
}

Something like this

public class MainActivity extends AppCompatActivity{

FragmentCommunicator fragmentCommunicator;
private Fragment fragment;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Button b = (Button) findViewById(R.id.button);

    fragment= new Fragment();

    //App is crasing for this line. Working fine by removing it
    //fragmentCommunicator = (FragmentCommunicator) getApplication();

    //fragmentCommunicator.passData("hello");
    getSupportFragmentManager().beginTransaction().replace(R.id.container ,fragment).commit();

    b.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            fragmentCommunicator.passData("Hello");

        }
    });

  }

   //Here is new method
   public void passVal(FragmentCommunicator fragmentCommunicator) {
       this.fragmentCommunicator = fragmentCommunicator;

   }
}

Then write this line of code into onCreateView() of your fragment. Something like this

@Override 
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup  container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment, null);

((MainActivity) getActivity()).passVal(new FragmentCommunicator() {
       @Override
       public void passData(String name) {
           Toast.makeText(c, name, Toast.LENGTH_SHORT).show();
       }
   });
  return view;
}

Note: no need to implement FragmentCommunicator interface in your fragment. Hope it works. It works for me. I have tested

Solution 2

Activities contain fragments, you shouldn't need to pass anything. One technique would be to store your data in the activity scope and get a reference to it with getActivity().

Best practice to reference the parent activity of a fragment?

As far as the code you posted, I don't see where you call your pass data method within the fragment. I would suggest calling it in onviewcreated().

I will attempt to provide some sample code later as doing this on my mobile device is proving difficult.

Try passdata (getActivity ().someStringVariable);

Share:
24,563
Akshay Sood
Author by

Akshay Sood

Updated on October 12, 2020

Comments

  • Akshay Sood
    Akshay Sood over 3 years

    I want to pass data from an activity to a fragment, using an interface. Please have a look at the code snippets below:

    Interface:

    public interface FragmentCommunicator {
    
       public void passData(String name);
    }
    

    MainActivity:

    public class MainActivity extends AppCompatActivity{
    
        FragmentCommunicator fragmentCommunicator;
        private Fragment fragment;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            Button b = (Button) findViewById(R.id.button);
            b.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    fragment= new Fragment();
                    fragmentCommunicator = (FragmentCommunicator) getApplication();
                    fragmentCommunicator.passData("hello");
                    getSupportFragmentManager().beginTransaction().replace(R.id.container ,fragment).commit();
    
                }
            });
    
        }
    }
    

    Fragment:

    public class Fragment extends android.support.v4.app.Fragment implements FragmentCommunicator {
    
        FragmentCommunicator communicator;
        Context c;
    
        @Nullable
        @Override
        public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
            View view = inflater.inflate(R.layout.fragment, null);
    
            return view;
        }
    
        @Override
        public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
            super.onViewCreated(view, savedInstanceState);
    
        }
    
        @Override
        public void onAttach(Context context) {
            super.onAttach(context);
            this.c = context;
    
        }
        @Override
        public void passData(String name) {
            Toast.makeText(c, name, Toast.LENGTH_SHORT).show();
        }
    }
    

    I just want to pass some string when I click on button, (or some other event) to launch a fragment, and when the fragment is launched, it should show a toast containing that string...

    Please help any help would be appreciated.