VansFannel
VansFannel

Reputation: 45921

Can't reproduce Layout programmatically

I'm developing an Android 3.0 tablet application. I'm trying to reproduce this Layout:

    <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>

Programmatically:

    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);

But they don't like equal.

This with XML:

enter image description here

And this programmatically:

enter image description here

Everything has moved to the right.

Any clue?

Upvotes: 1

Views: 901

Answers (1)

Vyrx
Vyrx

Reputation: 763

You don't want to re-use a reference to a LayoutParams for different views. If you want to create a "base" params object for re-use, you'll have to make new references using the LayoutParams constructor that takes a LayoutParams. Like so:

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);

Upvotes: 4

Related Questions