今天把android系統更新到4.0后運行以前開發的程序,出現java.lang.IllegalArgumentException: The observer is null.異常錯誤,
在網上查找出錯原因和解決方案,找到兩篇解釋的比較清楚的文章,具體內容如下:
一,原因:
是因為4.0系統android.widget.AbsListView.onDetachedFromWindow第一次調用的時候會把observer設置為null,onDetachedFromWindow方法的作用是當view離開窗口時調用,而我在每次view離開窗口並沒有銷毀,因為后面要用到,所以當第二次重用view的時候在remove view時就會再次的調用onDetachedFromWindow,所以就會出現這樣的錯誤,具體可以查看4.0和2.3的源碼onDetachedFromWindow方法源碼。
二,解決方法:
之前容器container每次都是removeAllViews()再addView,4.0以后這樣做已經不行了,那么現在我們不要每次都removeAllViews,而是每次檢測容器container中的view,如果view存在那么就設置view為可見,如果不存在那么就addview。
具體代碼:
boolean flag = false; //判斷View是否存在 View view = activityManager.startActivity(id, intent).getDecorView(); for (int i = 0; i < viewList.size(); i++) { //遍歷viewList設置顯示或隱藏,viewList 是一個List<View> if (null != viewList.get(i) && !viewList.get(i).equals(view)) { viewList.get(i).setVisibility(View.GONE); } else if (null != viewList.get(i) && viewList.get(i).equals(view)) { viewList.get(i).setVisibility(View.VISIBLE); flag = true; } } if (!flag) { contentViewLayout.addView(view, contentViewLayoutParams); viewList.add(view); }