首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Android addView 重複添加同一 View 導致崩潰:原因與解決方案

     編輯:程式設計綜合問答

錯誤現象

同一 ImageView 實例 seprator 呼叫兩次 addView(seprator),第二次拋出 IllegalStateException: The specified child already has a parent。

根本原因

ViewGroup.addView() 內部會檢查 child.getParent() != null,若已有父容器則拋出異常。一個 View 實例同一時間只能掛載在一個父容器中。

解決方案

  1. 創建多個實例(推薦):
    addView(new ImageView(context) {{ setImageResource(R.drawable.seprator_03); ... }});
  2. 移除後再添加:
    ((ViewGroup)seprator.getParent()).removeView(seprator); addView(seprator);
  3. 使用 ViewStub / LayoutInflater 復用 XML 佈局:
    View divider = LayoutInflater.from(context).inflate(R.layout.divider, parent, false); addView(divider);

代碼示範(方案一)

// 分隔符複用方法
private View createDivider() {
    ImageView iv = new ImageView(getContext());
    iv.setImageResource(R.drawable.seprator_03);
    iv.setLayoutParams(sepratorParams);
    return iv;
}

// 使用
addView(createDivider());
addView(icon2);
addView(createDivider()); // 新實例,不衝突

原始碼片段說明

ViewGroup.addViewInner() 中關鍵邏輯:

if (child.getParent() != null) {
    throw new IllegalStateException("The specified child already has a parent. " +
        "You must call removeView() on the child's parent first.");
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved