Android 使用UserSettingsFragment登录,获取用户ID并替换片段,然后

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方法中的片段 大

我有一个片段使用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);
        }
    }
}