无法以编程方式重现布局

时间:2012-10-05 14:31:53

标签: android android-layout

我正在开发Android 3.0平板电脑应用程序。我正在尝试重现这个布局:

    <LinearLayout
        android:weightSum="1"
        android:layout_width="fill_parent"
        android:layout_height="60dip"
        android:orientation="horizontal">


        <TextView
            android:id="@+id/textView1"
            android:layout_weight=".1"
            android:layout_width="0dip"
            android:layout_height="fill_parent"
            android:gravity="center"
            android:text="1" />


        <TextView
            android:id="@+id/textView2"
            android:layout_weight=".6"
            android:layout_width="0dip"
            android:layout_height="fill_parent"
            android:gravity="center"
            android:text="Defecto 11" />

        <LinearLayout
            android:gravity="center"
            android:layout_weight=".05"
            android:layout_width="0dip"
            android:layout_height="fill_parent" >

        <CheckBox
            android:id="@+id/checkBox1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center" />
        </LinearLayout>

        <LinearLayout
            android:gravity="center"
            android:layout_weight=".05"
            android:layout_width="0dip"
            android:layout_height="fill_parent" >

        <CheckBox
            android:id="@+id/checkBox2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center" />
        </LinearLayout>


        <LinearLayout
            android:gravity="center"
            android:layout_weight=".05"
            android:layout_width="0dip"
            android:layout_height="fill_parent" >

        <CheckBox
            android:id="@+id/checkBox3"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center" />
        </LinearLayout>


        <LinearLayout
            android:gravity="center"
            android:layout_weight=".05"
            android:layout_width="0dip"
            android:layout_height="fill_parent" >

        <CheckBox
            android:id="@+id/checkBox4"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center" />

        </LinearLayout>


        <Button
            android:id="@+id/button1"
            android:layout_width="0dip"
            android:layout_height="wrap_content"
            android:layout_weight=".1"
            android:text="Button" />

    </LinearLayout>

编程:

    LinearLayout layout = new LinearLayout(context);
    LayoutParams parentParams = 
            new LayoutParams(LayoutParams.FILL_PARENT, 60);
    //parentParams.weight = 1;
    layout.setOrientation(LinearLayout.HORIZONTAL);
    layout.setLayoutParams(parentParams);

    // Parámetros para todos los EditText dentro de la tabla.
    LayoutParams params = new LayoutParams(0, LayoutParams.FILL_PARENT);

    // La primera columna es el número del defecto
    TextView textView = new TextView(context);
    params.weight = .1f;
    textView.setLayoutParams(params);
    textView.setGravity(Gravity.CENTER);
    textView.setText(Integer.toString(position));
    layout.addView(textView);

    // La segunda columna es la descripción del defecto.
    params.weight = .6f;
    textView = new TextView(context);
    textView.setLayoutParams(params);
    textView.setGravity(Gravity.CENTER);
    textView.setText(eDefect.getDescription());
    layout.addView(textView);

    LinearLayout chkLayout = new LinearLayout(context);
    LayoutParams chkParams = 
            new LayoutParams(0, LayoutParams.FILL_PARENT);
    chkParams.weight = .05f;
    chkParams.gravity = Gravity.CENTER;
    chkLayout.setLayoutParams(chkParams);

    params = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
    params.gravity = Gravity.CENTER;
    String eDefectPos = Integer.toString(position);

    // Columna CRS
    String tag = eDefectPos + "_CRS";
    CheckBox chkBox = new CheckBox(context);
    chkBox.setLayoutParams(params);
    chkBox.setTag(tag);
    chkBox.setOnClickListener(checkListener);
    chkLayout.addView(chkBox);
    layout.addView(chkLayout);

    chkLayout = new LinearLayout(context);
    chkLayout.setLayoutParams(chkParams);

    // Columna CRF
    tag = eDefectPos + "_CRF";
    chkBox = new CheckBox(context);
    chkBox.setLayoutParams(params);
    chkBox.setTag(tag);
    chkBox.setOnClickListener(checkListener);
    chkLayout.addView(chkBox);
    layout.addView(chkLayout);

    chkLayout = new LinearLayout(context);
    chkLayout.setLayoutParams(chkParams);

    // Columna MA
    tag = eDefectPos + "_MA";
    chkBox = new CheckBox(context);
    chkBox.setLayoutParams(params);
    chkBox.setTag(tag);
    chkBox.setOnClickListener(checkListener);
    chkLayout.addView(chkBox);
    layout.addView(chkLayout);

    chkLayout = new LinearLayout(context);
    chkLayout.setLayoutParams(chkParams);

    // Columna MI
    tag = eDefectPos + "_MI";
    chkBox = new CheckBox(context);
    chkBox.setLayoutParams(params);
    chkBox.setTag(tag);
    chkBox.setOnClickListener(checkListener);
    chkLayout.addView(chkBox);
    layout.addView(chkLayout);

    // Boton tomar fotos
    params = new LayoutParams(0, LayoutParams.WRAP_CONTENT);
    params.weight = 0.1f;
    tag = eDefectPos;
    Button btnTakePhoto = new Button(mActivity);
    btnTakePhoto.setLayoutParams(params);
    btnTakePhoto.setTag(tag);
    btnTakePhoto.setText(getString(R.string.btn_take_photo));
    btnTakePhoto.setOnClickListener(takePhotoListener);
    layout.addView(btnTakePhoto);

    mLayout.addView(layout, mCurrentDefectTableIndex);

但他们不喜欢平等。

这与XML:

enter image description here

以编程方式:

enter image description here

一切都向右移动。

有任何线索吗?

1 个答案:

答案 0 :(得分:4)

您不希望对不同视图重复使用LayoutParams的引用。如果要创建一个“base”params对象以供重用,则必须使用LayoutParams构造函数创建新的引用,该构造函数采用LayoutParams。像这样:

LayoutParams baseParams = new LayoutParams(0, LayoutParams.FILL_PARENT);

// La primera columna es el número del defecto
TextView textView = new TextView(context);
LayoutParams params1 = new LayoutParams(baseParams);
params1.weight = .1f;
textView.setLayoutParams(params1);
textView.setGravity(Gravity.CENTER);
textView.setText(Integer.toString(position));
layout.addView(textView);

// La segunda columna es la descripción del defecto.
LayoutParams params2 = new LayoutParams(baseParams);
params2.weight = .6f;
textView = new TextView(context);
textView.setLayoutParams(params2);
textView.setGravity(Gravity.CENTER);
textView.setText(eDefect.getDescription());
layout.addView(textView);