2012-07-21 65 views
0

我有一个FragmentActivity,并且在片段中我想在两个视图(基本上是2个linearlayout,每次只能看到一个)之间进行动画过渡。Android:在片段内的动画中的NPE

public void showError() { 
    if (getActivity() == null) return; 
    if (mErrorView.getVisibility() == View.VISIBLE) return; 
    if (mListView.getVisibility() == View.VISIBLE) { 
     mListView.startAnimation(AnimationUtils.loadAnimation(getActivity(), android.R.anim.fade_out)); 
    } 
    if (mSpinnerView.getVisibility() == View.VISIBLE) { 
     mSpinnerView.startAnimation(AnimationUtils.loadAnimation(getActivity(), android.R.anim.fade_out)); 
    } 
    mErrorView.startAnimation(AnimationUtils.loadAnimation(getActivity(), android.R.anim.fade_in)); 

    mListView.setVisibility(View.GONE); 
    mErrorView.setVisibility(View.VISIBLE); 
    mSpinnerView.setVisibility(View.GONE); 
} 

它工作正常,但我得到了来自具有NPE的用户在getActivity()上的很多崩溃报告。所以即使我在进入之前检查非空值,我也进入了一个变为null的状态(也许是因为动画是异步的)。

我觉得我没有做动画的权利,有没有更好的方法来做到这一点,并防止所有NPE困扰我的用户?

回答

0

我不确定getActivity如何变为null,但为了避免它,为什么不在空检查之前存储该值。这样你保持对它的引用不能变为null。就像:

public void showError() { 
    Activity activity = getActivity(); 
    if (activity == null) return; 
//Other Code 
    mErrorView.startAnimation(AnimationUtils.loadAnimation(activity, android.R.anim.fade_in)); 
//Rest of code 
} 
+0

我会尽力,但不知何故,我觉得必须有更好的方法。 – erwan 2012-07-22 06:49:14

+0

我不知道它是如何变为空。你是否在另一个线程上运行该代码?另外,你可以发布一个例外回溯? – MJD 2012-07-23 05:04:15