How to make a callback between Activity and Fragment?

后端 未结 3 1015
孤独总比滥情好
孤独总比滥情好 2020-12-05 10:54

I have this interface in my activity.

public interface LogoutUser {
    void logout();
}

My fragment implements this interface, so in my fr

相关标签:
3条回答
  • 2020-12-05 11:35

    As I said in my comment, I resolved this issue using onAttach method in my fragment, but in this way you have to have the callback field (mLogoutUser in this case) declared in the fragment, and initialize it this way:

    public class MyFragment extends ListFragment {
        LogoutUser mLogoutUser;
    
        // Container Activity must implement this interface
        public interface LogoutUser {
            public void logout();
        }
    
        @Override
        public void onAttach(Context context) {
            super.onAttach(context);
    
            // This makes sure that the container activity has implemented
            // the callback interface. If not, it throws an exception
            try {
                mLogoutUser = (LogoutUser) context;
            } catch (ClassCastException e) {
                throw new ClassCastException(context.toString()
                        + " must implement LogoutUser");
            }
        }
    
        ...
    }
    

    More info in Communicating with Other Fragments.


    But if your case is the field declared in the activity, you can use the onAttachFragment method from your activity to initialize your listener field this way:

    @Override
    public void onAttachFragment(Fragment fragment) {
        super.onAttachFragment(fragment);
    
        mLogoutUser = (LogoutUser) fragment;
    }
    

    Also, you can use an event bus to make this communication between fragments and activities. An option is the Otto library, from Square.

    0 讨论(0)
  • 2020-12-05 11:35

    Sample for creating callback from Fragment to Activity

    public interface CallBackListener {
        void onCallBack();// pass any parameter in your onCallBack which you want to return
    }
    

    CallBackFragment.class

    public class CallBackFragment extends Fragment {
    
        private CallBackListener callBackListener;
    
        public CallBackFragment() {
            // Required empty public constructor
        }
    
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
            // Inflate the layout for this fragment
    
            return inflater.inflate(R.layout.fragment_call_back, container, false);
        }
    
        @Override
        public void onActivityCreated(@Nullable Bundle savedInstanceState) {
            super.onActivityCreated(savedInstanceState);
            //getActivity() is fully created in onActivityCreated and instanceOf differentiate it between different Activities
            if (getActivity() instanceof CallBackListener)
                callBackListener = (CallBackListener) getActivity();
        }
    
        @Override
        public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
            super.onViewCreated(view, savedInstanceState);
    
            Button btn = (Button) view.findViewById(R.id.btn_click);
            btn.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if(callBackListener != null)
                        callBackListener.onCallBack();
                }
            });
        }
    }
    

    CallbackHandlingActivity.class

    public class CallbackHandlingActivity extends AppCompatActivity implements CallBackListener
    {
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_all_user);
    
        }
    
        @Override
        public void onCallBack() {
            Toast.makeText(mContext,"onCallback Called",Toast.LENGTH_LONG).show();
        }
    }
    
    0 讨论(0)
  • 2020-12-05 11:47

    Android Fragments - Communicating with Activity

    You need to get a reference to your fragment with getFragmentById() or getFragmentByTag()

    getFragmentManager().findFragmentById(R.id.example_fragment);
    
    0 讨论(0)
提交回复
热议问题