Wrong requestCode in onActivityResult
I'm starting a new Activity from my Fragment with
startActivityForResult(intent, 1);
and want to handle the result in the Fragment's parent Activity:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
Log.d(TAG, "onActivityResult, requestCode: " + requestCode + ", resultCode: " + resultCode);
if (requestCode == 1) {
// bla bla bla
}
}
The problem is that I never got the requestCode
I've just posted to startActivityForResult()
.
I got something like 0x40001
, 0x20001
etc. with a random higher bit set. The docs don't say anything about this. Any ideas?
Solution 1:
You are calling startActivityForResult()
from your Fragment
. When you do this, the requestCode
is changed by the Activity
that owns the Fragment
.
If you want to get the correct resultCode
in your activity try this:
Change:
startActivityForResult(intent, 1);
To:
getActivity().startActivityForResult(intent, 1);
Solution 2:
The request code is not wrong. When using v4 support library fragments, fragment index is encoded in the top 16 bits of the request code and your request code is in the bottom 16 bits. The fragment index is later used to find the correct fragment to deliver the result.
Hence for Activities started form fragment object, handle onActivityResult requestCode like below:
originalRequestCode = changedRequestCode - (indexOfFragment << 16)
6 = 196614 - (3 << 16)
Solution 3:
Easier:
Java:
int unmaskedRequestCode = requestCode & 0x0000ffff
Kotlin:
val unmaskedRequestCode = requestCode and 0x0000ffff
Check for the lower 16 bits, just unmask it doing a logical AND with the upper 16 bits zeroed
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
final int unmaskedRequestCode = requestCode & 0x0000ffff
if(unmaskedRequestCode == ORIGINAL_REQUEST_CODE){
//Do stuff
}
}
Solution 4:
If you are providing constant make it public and then use in startActivityResult
example:
public static final int REQUEST_CODE =1;
getActivity().startActivityForresult(intent, REQUEST_CODE);
Solution 5:
You can also definesuper.onActivityResult(requestCode, resultCode, data)
in Activity
(if you overrideonActivityResult
)
at this
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
...
default:
super.onActivityResult(requestCode, resultCode, data);
}
}
and call startActivityForResult(intent, requestCode)
inside your Fragment