報錯信息為:java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
首先,如果你看到這篇文章,說明你已經搜了很多篇了(首頁可能字數都不夠,但是又不甘心收獲不能普度眾生……),所以我想聲明一下,你一定不要抱着直接找到源碼解決問題的想法,要找方法,發現問題解決問題的方法!
好了,正如報錯信息提示的,說明你現在要操作的這個View已經有了一個父View,所以你要找是不是那個地方,比如創建這個View時,調用了addView的方法等等,使它有了一個不知名的父類(只是你不知道而已)
這種問題普遍出現在動態添加View時,會出現。比如,有些項目把某一個控件如LinearLayout等,弄出來當作全局變量了,以便在其他地方直接調用addView進行動態添加,注意如果你在聲明LinearLayout 時,試着緊跟着它動態添加一個view,沒問題——那說明全局調用也絕對能用!所以,問題一定出在你創建自己定義的View時調用了addView等等別的方法,使得其有了父類,抑或是其本來就有父類,你不注意,所以自然要報錯。
比如一下就是從網上直接拷來的自定義View的模板
public class CustomView extends RelativeLayout{ View mView=null; public Weather(Context context) { super(context); LayoutInflater mInflater = LayoutInflater.from(context); mView = mInflater.inflate(R.layout.weather, null); addView(mView); }
你要是使用這個自定義控件肯定不能通過addView添加到其他的布局中去,會報如題的錯誤,因為它已經有父類了(代碼中addView(myView);使它有了父類,雖然沒人知道其父類是誰~),所以必須要注釋掉addView(myView);這個CustomView才是一個獨立的View。
