在android開發過程當中,有時會在不一樣狀況下遇到同種問題:java
[java] view plaincopyandroid
java.lang.IllegalStateException The specified child already has a parent. You must call removeView() on the child's parent first. app
也就是非法狀態異常,它說這個特定的child已經有一個parent了,你必須在這個parent中首先調用removeView()方法,才能繼續你的內容。這裏很明顯這個child是一個View,一個子(child)View必須依賴於父(parent)View,若是你要使用這個child,則必須經過parent,而你若是就是硬想使用這個child,那麼就得讓這個child與parent脫離父子關係(即removeView())……算了仍是舉個簡單的例子來講明一下,省的我說的亂七八糟,你聽的也暈。佈局
新建一個項目,佈局文件中僅包含一個TextView和一個ImageView,佈局方式是線性佈局(具體能夠參考後面的源代碼),運行的結果就是顯示一個文本和一張圖片,ui
在Activity的onCreate()方法中,咱們一般使用如下這種方式來使用佈局文件main.xml。spa
[java] view plaincopy.net
setContentView(R.layout.main); xml
這裏爲了解釋今天要講解的這個異常,換一種佈局文件的使用方式,即把上面的那一行代碼註釋掉,換成如下代碼:對象
//獲取Infalter對象blog
[java] view plaincopy
LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
LinearLayout parent = (LinearLayout) inflater.inflate(R.layout.main, null);
ImageView child = (ImageView)parent.findViewById(R.id.child);
setContentView(parent);
LayoutInflater爲佈局填充類,不明白的能夠本身查,或者有機會我將在博客中介紹一下,而後是將main.xml文件inflate爲LinearLayout文件,再獲得child,即ImageView。而後就是經過調用setContentView(parent)將這個佈局main.xml顯示出來,這時獲得的效果和僅使用setContentView(R.layout.main)這句代碼獲得的效果同樣。
下面的操做將會出現異常了,你們注意:
[java] view plaincopy
setContentView(child);
也就是將上文setContentView(parent),中的parent換成child。異常請看以下截圖:
而這時在異常中它提示要再parent中調用removeView()。這裏咱們就遵從指揮,在setContentView(child),以前添上一句parent.removeView(child),這時就不會再調用setContentView(child)就不會異常了,固然當前顯示的將只是一幅圖片了,而這時若是你調用setContentView(parent)的話將只顯示文本內容,由於咱們已經將child remove掉了嘛。
代碼以下: