问题描述
我有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内部,无法访问请求代码,无法授予结果等
如何根据请求权限对话框的结果在片段中进行操作?
解决方法
Fragment类本身具有requestPermissions
和onRequestPermissionsResult
方法/函数。您可以出于自己的理由使用它。
Fragment.onRequestPermissionsResult
,-
您在片段中也有
onRequestPermissionsResult
。 -
如果您仍然想在
onRequestPermissionsResult
的中央放置Activity
,则需要调用Fragment
中onRequestPermissionsResult
Activity
的方法@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 } }
注意:还有其他与Fragment
中的Activity
进行交互的方式。
public <T> void Send(T message)
{
ReceiverWrapper<T> receiverInstance = new ReceiverWrapper<>();
// do something with the receiver...
}