同一 ImageView 實例 seprator 呼叫兩次 addView(seprator),第二次拋出 IllegalStateException: The specified child already has a parent。
ViewGroup.addView() 內部會檢查 child.getParent() != null,若已有父容器則拋出異常。一個 View 實例同一時間只能掛載在一個父容器中。
addView(new ImageView(context) {{ setImageResource(R.drawable.seprator_03); ... }});((ViewGroup)seprator.getParent()).removeView(seprator); addView(seprator);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.");
}