当我使用Java代码动态地向Android布局添加按钮时,我首先必须声明按钮的本地副本,类似于:
Button btn = new Button(this);
然后有一些典型的代码如下(但随应用程序而变化):
// sets button width and height
RelativeLayout.LayoutParams bparms = new RelativeLayout.LayoutParams(w, h);
// sets button left and top position inside layout
bparms.setMargins(l, t, 0, 0);
然后可以设置其他按钮属性,例如文本,背景等。最后,按钮将添加到父布局,如下所示:
// add the dynamic button to the keypad view
kpad.addView(btn, bparms);
这是我的问题。接收按钮的布局是否复制了本地创建的动态按钮?或者只是引用创建的按钮,保留最初创建的对象?
答案 0 :(得分:1)
查看源代码,addInArray
类有一个ViewGroup
方法,它只需要引用子视图并将其添加到children
数组:
private void addInArray(View child, int index) {
View[] children = mChildren;
final int count = mChildrenCount;
final int size = children.length;
if (index == count) {
if (size == count) {
mChildren = new View[size + ARRAY_CAPACITY_INCREMENT];
System.arraycopy(children, 0, mChildren, 0, size);
children = mChildren;
}
children[mChildrenCount++] = child;
} else if (index < count) {
if (size == count) {
mChildren = new View[size + ARRAY_CAPACITY_INCREMENT];
System.arraycopy(children, 0, mChildren, 0, index);
System.arraycopy(children, index, mChildren, index + 1, count - index);
children = mChildren;
} else {
System.arraycopy(children, index, children, index + 1, count - index);
}
children[index] = child;
mChildrenCount++;
if (mLastTouchDownIndex >= index) {
mLastTouchDownIndex++;
}
} else {
throw new IndexOutOfBoundsException("index=" + index + " count=" + count);
}
}
答案 1 :(得分:1)
通常,java正在使用引用。因此,您的对象不会被克隆,您只需将对象的引用添加到布局中。此外,无论何时收到对象,例如通过以编程方式迭代布局中的所有视图,您还将只接收对该对象的引用。当您例如进行克隆时,可能会进行克隆分配一个新变量(具有新的记忆位置)。