'Android onActivityResult in fragment

I try to get the result in a fragment. Code in fragment

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)
    if (resultCode != Activity.RESULT_OK) return

    val bundle = data?.extras
    when (requestCode) {
        LicenseActivationActivity.REQUEST_RESULT_COUNT_ENTERPRISE ->
     //
    }
}

This code is called. But also method onActivityResult in DrawerActivity

Do that onActivityResult is called only in the fragment?

UPDATE

This code in DrawerActivity

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)
    if (resultCode == Activity.RESULT_OK) {
        WayBillsActivity.start(this)
        finish()
    }
}

For some reason, it is also satisfied, but only after onActivityResult in fragment.



Solution 1:[1]

in your Activity call this

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    for (Fragment fragment : getSupportFragmentManager().getFragments()) {
        fragment.onActivityResult(requestCode, resultCode, data);
    }
}

Then call in fragment

 @Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
  //super.onActivityResult(requestCode, resultCode, data); comment this unless you 

 }

Solution 2:[2]

add code in Drawer activity

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
   fragment.super.onActivityResult(requestCode, resultCode, data)

}

   **fragment.super.onActivityResult(requestCode, resultCode, data)**

Then your onActivityResult method of fragment called

Solution 3:[3]

Everything seems good in the code. Have you checked with the debugger because I have implemented the same in my fragment and it's working fine

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

        if (resultCode == RESULT_OK) {
            switch (requestCode) {
                case REQ_CODE_EDIT_PROFILE:
                    userModel = data.getExtras().getParcelable(UserModel.class.getSimpleName());
                    setData();
                    break;
            }
        }
    }

Solution 4:[4]

onActivityResult in fragment is called only after such method in activity. If you want handle result only on activity or only in fragment - maybe it will be better to use different result codes for different situation (if I understand your problem correctly)

Solution 5:[5]

Kotlin You do this

class MyClass(mActivity: Context, mFragment: Fragment) {
      private val myActivity = mActivity
      private val myFragment = mFragment


val intent = Intent(myActivity, CalcActivity::class.java)
    intent.putExtra("id", id)
    intent.putExtra("data", data)
    
    // the result from the activity will be sent to the myFragment not myActivity 
    myFragment.startActivityForResult(intent, 123)

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Syed Danish Haider
Solution 2 Hemant Parmar
Solution 3 Sunny
Solution 4 Constantin Chernishov
Solution 5 Hamza Saidani