J'ai un fragment dans lequel j'ai recyclerview et les données de réglage dans ce recyclerview à l'aide de l'adaptateur recyclerview.
Maintenant, j'ai un bouton dans l'élément de liste de l'adaptateur en cliquant sur lequel je dois vérifier l'autorisation READ_EXTERNAL_STORAGE dans Android pour un nouveau modèle d'autorisation dans Android.
J'ai créé une nouvelle fonction dans le fragment de cet adaptateur pour vérifier si l'autorisation est accordée ou non et demander l'autorisation si elle n'est pas déjà accordée.
J'ai passé MyFragment.this en tant que paramètre dans l'adaptateur et en appelant la méthode du fragment sur le bouton cliquez dans l'adaptateur.
J'ai utilisé le code ci-dessous pour appeler requestPermission en fragment.
if(ContextCompat.checkSelfPermission(mContext, Manifest.permission.READ_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED){
requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
ConstantVariables.READ_EXTERNAL_STORAGE);
}
J'ai remplacé la onRequestPermissionsResult
méthode dans fragment en utilisant le code ci-dessous:
@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
switch (requestCode) {
case ConstantVariables.READ_EXTERNAL_STORAGE:
// If request is cancelled, the result arrays are empty.
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// permission was granted, proceed to the normal flow.
startImageUploading();
} else {}
Mais il n'est pas appelé, au lieu de l'appel de la méthode onRequestPermissionsResult de cette activité.
J'ai également défini la même méthode onRequestPermissionsResult dans l'activité parent du fragment et elle est appelée.
Je ne peux pas supprimer la méthode onRequestPermissionsResult de l'activité mais je souhaite appeler la méthode onRequestPermissionsResult du fragment lorsque je demande l'autorisation du fragment. Comment puis-je faire ceci? Suis-je en train de faire quelque chose de mal ici, aidez-moi s'il vous plaît si quelqu'un a une idée ici.
la source
Réponses:
Réponse modifiée pour couvrir des problèmes plus larges
Je pense que vous confondez la méthode du fragment et de l'activité. J'ai eu un problème similaire à mon projet le mois dernier. Veuillez vérifier si vous avez enfin les éléments suivants:
super.onRequestPermissionsResult
depuis l'activitéonRequestPermissionsResult
.Voyez si cela aide.
la source
super.onrequestpermissionresult
de onrequestpermissionresult de l'activité appelle le onrequestpermissionresult du fragment lorsque je demande l'autorisation d'utiliserrequestpermissions
. Cela fonctionne bien maintenant, merci beaucoup .. :)J'ai demandé l'autorisation de localisation à un fragment et dans le fragment, je devais changer ceci:
pour ça:
puis onRequestPermissionsResult a été appelé dans le fragment.
la source
C'est une erreur courante que font les gens lors du codage de la guimauve.
Dans AppCompatActivity, vous devez utiliser ActivityCompat.requestPermissions; Lorsque vous êtes dans android.support.v4.app.Fragment, vous devez simplement utiliser requestPermissions (il s'agit d'une méthode d'instance de android.support.v4.app.Fragment) Si vous appelez ActivityCompat.requestPermissions dans un fragment, le rappel onRequestPermissionsResult est appelé sur l'activité et non le fragment.
Si vous appelez ce code à partir d'un fragment, il possède sa propre méthode requestPermissions.
Donc, le concept de base est, si vous êtes dans une activité, alors appelez
et si dans un fragment, il suffit d'appeler
Pour la référence, j'ai obtenu la réponse à partir de ce lien https://www.coderzheaven.com/2016/10/12/onrequestpermissionsresult-not-called-on-fragments/
la source
La méthode
requestPermissions
sur les fragments nécessite le niveau d'API 23 ou supérieur.Si votre application cible une version inférieure, vous pouvez utiliser
Vous devez d'abord ajouter la dépendance support-v13:
la source
change ça :
pour ça :
la source
modifier l'autorisation
la source
Cette réponse acceptée ne fonctionne pas pour moi, j'ai donc trouvé ma propre solution, expliquée ci-dessous:
1.J'ai d'abord créé une méthode, en fragment:
2. Et puis l'a appelé à partir de son activité sous-jacente:
Et ça marche ...
la source
Vérifiez que
PERMISSION_REQUEST_CODE
dansonRequestPermissionsResult
et à l'intérieur de votreFragment
contient la même valeur.la source
Pour le tragetSDK 28, la vérification du SDK (> 23) et les demandes d'autorisation du fragment fonctionneraient. ActivityCompat.requestPermissions échoue (si vous définissez un code de demande inférieur à 65536, la boîte de dialogue d'autorisation apparaît et si l'utilisateur autorise l'autorisation, les autorisations sont fournies, mais aucun rappel ne se produira. Mais si vous définissez au-dessus de 65536, ActivityCompat.requestPermissions échouer immédiatement. Je ne connais pas le raisonnement derrière cette logique. peut être un bogue ou intentionnel).
Code de travail:
la source
Si vous travaillez avec Kotlin, vous devez spécifier exactement que vous appelez la méthode fragment, pas l'activité
Autorisations Android M: onRequestPermissionsResult () n'est pas appelé
Demander des autorisations d'exécution à partir de la v4.Fragment et faire passer le rappel à Fragment?
la source
J'ai eu le même problème. Votre fragment peut être initialisé à partir de la mise en page de l'activité. Comme ça:
main_activty.xml
Ce problème a été résolu pour moi lorsque j'ai utilisé à la
FragmentTransaction
placela source
dans les API inférieures à 23, vous pouvez créer une interface dans l'activité, puis l'implémenter dans le fragment enfant et lorsque vous obtenez une demande d'autorisation, l'activité la transmet à l'interface implémentée dans le fragment. C'est aussi simple :)
la source
vous pouvez appeler la méthode Fragment ci-dessous
la source
Ce problème était en fait causé par NestedFragments. Fondamentalement, la plupart des fragments que nous avons étendent un HostedFragment qui à son tour étend un CompatFragment. Le fait d'avoir ces fragments imbriqués a provoqué des problèmes qui ont finalement été résolus par un autre développeur du projet.
Il faisait des trucs de bas niveau comme la commutation de bits pour que cela fonctionne, donc je ne suis pas trop sûr de la solution finale réelle
la source