2015-11-16 16 views
3

我有一個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"); 
     } 

    } 
} 
+0

那麼沒有輪轉吧?如果在正確的時間點擊後退按鈕,'getActivity()'可以爲空。 – petey

+0

也許這些碎片沒有被正確地替換,我建議你使用碎片事務來動態地替換碎片,檢查這個鏈接並讓我知道它是否解決了這個問題,http://developer.android.com/training/basics/fragments /fragment-ui.html – Dania

+0

我禁用了後退按鈕,因爲這個片段是我將新用戶信息發佈到我的服務器的地方。因此,基本上,用戶在將數據發佈到服務器後會看到一個加載圖標。後退按鈕與屏幕旋轉一起被禁用,但getActivity()仍然產生NPE。 –

回答

2

根據Android操作系統Fragment生命週期,你不能用在onCreateView的片段相關聯的Activity,因爲與該Fragment關聯的Activity不會在這個階段被創建。

見下圖:

enter image description here

此外,參考此鏈接,http://developer.android.com/guide/components/fragments.html

正如你可以看到活動在onActivityCreated這是onCreateView後創建的,因此你會得到如果您嘗試調用onCreateView中的活動,則返回null。嘗試在onActivityCreatedonStart中調用它可以解決您的問題。

我希望這會有所幫助。

+0

此圖非常有幫助。我一直無法重現錯誤,但我相當肯定我需要重新考慮我在哪裏調用getActivity。此外,'isAdded'有助於避免崩潰,但不會給出正確的行爲。再次感謝! –

+0

是的,isAdded只會防止崩潰,它不會解決問題,因爲活動在被創建之前被調用。嘗試在其創建後調用該活動,並且該工作應該起作用。別客氣。 – Dania

相關問題