1

Ma structure de l'application est la suivanteFacebook Connexion de Nested Fragment ne fonctionne pas - indice de fragment de résultat de l'activité hors de portée

MainActivity (A ViewPager qui contient 2 fragments - Fragment 1 et le fragment 2)

| 
|--Fragment 1 
|   (ViewPager with several fragments which is an  
|   app tutorial/intro) 
| 
|--Fragment 2 
      (Single Fragment where I have my custom facebook login button) 

Au début, mon onActivityResult pour le fragment imbriqué n'était pas appelé. Mais j'ai trouvé une solution à ce en utilisant le code suivant

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    Log.d(TAG, "onActivityResult"); 
    List<Fragment> frags = getSupportFragmentManager().getFragments(); 
    if (frags != null) { 
     for (Fragment f : frags) { 
      if (f != null) 
       handleResult(f, requestCode, resultCode, data); 
     } 
    } 
} 

private void handleResult(Fragment frag, int requestCode, int resultCode, Intent data) { 
    if (frag instanceof LoginFragment) { // custom interface with no signitures 
     frag.onActivityResult(requestCode, resultCode, data); 
    } 
    List<Fragment> frags = frag.getChildFragmentManager().getFragments(); 
    if (frags != null) { 
     for (Fragment f : frags) { 
      if (f != null) 
       handleResult(f, requestCode, resultCode, data); 
     } 
    } 
} 

Maintenant, mon onActivityResult dans mon LoginFragment ne s'appelle, mais je ne connecte pas. Ceci est mon onActivityResult pour le LoginFragment

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    Log.d(TAG, "LoginFragment onActivityResult"); 
    callbackManager.onActivityResult(requestCode, resultCode, data); 
} 

J'ai aussi enregistré un rappel à l'aide

LoginManager.getInstance().registerCallback but my OnSuccess callback is not hit. 

Au lieu de cela je reçois un journal indiquant ce qui suit

W/FragmentActivity﹕ Activity result fragment index out of range: 0x2face 
D/MainActivity﹕ onActivityResult 
D/LoginFragment﹕ LoginFragment onActivityResult 

Comment puis-je vous connecter se passe avec succès et les callbacks fonctionnent?

EDIT: Lors du débogage de ce problème, j'ai conservé un point d'arrêt dans le rappel onActivityResult de la classe FragmentActivity.

if (mFragments.mActive == null || index < 0 || index >= mFragments.mActive.size()) { 
      Log.w(TAG, "Activity result fragment index out of range: 0x" 
        + Integer.toHexString(requestCode)); 
      return; 
     } 

mFragments.mActive == null est faux.

index < 0 est faux

index> = mFragments.mActive.size() est vrai

Répondre

1

Vous pouvez essayer cela pour obtenir appelé onActivityResult lorsque l'activité reçoit:

protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    for (Fragment fragment : getActiveFragments()) { 
     fragment.onActivityResult(requestCode, resultCode, data); 
    } 
} 

Merci .. !!

+0

Cela ne fonctionne pas. Comme je l'ai mentionné, le onActivityResult dans mon fragment imbriqué est appelé. Ce n'est pas le problème. Le problème est que mes rappels de loginManager ne sont pas appelés. – Rohan

+0

@Rohan: Pouvez-vous le déboguer ?? – AndiGeeky

+0

Veuillez vérifier la modification. – Rohan

1

J'ai compris cela.

je tente de vous connecter de mon fragment imbriqué en utilisant

LoginManager.getInstance().logInWithReadPermissions(this,Arrays.asList 
("public_profile", "user_friends")); 

Au lieu de cela, ce que je devais faire était passer l'activité au lieu du fragment à la méthode logInWithReadPermissions.

Par conséquent, la bonne façon de se connecter dans ce cas est

 LoginManager.getInstance().logInWithReadPermissions(getActivity(),   
Arrays.asList("public_profile", "user_friends"));