I'm working with run time permissions and trying to make a method displaying permission rationale/s for taken permission/s and rationale/s The problem is: "Variable 'requiredPermissions' is accessed from within inner class, needs to be declared final"
That's how I call the method:
showRationale(R.string.permission_ACCESS_FINE_LOCATION_rationale, new String[]{Manifest.permission.ACCESS_FINE_LOCATION});
And that's the method:
private void showRationale(int rationale, String[] requiredPermissions) {
Snackbar.make(findViewById(R.id.myCoordinatorLayout), rationale, Snackbar.LENGTH_INDEFINITE)
.setAction(R.string.go_grant_permission, new View.OnClickListener() {
@Override
public void onClick(View view) {
// 'requiredPermissions' below causes the problem
ActivityCompat.requestPermissions(MapsActivity.this, requiredPermissions, MY_PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION);
}
})
.show();
}
您可以通过界面实现onClick,而不必将此变量定为final。
What about this:
private void showRationale(int rationale, final String[] requiredPermissions) {
Snackbar.make(findViewById(R.id.myCoordinatorLayout), rationale, Snackbar.LENGTH_INDEFINITE)
.setAction(R.string.go_grant_permission, new View.OnClickListener() {
@Override
public void onClick(View view) {
// 'requiredPermissions' below causes the problem
ActivityCompat.requestPermissions(MapsActivity.this, requiredPermissions, MY_PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION);
}
})
.show();
}
The problem is that local variables (and method arguments) must be final
to be accessed inside inner classes like your OnClickListener
. So you should add a final
keyword before a declaration of the argument. To do so, change this line
private void showRationale(int rationale, String[] requiredPermissions) {
to
private void showRationale(int rationale, final String[] requiredPermissions) {
Read more on this topic here .
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.