创建已附加视图的副本

时间:2014-07-25 04:42:08

标签: android android-view

我目前正在努力扩充我最终会添加到垂直LinearLayout容器的布局,作为更大的动态表单创建模块的一部分。

layout_checkbox.xml如下:

<TextView
    android:id="@+id/label"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:gravity="left"
    android:text="sample text" />

<LinearLayout
    android:id="@+id/checkboxGroup"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical" >

    <CheckBox
        android:id="@+id/checkbox"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="sample" />
</LinearLayout>

现在我想做的就是抓住Checkbox(@+id/checkbox)并创建它的副本,所有这些都在LinearLayout @+id/checkboxGroup下。

layout = (LinearLayout) inflater.inflate(R.layout.layout_checkbox, container, false);
LinearLayout checkboxGroup = (LinearLayout) layout.findViewById(R.id.checkboxGroup);
CheckBox checkbox = (CheckBox) checkboxGroup.findViewById(R.id.checkbox);
// code that supposedly clones/duplicates checkbox.

我知道我可以轻松地从另一个xml定义中扩充Checkbox以创建它的多个实例,然后将它们添加到该组中。我尝试这样做的原因是因为我正在创建某种类型的库,并且我试图强制执行某种约定以使其更易于使用。

编辑:

这很有效,但很容易闻到性能:

layout = (LinearLayout) inflater.inflate(R.layout.layout_checkbox, container, false);
LinearLayout originalCheckboxGroup = (LinearLayout) layout.findViewById(R.id.checkboxGroup);
for (String entryItem : entry.fieldEntries) {
    LinearLayout tempCheckboxLayout = (LinearLayout) inflater.inflate(R.layout.layout_checkbox, container, false);
    LinearLayout checkboxGroup = (LinearLayout) tempCheckboxLayout.findViewById(R.id.checkboxGroup);
    CheckBox checkbox = (CheckBox) checkboxGroup.findViewById(R.id.checkbox);
    checkbox.setText(entryItem);
    checkboxGroup.removeView(checkbox);
    originalCheckboxGroup.addView(checkbox);
}

2 个答案:

答案 0 :(得分:1)

what I want to do if possible is to get hold of the Checkbox (@+id/checkbox) and create copies of it

不,您不能复制/克隆视图,因为您将始终并且将对视图具有相同的引用,并且当一个更改全部将更改时,唯一的方法是每次如果您想要扩展视图使用相同的视图。

修改

无法克隆/复制复选框,但每次要使用复选框时都可以使视图(Linearlayout)膨胀。并使用膨胀的复选框。每次你打算使用/克隆一个复选框时都这样做。

答案 1 :(得分:1)

可能会为复选框

的文本添加一个列表
  private LinearLayout checkboxGroup;

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);

    setContentView(R.layout.test);

    checkboxGroup = (LinearLayout) findViewById(R.id.checkboxGroup);
    CheckBox checkbox = (CheckBox) checkboxGroup.findViewById(R.id.checkbox);

    List<String> list = null;  //set it 
    addCheckBox(checkbox, list);

}

private void addCheckBox(CheckBox checkbox, List<String> checkBoxTextList) {

    for (int index = 0; index < checkBoxTextList.size(); index++) {
        CheckBox checkboxClone = checkbox;
        checkboxClone.setText(checkBoxTextList.get(index));
        checkboxClone.setOnCheckedChangeListener(new OnCheckedChangeListener() {

            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                // TODO Auto-generated method stub

            }
        });

        checkboxGroup.addView(checkboxClone);
    }

}