Ich habe ein Fragment, in dem ich Recyclerview habe und Daten in diesem Recyclerview mithilfe des Recyclerview-Adapters einstelle.
Jetzt habe ich eine Schaltfläche im Listenelement des Adapters, auf die ich klicken muss, um die READ_EXTERNAL_STORAGE-Berechtigung in Android auf ein neues Berechtigungsmodell in Android zu überprüfen.
Ich habe eine neue Funktion im Fragment dieses Adapters erstellt, um zu überprüfen, ob eine Berechtigung erteilt wurde oder nicht, und um eine Berechtigung anzufordern, falls diese noch nicht erteilt wurde.
Ich habe MyFragment.this als Parameter im Adapter übergeben und die Methode des Fragments aufgerufen, indem ich auf die Schaltfläche im Adapter klicke.
Ich habe den folgenden Code verwendet, um requestPermission in Fragment aufzurufen.
if(ContextCompat.checkSelfPermission(mContext, Manifest.permission.READ_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED){
requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
ConstantVariables.READ_EXTERNAL_STORAGE);
}
Ich habe die onRequestPermissionsResult
Methode in Fragment mit dem folgenden Code überschrieben :
@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 {}
Es wird jedoch nicht aufgerufen, stattdessen wird die onRequestPermissionsResult-Methode dieser Aktivität aufgerufen.
Ich habe dieselbe onRequestPermissionsResult-Methode auch in der übergeordneten Aktivität des Fragments definiert und sie wird aufgerufen.
Ich kann die onRequestPermissionsResult-Methode der Aktivität nicht entfernen, möchte jedoch die onRequestPermissionsResult-Methode des Fragments aufrufen, wenn ich eine Berechtigung vom Fragment anfordere. Wie kann ich das machen? Mache ich hier etwas falsch, bitte helfen Sie mir, wenn jemand hier eine Idee hat.
quelle
Antworten:
Überarbeitete Antwort, um umfassendere Themen abzudecken
Ich denke, Sie verwechseln die Methode für Fragment und Aktivität. Hatte letzten Monat ein ähnliches Problem mit meinem Projekt. Bitte überprüfen Sie, ob Sie endlich Folgendes haben:
super.onRequestPermissionsResult
von der Aktivität aus anrufenonRequestPermissionsResult
.Sehen Sie, ob es hilft.
quelle
super.onrequestpermissionresult
das Ergebnis onrequestpermission der Aktivität hinzufügen, rufen Sie das Ergebnis onrequestpermission des Fragments auf, wenn ich die Berechtigung mit anfordererequestpermissions
. Dies funktioniert jetzt gut, vielen Dank .. :)Ich habe die Standortgenehmigung von einem Fragment angefordert und im Fragment musste ich Folgendes ändern:
dazu:
dann wurde das onRequestPermissionsResult im Fragment aufgerufen.
quelle
Dies ist ein häufiger Fehler, den Menschen beim Codieren für Marshmallow machen.
In AppCompatActivity sollten Sie ActivityCompat.requestPermissions verwenden. In android.support.v4.app.Fragment sollten Sie einfach requestPermissions verwenden (dies ist eine Instanzmethode von android.support.v4.app.Fragment). Wenn Sie ActivityCompat.requestPermissions in einem Fragment aufrufen, wird der Rückruf onRequestPermissionsResult aufgerufen die Aktivität und nicht das Fragment.
Wenn Sie diesen Code aus einem Fragment aufrufen, verfügt er über eine eigene requestPermissions-Methode.
Das Grundkonzept lautet also: Wenn Sie sich in einer Aktivität befinden, rufen Sie an
und wenn in einem Fragment, rufen Sie einfach an
Als Referenz habe ich die Antwort von diesem Link erhalten: https://www.coderzheaven.com/2016/10/12/onrequestpermissionsresult-not-called-on-fragments/
quelle
Die Methode
requestPermissions
für Fragmente erfordert API-Level 23 oder höher.Wenn Ihre App auf eine niedrigere Version abzielt, können Sie diese verwenden
Zuerst müssen Sie die support-v13-Abhängigkeit hinzufügen:
quelle
ändere das :
dazu:
quelle
Berechtigung ändern
quelle
Diese akzeptierte Antwort funktioniert bei mir nicht, daher habe ich meine eigene Lösung gefunden, die unten erläutert wird:
1. Zuerst habe ich eine Methode in Fragment erstellt:
2.Und nannte es dann von seiner zugrunde liegenden Aktivität:
Und es funktioniert ...
quelle
Stellen Sie sicher, dass beide
PERMISSION_REQUEST_CODE
inonRequestPermissionsResult
als auch in IhremFragment
den gleichen Wert enthält.quelle
Für das tragetSDK 28 würden die SDK-Prüfung (> 23) und die Anforderungsberechtigungen vom Fragment funktionieren. ActivityCompat.requestPermissions schlägt fehl (wenn Sie den Anforderungscode unter 65536 festlegen, wird das Berechtigungsdialogfeld angezeigt, und wenn der Benutzer die Berechtigung zulässt, werden die Berechtigungen bereitgestellt, es erfolgt jedoch kein Rückruf. Wenn Sie jedoch über 65536 festlegen, wird ActivityCompat.requestPermissions ausgeführt scheitern sofort. Ich kenne die Gründe für diese Logik nicht. Kann ein Fehler oder eine Absicht sein.
Arbeitscode:
quelle
Wenn Sie mit Kotlin arbeiten, sollten Sie genau angeben, dass Sie die Fragmentmethode und nicht die Aktivität aufrufen
Android M-Berechtigungen: onRequestPermissionsResult () wird nicht aufgerufen
Laufzeitberechtigungen von v4.Fragment anfordern und Rückruf an Fragment gehen lassen?
quelle
Ich hatte das gleiche Problem. Ihr Fragment kann über das Aktivitätslayout initialisiert werden. So wie das:
main_activty.xml
Dieses Problem wurde für mich gelöst, als ich es
FragmentTransaction
stattdessen verwendetequelle
In APIs unter 23 können Sie eine Schnittstelle in der Aktivität erstellen und diese dann im untergeordneten Fragment implementieren. Wenn Sie eine Berechtigungsanforderung erhalten, wird die Aktivität an die implementierte Schnittstelle im Fragment übergeben. So einfach ist das :)
quelle
Sie können die folgende Fragment-Methode aufrufen
quelle
Dieses Problem wurde tatsächlich von NestedFragments verursacht. Grundsätzlich haben die meisten Fragmente ein HostedFragment erweitert, das wiederum ein CompatFragment erweitert. Diese verschachtelten Fragmente verursachten Probleme, die schließlich von einem anderen Entwickler des Projekts gelöst wurden.
Er hat ein paar Sachen auf niedriger Ebene gemacht, wie zum Beispiel Bit-Switching, damit das funktioniert, also bin ich mir der tatsächlichen endgültigen Lösung nicht sicher
quelle