關於報錯The specified child already has a parent的解決辦法


報錯信息為: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。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM