I'm having a weird issue that is causing a conflict. I had to switch to native Fragments
to fix it, but there are bugs with that.
My original problem: I have a navigation drawer setup with v4 Fragments.
To ask for permission in one of my Fragments I call ActivityCompat.requestPermissions(getActivity(), Manifest.permission.ACCESS_FINE_LOCATION, 1);
The prompt shows up just fine, but when I accept or deny the permission, nothing happens. The callback onRequestPermissionsResult()
is never called. Instead it gets called in the Activity that my Fragments are attached to. Useless to me, I need the callback to work in the Fragment.
With this in mind I was told that I need to use FragmentCompat
, but that only works with native Fragments (v13+)
, so I changed navigation drawer to work from native Fragments instead of the v4 support library Fragments. However, because I'm using AppCompatActivity, certain things do not work, like addToBackStack()
and going back to a previous fragment.
Long story short, does anyone know how I can use the v4.Fragment
and still call for permission in the Fragment
and get the callback to be in the Fragment
? I feel like this is a bug in Android that hasn't been addressed but I'm not 100%.
Let me know if you need to see my code, it's just the standard methods that you need for runtime permissions, I would like to work with v4 Fragments though which doesn't work from my understanding.
At the moment the most stable solution is doing it by hand. I myself resolved it simply by notifying child fragments from the parent fragments.
Where parent fragment implements interface ChildFragmentPermissionRegistry and registers child fragment,
and child fragments implements ChildFragmentPermissionCallback
and interfaces are something like this:
I don't know if it's recently fixed by google, but I can reach the expected result without doing any tricks.
The most important thing is to call
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
in the activity, so it will pass the result to fragment if it's requested from fragment.So, what I do is:
1) in fragment, ask permission using
v4 fragment.requestPermissions(permissions, requestCode)
2) in activity's onRequestPermissionsResult, must call
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
3) in fragment's onRequestPermissionsResult, write the code I want to handle the result.
Adding this to the parent activity works for me:
Source: https://code.google.com/p/android/issues/detail?id=189121#c5
I faced the same situation recently, when I needed to check for a permission inside the support fragment and get a callback there.
I was able to use
ContextCompat
tocheckSelfPermission
and then as @NasaGeek said calledandroid.support.v4.app.Fragment
'srequestPermissions
to request the permission and then got a call back toonRequestPermissionsResult
in v4 Fragment.Hope this helps.
Thanks.
If you need to get the permissionResult in
fragment v4
make sure you useinstead of
Check out this answer!
This behavior seems to be present in the v4 Fragment support class requestPermissions in Fragment. The Activity/FragmentCompat implementations exist for people who wish to use the native classes with the extended functionality on API levels between 11 and 23.