Mam fragment, w którym mam przegląd recyklingu i ustawienia danych w tym widoku recyklingu przy użyciu adaptera recyklingu.
Teraz mam przycisk w elemencie listy adaptera, po kliknięciu którego muszę sprawdzić uprawnienie READ_EXTERNAL_STORAGE w systemie Android, aby uzyskać nowy model uprawnień w systemie Android.
Utworzyłem nową funkcję we fragmencie tego adaptera, aby sprawdzić, czy zezwolenie zostało udzielone, czy nie, i poprosić o pozwolenie, jeśli nie zostało już przyznane.
Przekazałem MyFragment.this jako parametr w adapterze i wywołałem metodę fragmentu po kliknięciu przycisku w adapterze.
Użyłem poniższego kodu, aby wywołać requestPermission fragmentem.
if(ContextCompat.checkSelfPermission(mContext, Manifest.permission.READ_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED){
requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
ConstantVariables.READ_EXTERNAL_STORAGE);
}
Zastąpiłem onRequestPermissionsResult
metodę we fragmencie, używając poniższego kodu:
@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 {}
Ale nie jest wywoływana, zamiast metody onRequestPermissionsResult tego działania jest wywoływana.
Zdefiniowałem tę samą metodę onRequestPermissionsResult również w aktywności nadrzędnej fragmentu i jest ona wywoływana.
Nie mogę usunąć metody onRequestPermissionsResult działania, ale chcę wywołać metodę onRequestPermissionsResult fragmentu, gdy żądam pozwolenia od fragmentu. W jaki sposób mogę to zrobić? Czy robię coś źle, pomóż mi, jeśli ktoś ma tutaj pomysł.
źródło
Odpowiedzi:
Zredagowana odpowiedź obejmująca szersze zagadnienia
Myślę, że mylisz metodę fragmentacji i aktywności. Miałem podobny problem z moim projektem w zeszłym miesiącu. Sprawdź, czy masz wreszcie:
super.onRequestPermissionsResult
z aktywnościonRequestPermissionsResult
.Zobacz, czy to pomaga.
źródło
super.onrequestpermissionresult
onrequestpermissionresult działania do wywołania fragmentu onrequestpermissionresult, gdy poproszę o pozwolenie na użycierequestpermissions
. Teraz działa dobrze, dziękuję bardzo .. :)Poprosiłem o pozwolenie na lokalizację z fragmentu i we fragmencie musiałem to zmienić:
do tego:
następnie we fragmencie wywołano onRequestPermissionsResult.
źródło
Jest to częsty błąd, który ludzie popełniają podczas kodowania ptasie mleczko.
Kiedy jesteś w AppCompatActivity, powinieneś użyć ActivityCompat.requestPermissions; W android.support.v4.app.Fragment powinieneś użyć po prostu requestPermissions (jest to metoda instancji android.support.v4.app.Fragment) Jeśli wywołasz ActivityCompat.requestPermissions we fragmencie, wywołanie zwrotne onRequestPermissionsResult jest aktywność, a nie fragment.
Jeśli wywołujesz ten kod z fragmentu, ma on własną metodę requestPermissions.
Tak więc podstawowa koncepcja brzmi: jeśli bierzesz udział w działaniu, zadzwoń
a jeśli we fragmencie, po prostu zadzwoń
W celach informacyjnych otrzymałem odpowiedź z tego linku https://www.coderzheaven.com/2016/10/12/onrequestpermissionsresult-not-called-on-fragments/
źródło
Metoda
requestPermissions
na fragmentach wymaga interfejsu API na poziomie 23 lub wyższym.Jeśli Twoja aplikacja jest przeznaczona dla niższej wersji, możesz użyć
Najpierw musisz dodać zależność support-v13:
źródło
Zmień to :
do tego :
źródło
zmienić uprawnienia
źródło
Ta zaakceptowana odpowiedź nie działa dla mnie, więc znalazłem własne rozwiązanie, wyjaśnione poniżej:
1. Najpierw stworzyłem metodę, we fragmencie:
2. a następnie nazwał to na podstawie jego podstawowej działalności:
I to działa ...
źródło
Sprawdź, czy zarówno
PERMISSION_REQUEST_CODE
w, jakonRequestPermissionsResult
i wewnątrz plikuFragment
zawiera tę samą wartość.źródło
W przypadku tragetu SDK 28 działałoby sprawdzenie SDK (> 23) i requestpermissions from fragment. Działanie ActivityCompat.requestPermissions nie powiedzie się (jeśli ustawisz kod żądania poniżej 65536, pojawi się okno dialogowe uprawnień i jeśli użytkownik zezwoli na zezwolenie, uprawnienia są zapewnione, ale nie nastąpi wywołanie zwrotne. Jeśli jednak ustawisz wartość powyżej 65536, funkcja ActivityCompat.requestPermissions nie powiodło się natychmiast. Nie znam powodu tej logiki. może to być błąd lub celowo).
Kod roboczy:
źródło
Jeśli pracujesz z Kotlinem, powinieneś dokładnie określić, że wywołujesz metodę fragmentu, a nie aktywność
Uprawnienia systemu Android M: onRequestPermissionsResult () nie jest wywoływany
Zażądaj uprawnień wykonawczych z wersji 4.Fragment i czy wywołanie zwrotne ma przejść do fragmentu?
źródło
Miałem ten sam problem. Twój fragment może zostać zainicjowany z układu aktywności. Tak:
main_activty.xml
Ten problem został rozwiązany, gdy
FragmentTransaction
zamiast tego użyłemźródło
w API poniżej 23 możesz stworzyć interfejs w działaniu, a następnie zaimplementować go we fragmencie potomnym, a gdy otrzymasz prośbę o pozwolenie, aktywność przekaże go do zaimplementowanego interfejsu we fragmencie. To takie proste :)
źródło
możesz wywołać metodę Fragment poniżej
źródło
Ten problem był w rzeczywistości spowodowany przez NestedFragments. Zasadniczo większość fragmentów rozszerzyliśmy HostedFragment, który z kolei rozszerza CompatFragment. Posiadanie tych zagnieżdżonych fragmentów spowodowało problemy, które ostatecznie zostały rozwiązane przez innego programistę w projekcie.
Robił trochę rzeczy na niskim poziomie, takich jak przełączanie bitów, aby to działało, więc nie jestem zbyt pewien ostatecznego rozwiązania
źródło