我有一個SignupActivity會在用戶通過註冊過程時經歷幾個片段。在最後一個片段上,我打電話給是什麼導致片段與Activity分離?
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");
}
}
}
那麼沒有輪轉吧?如果在正確的時間點擊後退按鈕,'getActivity()'可以爲空。 – petey
也許這些碎片沒有被正確地替換,我建議你使用碎片事務來動態地替換碎片,檢查這個鏈接並讓我知道它是否解決了這個問題,http://developer.android.com/training/basics/fragments /fragment-ui.html – Dania
我禁用了後退按鈕,因爲這個片段是我將新用戶信息發佈到我的服務器的地方。因此,基本上,用戶在將數據發佈到服務器後會看到一個加載圖標。後退按鈕與屏幕旋轉一起被禁用,但getActivity()仍然產生NPE。 –