Элементы RelativeLayout неправильно перекрываются - PullRequest
0 голосов
/ 11 марта 2012

Я пытаюсь создать часть представления Android программным способом, но, к сожалению, у меня возникают некоторые проблемы с RelativeLayout.это делает мой Elements оверлей на каждом другом

Это мой код:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.insertnew_layout);
    LinearLayout ll =  (LinearLayout) findViewById(R.id.container); 

    ll.setOrientation(LinearLayout.VERTICAL);
    TableLayout tl = new TableLayout(this);
    tl.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));


        // fill content
        for (int i = 0; i < 3; i++) {   

        TableRow tr = new TableRow(this);
        tr.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));

        RelativeLayout rl = new RelativeLayout(this);
        rl.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));

        TextView score = new TextView(this);
        score.setText(""+i);
        RelativeLayout.LayoutParams lpScore = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.FILL_PARENT);
        lpScore.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
        score.setLayoutParams(lpScore);

        TextView description = new TextView(this);
        description.setText("this is my description");
        RelativeLayout.LayoutParams lpDescription = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.FILL_PARENT);
        lpDescription.addRule(RelativeLayout.RIGHT_OF, score.getId());

        description.setLayoutParams(lpDescription);

        CheckBox checkbox = new CheckBox(this);
        RelativeLayout.LayoutParams lpCheckbox = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.FILL_PARENT);
        lpCheckbox.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
        checkbox.setLayoutParams(lpCheckbox);

        rl.addView(score);
        rl.addView(description);
        rl.addView(checkbox);
        tl.addView(rl);

    }

    ll.addView(tl);

Вот как это выглядит:

output in javacode

Как видите, «описание» находится над «счетом».

Вот тот же код в xml:

<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@+id/tableLayoutTextEntry" >

<TableRow
    android:id="@+id/tableRowTextEntry"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" >

    <RelativeLayout
        android:id="@+id/relativeLayout1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" >

        <TextView
            android:id="@+id/score"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentLeft="true"
            android:text="score" />

        <TextView
            android:id="@+id/description"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_toRightOf="@+id/score"
            android:text="description" />

        <CheckBox
            android:id="@+id/checkBox"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:text="select" />

    </RelativeLayout>

</TableRow>

</TableLayout>

А вот как это выглядитв xml:

output in xml

Как видно, в xml команда toRightOf работает, как и ожидалось - описание находится справа от оценки

Какэто возможно?Разве линия

lpDescription.addRule(RelativeLayout.RIGHT_OF, score.getId());

должна делать то же самое?

1 Ответ

1 голос
/ 11 марта 2012

В тот момент, когда вы вызываете его, score.getId() вернет -1 (недействительно), поскольку он еще не был добавлен на экран с обработанным макетом целиком.Вам нужно будет установить идентификатор вручную с помощью setId() перед вызовом getId(), и все должно работать нормально.

...