我有MapFragment
,我在onViewCreated
:检查权限
if (uiCommunicationListener.isLocationPermissionGranted()) {
permission_button.visibility = View.GONE
val mapFragment =
childFragmentManager.findFragmentById(R.id.map) as SupportMapFragment?
mapFragment?.getMapAsync(callback)
} else {
//Hide Map
}
uiCommunicationListener
是一个负责碎片活动通信的接口。
isLocationPermissionGranted
位于MainActivity
中,看起来像这样:
override fun isLocationPermissionGranted(): Boolean {
if (ContextCompat.checkSelfPermission(
this,
android.Manifest.permission.ACCESS_FINE_LOCATION
) != PackageManager.PERMISSION_GRANTED) {
// Ask for permission
ActivityCompat.requestPermissions(
this,
arrayOf(android.Manifest.permission.ACCESS_FINE_LOCATION),
Constants.LOCATION_PREMMISION_CODE
)
return false
} else {
// Permission has already been granted
return true
}
基本上,它检查权限是否被授予,是否返回true,是否未请求权限并返回false。
问题是,在我们向他请求权限后,我无法根据用户操作进行操作。
在我的情况下,我检查权限是否已授予,是否显示地图,是否隐藏地图。
但是,如果它返回false,并且在弹出请求权限对话框并且用户授予我们权限之后,就不会发生任何事情,因为我们已经"通过";if检查
现在,通常在onRequestPermissionsResult
方法中,我可以根据用户操作进行操作(授予我们权限/拒绝请求(,但在这里,该方法位于MainActivity中,我无法访问请求代码、授予结果等。
如何根据请求权限对话框的结果在片段中进行操作?
-
片段中也有
onRequestPermissionsResult
。 -
如果您仍然希望
onRequestPermissionsResult
集中在Activity
中,则需要调用Activity
的Fragment
onRequestPermissionsResult
方法@Override public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { switch (requestCode) { case ACCESS_FINE_LOCATION_PERM: { // If request is cancelled, the result arrays are empty. if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { // permission was granted, do your work.... YourFragmentClass fragment = (YourFragmentClass)fm.findFragmentById(R.id.your_fragment_id); fragment.yourPublicMethod(); } else { // permission denied // Disable the functionality that depends on this permission. } return; } // other 'case' statements for other permssions } }
注意:从Activity
到Fragment
还有其他交互方式。
Fragment类本身具有requestPermissions
和onRequestPermissionsResult
方法/函数。你可以出于自己的原因使用它。
Fragment.requestPermissions
Fragment.onRequestPermissionsResult
private void showContacts() {
if (getActivity().checkSelfPermission(Manifest.permission.READ_CONTACTS)
!= PackageManager.PERMISSION_GRANTED) {
requestPermissions(new String[]{Manifest.permission.READ_CONTACTS},
PERMISSIONS_REQUEST_READ_CONTACTS);
} else {
doShowContacts();
}
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions,
int[] grantResults) {
if (requestCode == PERMISSIONS_REQUEST_READ_CONTACTS
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
doShowContacts();
}
}