onActivityResult is not being called in Fragment

后端 未结 30 2624
忘了有多久
忘了有多久 2020-11-21 04:28

The activity hosting this fragment has its onActivityResult called when the camera activity returns.

My fragment starts an activity for a result with th

30条回答
  •  野的像风
    2020-11-21 05:01

    This is one of the most popular issue. We can found lots of thread regarding this issue. But none of them is useful for ME.

    So I have solved this problem using this solution.

    Let's first understand why this is happening.

    We can call startActivityForResult directly from Fragment but actually mechanic behind are all handled by Activity.

    Once you call startActivityForResult from a Fragment, requestCode will be changed to attach Fragment's identity to the code. That will let Activity be able to track back that who send this request once result is received.

    Once Activity was navigated back, the result will be sent to Activity's onActivityResult with the modified requestCode which will be decoded to original requestCode + Fragment's identity. After that, Activity will send the Activity Result to that Fragment through onActivityResult. And it's all done.

    The problem is:

    Activity could send the result to only the Fragment that has been attached directly to Activity but not the nested one. That's the reason why onActivityResult of nested fragment would never been called no matter what.

    Solution:

    1) Start Intent in your Fragment by below code:

           /** Pass your fragment reference **/
           frag.startActivityForResult(intent, REQUEST_CODE); // REQUEST_CODE = 12345
    

    2) Now in your Parent Activity override **onActivityResult() :**

        @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
        }
    

    You have to call this in parent activity to make it work.

    3) In your fragment call:

    @Override
        public void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
            if (resultCode == Activity.RESULT_OK) {
    
           }
    }
    

    That's it. With this solution, it could be applied for any single fragment whether it is nested or not. And yes, it also covers all the case! Moreover, the codes are also nice and clean.

提交回复
热议问题