了解addView功能

时间:2016-07-11 05:52:27

标签: android button view

当我使用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);

这是我的问题。接收按钮的布局是否复制了本地创建的动态按钮?或者只是引用创建的按钮,保留最初创建的对象?

2 个答案:

答案 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正在使用引用。因此,您的对象不会被克隆,您只需将对象的引用添加到布局中。此外,无论何时收到对象,例如通过以编程方式迭代布局中的所有视图,您还将只接收对该对象的引用。当您例如进行克隆时,可能会进行克隆分配一个新变量(具有新的记忆位置)。