导致片段与活动分离的原因是什么?

时间:2015-11-16 19:01:54

标签: android android-fragments

我有一个SignupActivity,当用户通过注册过程时,它会经历几个片段。在最后一个片段中,我正在呼叫

getActivity().setResult(Activity.RESULT_OK) 

因为SingupActivity意图是为了结果而开始的。有些用户此时正在崩溃,因为getActivity()正在生成NPE。我无法弄清楚造成这种情况的原因。屏幕旋转被禁用,因此我没有理由知道片段与Activity分离。

有关可能导致此问题的任何见解,以及我如何解决这个问题?

public class SignupConfirmationFragment extends Fragment {
    public static final String TAG = SignupConfirmationFragment.class.getSimpleName();
    private User mNewUser;
    private myAppClient mmyAppClient;

    private Animation rotateAnimation;
    private ImageView avatar;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        mNewUser = ((SignUpActivity) getActivity()).getNewUser();
        mmyAppClient = ((SignUpActivity) getActivity()).getmyAppClient();
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        final View v = inflater.inflate(R.layout.fragment_signup_confirmation, null);

        ((TextView) v.findViewById(R.id.username_textView)).setText(((SignUpActivity) getActivity()).getNewUser().getName());
        avatar = (ImageView) v.findViewById(R.id.avatar);

        if (mNewUser.getAvatarImage() != null) {
            avatar.setImageBitmap(mNewUser.getAvatarImage());
        }


        rotateAnimation = AnimationUtils.loadAnimation(getActivity(), R.anim.progress_rotate);
        v.findViewById(R.id.progress_loading).startAnimation(rotateAnimation);

        if (mNewUser.getAvatarImage() != null) {
            startAvatarUpload();
        } else if (mNewUser.getNewsletter()) {
            setNewsletterStatus();
        } else {
            pauseForOneSecond();
        }

        return v;
    }

    private void startAvatarUpload() {
        mmyAppClient.uploadUserAvatar(mNewUser.getAvatarImage(), new FutureCallback<JsonObject>() {
                    @Override
                    public void onCompleted(Exception e, JsonObject result) {
                        if (mNewUser.getNewsletter()) {
                            setNewsletterStatus();
                        } else {
                            updateFragment();
                        }
                    }
                },
                null,
                null);
    }

    private void setNewsletterStatus() {
        mmyAppClient.setNewsletter(mNewUser.getEmail(), mNewUser.getFirstName(), mNewUser.getLastName(), new FutureCallback<String>() {
            @Override
            public void onCompleted(Exception e, String result) {
                //Log.d(TAG, "Result: " + result);
                updateFragment();
            }
        });
    }

    private void pauseForOneSecond() {
        final Handler handler = new Handler();
        handler.postDelayed(new Runnable() {
            @Override
            public void run() {
                updateFragment();
            }
        }, 1000);
    }

    private void updateFragment() {
        rotateAnimation.cancel();
        if (isAdded()) {
            getActivity().setResult(Activity.RESULT_OK);
            AnalyticsManager.logUIEvent("sign up completed");
            getActivity().finish();
        } else {
            AnalyticsManager.logUIEvent("sign up failed");
        }

    }
}

1 个答案:

答案 0 :(得分:3)

根据Android操作系统中的Fragment生命周期,您无法在Activity中获得与该片段相关联的onCreateView,因为ActivityFragment相关联在该阶段不会创建关联关联。

见下图:

enter image description here

另请参阅此链接http://developer.android.com/guide/components/fragments.html

正如您所看到的,onActivityCreated中的活动是在onCreateView之后创建的,因此如果您尝试在onCreateView中调用活动,则会获得null。尝试在onActivityCreatedonStart中调用它来解决您的问题。

我希望这会有所帮助。