Passing an Object from an Activity to a Fragment

前端 未结 8 1910
别那么骄傲
别那么骄傲 2020-11-27 10:55

I have an Activity which uses a Fragment. I simply want to pass an object from this Activity to the Fragment.

How

相关标签:
8条回答
  • 2020-11-27 11:20

    In your activity class:

    public class BasicActivity extends Activity {
    
    private ComplexObject co;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_page);
    
        co=new ComplexObject();
        getIntent().putExtra("complexObject", co);
    
        FragmentManager fragmentManager = getFragmentManager();
        Fragment1 f1 = new Fragment1();
        fragmentManager.beginTransaction()
                .replace(R.id.frameLayout, f1).commit();
    
    }
    

    Note: Your object should implement Serializable interface

    Then in your fragment :

    public class Fragment1 extends Fragment {
    
    ComplexObject co;
    
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        Intent i = getActivity().getIntent();
    
        co = (ComplexObject) i.getSerializableExtra("complexObject");
    
        View view = inflater.inflate(R.layout.test_page, container, false);
        TextView textView = (TextView) view.findViewById(R.id.DENEME);
        textView.setText(co.getName());
    
        return view;
    }
    }
    
    0 讨论(0)
  • 2020-11-27 11:21

    This one worked for me:

    In Activity:

    User user;
    public User getUser(){ return this.user;}
    

    In Fragment's onCreateView method:

    User user = ((MainActivity)getActivity()).getUser(); 
    

    Replace the MainActivity with your Activity Name.

    0 讨论(0)
  • 2020-11-27 11:22

    Get reference from the following example.

    1. In fragment: Create a reference variable for the class whose object you want in the fragment. Simply create a setter method for the reference variable and call the setter before replacing fragment from the activity.

     MyEmployee myEmp;
     public void setEmployee(MyEmployee myEmp)
     {
         this.myEmp = myEmp;
     }
    

    2. In activity:

       //we need to pass object myEmp to fragment myFragment
    
        MyEmployee myEmp = new MyEmployee();
    
        MyFragment myFragment = new MyFragment();
    
        myFragment.setEmployee(myEmp);
    
        FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
        ft.replace(R.id.main_layout, myFragment);
        ft.commit();
    
    0 讨论(0)
  • 2020-11-27 11:27

    If the data should survive throughout the application lifecycle and shared among multiple fragments or activities, a Model class might come into consideration, which has got less serialization overhead.

    Check this design example

    0 讨论(0)
  • 2020-11-27 11:28

    Create a static method in the Fragment and then get it using getArguments().

    Example:

    public class CommentsFragment extends Fragment {
      private static final String DESCRIBABLE_KEY = "describable_key";
      private Describable mDescribable;
    
      public static CommentsFragment newInstance(Describable describable) {
        CommentsFragment fragment = new CommentsFragment();
        Bundle bundle = new Bundle();
        bundle.putSerializable(DESCRIBABLE_KEY, describable);
        fragment.setArguments(bundle);
    
        return fragment;
      }
    
      @Override
      public View onCreateView(LayoutInflater inflater,
          ViewGroup container, Bundle savedInstanceState) {
    
        mDescribable = (Describable) getArguments().getSerializable(
            DESCRIBABLE_KEY);
    
        // The rest of your code
    }
    

    You can afterwards call it from the Activity doing something like:

    FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
    Fragment fragment = CommentsFragment.newInstance(mDescribable);
    ft.replace(R.id.comments_fragment, fragment);
    ft.commit();
    
    0 讨论(0)
  • 2020-11-27 11:28

    To pass an object to a fragment, do the following:

    First store the objects in Bundle, don't forget to put implements serializable in class.

                CategoryRowFragment fragment = new CategoryRowFragment();
    
                // pass arguments to fragment
                Bundle bundle = new Bundle();
    
                // event list we want to populate
                bundle.putSerializable("eventsList", eventsList);
    
                // the description of the row
                bundle.putSerializable("categoryRow", categoryRow);
    
                fragment.setArguments(bundle);
    

    Then retrieve bundles in Fragment

           // events that will be populated in this row
            mEventsList = (ArrayList<Event>)getArguments().getSerializable("eventsList");
    
            // description of events to be populated in this row
            mCategoryRow = (CategoryRow)getArguments().getSerializable("categoryRow");

    0 讨论(0)
提交回复
热议问题