2015-02-06 65 views
3

我的嵌套片段如下所示。如何在Android中使用嵌套片段登录Facebook

  • MainActivity
    • FragmentA
      • FragmentA1
        • FragmentA3
      • FragmentA2
    • FragmentB
      • FragmentB1

我想从FragmentA3登录博客。但不能。

在FragmentA3中,我的app在调用onActivityResult后停在onResume中。

我该怎么办?

FragmentA3

public class FragmentA3 extends Fragment { 

    public static final String TAG = FragmentA3.class.getCanonicalName(); 
    private UiLifecycleHelper mFbSdkUiHelper; 
    private OnLoggedListener mCallback; 
    private final List<String> permissions; 

    public OthersFBLogin() { 
     // Required empty public constructor 
     permissions = Arrays.asList("basic_info", "email"); 
    } 

    public interface OnLoggedListener { 
     //Callback to notify about login success. 
     public void onLoginSuccess(); 
    } 

    private final Session.StatusCallback mSessionCallback = new Session.StatusCallback() { 
     @Override 
     public void call(Session session, SessionState state, Exception exception) { 
     onSessionStateChange(session, state, exception); 
     } 
    }; 

    private void onSessionStateChange(Session session, SessionState state, Exception exception) { 
     Log.d(TAG,"onSessionStateChange"); 
     if (state.isOpened()) { 
      mCallback.onLoginSuccess(); 
     } else if (state.isClosed()) { 
      if (session != null) { 
       session.closeAndClearTokenInformation(); 
      } 
     } 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     Log.d(TAG,"onCreate"); 
     super.onCreate(savedInstanceState); 
     mFbSdkUiHelper = new UiLifecycleHelper(getActivity(), mSessionCallback); 
     mFbSdkUiHelper.onCreate(savedInstanceState); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     Log.d(TAG,"onCreateView"); 
     View rootView = inflater.inflate(R.layout.others_fblogin, container, false); 
     LoginButton loginButton = (LoginButton) rootView.findViewById(R.id.login_button); 
     loginButton.setFragment(this); 
     loginButton.setReadPermissions(permissions); 

     return rootView; 
    } 

    @Override 
    public void onAttach(Activity activity) { 
     Log.d(TAG,"onAttach"); 
     super.onAttach(activity); 
     try { 
      mCallback = (OnLoggedListener) activity; 
     } catch (ClassCastException e) { 
      throw new ClassCastException(activity.toString() 
        + " must implement OnLoggedListener in order to use this fragment"); 
     } 
    } 

    @Override 
    public void onResume() { 
     Log.d(TAG,"onResume"); 
     super.onResume(); 
     Session session = Session.getActiveSession(); 
     if (session != null && (session.isOpened() || session.isClosed())) { 
      onSessionStateChange(session, session.getState(), null); 
     } 
     mFbSdkUiHelper.onResume(); 
    } 

    @Override 
    public void onDestroyView() { 
     super.onDestroyView(); 
    } 

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

    @Override 
    public void onPause() { 
     Log.d(TAG,"onPause"); 
     super.onPause(); 
     mFbSdkUiHelper.onPause(); 
    } 

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
     mFbSdkUiHelper.onDestroy(); 
    } 

    @Override 
    public void onSaveInstanceState(Bundle outState) { 
     Log.d(TAG,"onSaveInstanceState"); 
     super.onSaveInstanceState(outState); 
     mFbSdkUiHelper.onSaveInstanceState(outState); 
    } 
} 

logcat的

D/com.example.sample.FragmentA3 ﹕ onAttach 
D/com.example.sample.FragmentA3 ﹕ onCreate 
D/com.example.sample.FragmentA3 ﹕ onCreateView 
D/com.example.sample.FragmentA3 ﹕ onResume 
D/dalvikvm      ﹕ GC_FOR_ALLOC freed 764K, 10% free 7977K/8816K, paused 3ms, total 6ms 
W/GooglePlayServicesUtil   ﹕ Google Play services is missing. 
D/com.example.sample.FragmentA3 ﹕ onPause 
D/com.example.sample.FragmentA3 ﹕ onSessionStateChange 
W/EGL_emulation     ﹕ eglSurfaceAttrib not implemented 
I/Choreographer     ﹕ Skipped 174 frames! The application may be doing too much work on its main thread. 
D/com.example.sample.MainActivity﹕ onActivityResult 
D/com.example.sample.FragmentA ﹕ onActivityResult 
D/com.example.sample.FragmentA3 ﹕ onActivityResult 
D/com.example.sample.FragmentA3 ﹕ onResume 

回答

0

请尝试此解决方案:

public class FragmentA3 extends Fragment { 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     Fragment fragmentA1 = this.getParentFragment(); 
     Fragment fragmentA = fragmentA1.getParentFragment(); 

     loginButton.setFragment(fragmentA); 
    } 

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

public class FragmentA1 extends Fragment { 

    @Override 
    public void onActivityResult(int requestCode, int resultCode, Intent data) { 
     if (mFragmentA3 !=null) 
     mFragmentA3.onActivityResult(requestCode, resultCode, data); 

     super.onActivityResult(requestCode, resultCode, data); 
    } 
} 

public class FragmentA extends Fragment { 

    @Override 
    public void onActivityResult(int requestCode, int resultCode, Intent data) { 
     if (mFragmentA1 !=null) 
     mFragmentA1.onActivityResult(requestCode, resultCode, data); 

     super.onActivityResult(requestCode, resultCode, data); 
    } 
} 
0

第1步:添加下面的代码的片段。

public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState){ 
context = getContext(); 
FacebookSdk.sdkInitialize(context); 
View view = inflater.inflate(R.layout.fragment_facebook_sign_in, container, false); 
} 

第2步:处理Facebook的回调。

private FacebookCallback<LoginResult> callback = new FacebookCallback<LoginResult>() { 
    @Override 
    public void onSuccess(LoginResult loginResult) { 
     AccessToken accessToken = loginResult.getAccessToken(); 
     GraphRequest request = GraphRequest.newMeRequest(
       loginResult.getAccessToken(), 
       new GraphRequest.GraphJSONObjectCallback() { 
        @Override 
        public void onCompleted(JSONObject object, GraphResponse response) { 
         try { 
          String email = object.getString("email"); 
          String firstName = object.getString("first_name"); 
          String lastName = object.getString("last_name"); 
          profile_link = object.getString("link"); 
          String profilePicUrl = object.getJSONObject("picture").getJSONObject("data").getString("url"); 
          Utility.logMe("\nFacebook_user_mail:"+email +"\nFacebook_user_Fname:"+firstName+"\nFacebook_user_Lname:"+lastName+"\nFacebook_user_Image:"+profilePicUrl+"\nProfile_link:"+profile_link); 
          if(email != null && email.length()> 0) 
          { 
           LoginManager.getInstance().logOut(); 
           signUpFacebook(firstName, lastName, email, profilePicUrl, profile_link); 
          } 

          else { 
           Toast.makeText(getActivity(), "Email not present to login", Toast.LENGTH_LONG).show(); 
          } 

         } catch (JSONException e) { 
          Toast.makeText(getActivity(), "Email Not Exist for this user on Facebook.", Toast.LENGTH_LONG).show(); 
          progressDialog = new ProgressDialog(getContext()); 

         } 

        } 
       }); 

     Bundle parameters = new Bundle(); 
     parameters.putString("fields", "id,link,name,email,birthday,gender,first_name,last_name,picture.type(large)"); 
     request.setParameters(parameters); 
     request.executeAsync(); 

    } 

步骤3:

@Override 
public void onCreate(Bundle savedInstanceState){ 
    super.onCreate(savedInstanceState); 
    FacebookSdk.sdkInitialize(getActivity().getApplicationContext()); 

    callbackManager = CallbackManager.Factory.create(); 

    accessTokenTracker= new AccessTokenTracker() { 
     @Override 
     protected void onCurrentAccessTokenChanged(AccessToken oldToken, AccessToken newToken) { 

     } 
    }; 

    profileTracker = new ProfileTracker() { 
     @Override 
     protected void onCurrentProfileChanged(Profile oldProfile, Profile newProfile) { 
      //displayMessage(newProfile); 
     } 
    }; 

    accessTokenTracker.startTracking(); 
    profileTracker.startTracking(); 
} 

步骤4:

@Override 
public void onViewCreated(View view, Bundle savedInstanceState) { 
    super.onViewCreated(view, savedInstanceState); 
    LoginButton loginButton = (LoginButton) view.findViewById(R.id.login_button); 
    textView = (TextView) view.findViewById(R.id.textView); 

    loginButton.setReadPermissions("user_friends"); 
    loginButton.setFragment(this); 
    loginButton.registerCallback(callbackManager, callback); 

} 

步骤5:

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    callbackManager.onActivityResult(requestCode, resultCode, data); 

} 

步骤6:

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 

    List<Fragment> allFragments = getSupportFragmentManager().getFragments(); 
    for (Fragment fragmento : allFragments) { 
     if (fragmento instanceof TwitterSignIn) { 
      ((TwitterSignIn) fragmento).onActivityResult(requestCode, resultCode, data); 
     } 
     if (fragmento instanceof GooglePlusSignIn) { 
      ((GooglePlusSignIn) fragmento).onActivityResult(requestCode, resultCode, data); 
     } 
     if (fragmento instanceof FacebookSignIn) { 
      ((FacebookSignIn) fragmento).onActivityResult(requestCode, resultCode, data); 
     } 
    } 
}