Android 使用UserSettingsFragment登录,获取用户ID并替换片段,然后
我有一个片段使用facebook的UserSettingsFragment进行登录。现在,我希望该片段在登录后获得UserID,然后用新片段替换该片段 我正在使用一个newMeRequest获取facebook用户id,它由executeBatchAsync执行。如果会话打开,则在UserSettingsFragment的StatusCallback的call方法中执行NewMereRequest。我正在获取UserID,并希望替换newMeRequest的OnCompleted方法中的片段 大多数情况下,我的应用程序在我想替换片段的时候崩溃了。我认为这取决于请求的异步执行 下面是我的片段类的代码:Android 使用UserSettingsFragment登录,获取用户ID并替换片段,然后,android,android-fragments,facebook-login,Android,Android Fragments,Facebook Login,我有一个片段使用facebook的UserSettingsFragment进行登录。现在,我希望该片段在登录后获得UserID,然后用新片段替换该片段 我正在使用一个newMeRequest获取facebook用户id,它由executeBatchAsync执行。如果会话打开,则在UserSettingsFragment的StatusCallback的call方法中执行NewMereRequest。我正在获取UserID,并希望替换newMeRequest的OnCompleted方法中的片段 大
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentTransaction;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.facebook.Request;
import com.facebook.Response;
import com.facebook.Session;
import com.facebook.SessionState;
import com.facebook.model.GraphUser;
import com.facebook.widget.UserSettingsFragment;
public class LoginFacebookFragment extends Fragment {
private UserSettingsFragment mUsrStFmt;
private DataSet mDataSet;
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_facebook, container, false);
mDataSet = DataSet.getInstance();
mUsrStFmt = (UserSettingsFragment) getActivity().getSupportFragmentManager().findFragmentById(R.id.login_fragment);
mUsrStFmt.setSessionStatusCallback(new Session.StatusCallback() {
@Override
public void call(final Session session, SessionState state, Exception exception) {
Log.d("LoginFacebookFragment", String.format("New session state: %s", state.toString()));
if (state == SessionState.OPENED)
{
mDataSet.setUserID(null);
Request request = Request.newMeRequest(session, new Request.GraphUserCallback() {
@Override
public void onCompleted(GraphUser user, Response response) {
// If the response is successful
if (session == Session.getActiveSession()) {
if (user != null) {
mDataSet.setUserID(user.getId());
Log.d("LoginFacebookFragment", "UserID: " + mDataSet.getUserID());
if (mDataSet.getUserID() != null)
{
int i = mDataSet.getMenuPosition();
if (i == 1 || i == 2)
{
Fragment fragment = new OccurenceReportFragment();
FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction();
ft.replace(R.id.content_frame, fragment);
ft.addToBackStack(null);
ft.commit();
}
}
}
}
}
});
Request.executeBatchAsync(request);
}
}
});
return rootView;
}
@Override
public void onDestroyView() {
UserSettingsFragment f = (UserSettingsFragment) getActivity().getSupportFragmentManager().findFragmentById(R.id.login_fragment);
if (f != null) {
try {
getActivity().getSupportFragmentManager().beginTransaction().remove(f).commit();
} catch (Exception e) {
e.printStackTrace();
}
}
super.onDestroyView();
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
mUsrStFmt.onActivityResult(requestCode, resultCode, data);
super.onActivityResult(requestCode, resultCode, data);
}
}
以下是我的片段布局,其中包含UserSettingsFragment:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<fragment
android:id="@+id/login_fragment"
android:name="com.facebook.widget.UserSettingsFragment"
android:layout_width="fill_parent"
android:layout_height="fill_parent" />
</LinearLayout>
我做错了什么?有什么办法解决这个问题吗?请帮帮我,这是一个重要的项目
谢谢 已经很晚了,我太困了,看不清你的代码!!但是我在你的代码中看到了一些可能导致问题的东西。 您正在xml文件中添加片段,这样做无法替换它。如果您希望能够动态删除或替换片段,那么应该使用java代码添加它 我希望这会有所帮助 我明白了! 我没有使用自己的片段来添加UserSettingsFragment,而是在将自己的SessionStatusCallback设置回它之后直接添加UserSettingsFragment
...
UserSettingsFragment fmt = new UserSettingsFragment();
fmt.setSessionStatusCallback(new MyFBSessionStatusCallback(getActivity()));
FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction();
ft.replace(R.id.content_frame, fmt);
ft.addToBackStack(null);
ft.commit();
...
我的课时StatusCallback课程:
public class MyFBSessionStatusCallback implements Session.StatusCallback {
private DataSet mDataSet;
private FragmentActivity mFragAct;
public MyFBSessionStatusCallback (FragmentActivity fragment) {
this.mFragAct = fragment;
this.mDataSet = DataSet.getInstance();
}
@Override
public void call(final Session session, SessionState state, Exception exception) {
Log.d("LoginFacebookFragment", String.format("New session state: %s", state.toString()));
if (state == SessionState.OPENED)
{
mDataSet.setUserID(null);
Request request = Request.newMeRequest(session, new Request.GraphUserCallback() {
@Override
public void onCompleted(GraphUser user, Response response) {
// If the response is successful
if (session == Session.getActiveSession()) {
if (user != null) {
mDataSet.setUserID(user.getId());
Log.d("LoginFacebookFragment", "UserID: " + mDataSet.getUserID());
...
}
}
}
});
Request.executeBatchAsync(request);
}
}
}
谢谢你的回答。但我需要一点提示。我知道使用replace方法动态添加片段。但如何动态添加UserSettingsFragment,然后在没有自己的类的情况下对成功登录做出反应?!对不起,我是android开发新手。
public class MyFBSessionStatusCallback implements Session.StatusCallback {
private DataSet mDataSet;
private FragmentActivity mFragAct;
public MyFBSessionStatusCallback (FragmentActivity fragment) {
this.mFragAct = fragment;
this.mDataSet = DataSet.getInstance();
}
@Override
public void call(final Session session, SessionState state, Exception exception) {
Log.d("LoginFacebookFragment", String.format("New session state: %s", state.toString()));
if (state == SessionState.OPENED)
{
mDataSet.setUserID(null);
Request request = Request.newMeRequest(session, new Request.GraphUserCallback() {
@Override
public void onCompleted(GraphUser user, Response response) {
// If the response is successful
if (session == Session.getActiveSession()) {
if (user != null) {
mDataSet.setUserID(user.getId());
Log.d("LoginFacebookFragment", "UserID: " + mDataSet.getUserID());
...
}
}
}
});
Request.executeBatchAsync(request);
}
}
}