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

Sha*_*ikh 6 android android-fragments

我有一个SignupActivity,当用户通过注册过程时,它会经历几个片段.在最后一个片段,我正在打电话

getActivity().setResult(Activity.RESULT_OK) 
Run Code Online (Sandbox Code Playgroud)

因为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");
        }

    }
}
Run Code Online (Sandbox Code Playgroud)

Dan*_*nia 5

根据FragmentAndroid操作系统的生命周期,你无法获取Activity与fragment相关联的onCreateView,因为该阶段不会创建与之关联的ActivityFragment

见下图:

在此输入图像描述

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

正如您所看到的,Activity 是在onActivityCreatedafter 中创建的onCreateView,因此,如果您尝试调用 中的 Activity,您将得到 null onCreateView。尝试调用它 inonActivityCreated或 inonStart应该可以解决您的问题。

我希望这有帮助。