Как вы добавляете динамически представление из XML-файла, я хочу добавить TableRow в RelativeLayout - PullRequest
3 голосов
/ 12 марта 2011

Я пытаюсь добавить строку таблицы динамически в моей деятельности.Строка таблицы находится в относительной раскладке.Это выглядит хорошо, но не знаю, где я иду не так.Ниже мой код

 public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    RelativeLayout RLayout = (RelativeLayout)findViewById(R.id.RelativeLayout);
    TableRow tableRow = (TableRow)findViewById(R.id.TableRow);
    for(int i = 1; i <3; i++)
        RLayout.addView(tableRow); //My code is crashing here
}

и main.xml следующим образом

  <?xml version="1.0" encoding="utf-8"?>
  <RelativeLayout
  android:id="@+id/RelativeLayout"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  xmlns:android="http://schemas.android.com/apk/res/android"
  >
  <TableRow
  android:id="@+id/TableRow"
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  android:orientation="horizontal"
  android:layout_alignParentTop="true"
  android:layout_alignParentLeft="true"
  >
  <TextView
  android:id="@+id/Text"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:text="Text"
  >
  </TextView>
  </TableRow>
  </RelativeLayout>

Пожалуйста, помогите.

1 Ответ

9 голосов
/ 13 марта 2011

Это сбой, потому что TableRow уже находится в макете. Если вы хотите добавить некоторые динамически, вы должны создать их программно, то есть:

// PSEUDOCODE
TableRow newRow = new TableRow(this);
RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(/*....*/);
newRow.setLayoutParams(lp);

relLayout.add(newRow);

На самом деле TableRow следует использовать внутри TableLayout.

Если вы хотите использовать что-то более одного раза, вы можете использовать технику наддува. Вам нужно создать макет xml, который включает единственную часть, которую вы хотите повторить (таким образом, ваш TableRow и его дочерние элементы), а затем:

LayoutInflater inflater = 
              (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);

View inflated = inflater.inflate(R.layout.your_layout, null);

Теперь inflated содержит указанную вами раскладку. Вместо null вы можете разместить макет, к которому прикрепите надутый. Каждый раз, когда вам нужен такой новый элемент, вы должны будете раздувать его одинаково.

(Вы всегда должны сообщать об ошибке, получаемой при сбое)

------ РЕДАКТИРОВАТЬ -----

хорошо, теперь я вижу, это ваш код:

RelativeLayout RLayout = (RelativeLayout)findViewById(R.id.RelativeLayout);
TableRow tableRow = (TableRow)findViewById(R.id.TableRow);

for(int i = 1; i <4; i++) {
    LayoutInflater inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View inflated = inflater.inflate(R.layout.main, tableRow);
}

таким образом вы надуваете весь макет внутри оригинального TableRow.

Вы должны иметь макет row.xml, подобный этому, вместе с main.xml:

<?xml version="1.0" encoding="utf-8"?>
<TableRow xmlns:android="http://schemas.android.com/apk/res/android"
  android:id="@+id/TableRow"
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  android:orientation="horizontal"
  android:layout_alignParentTop="true"
  android:layout_alignParentLeft="true"
  >
  <TextView
  android:id="@+id/Text"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:text="Text"
  />
  </TableRow>

и затем надуйте это так:

RelativeLayout RLayout = (RelativeLayout)findViewById(R.id.RelativeLayout);

for(int i = 1; i <4; i++) {
    LayoutInflater inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    inflater.inflate(R.layout.row, RLayout);
}

посмотрите, работает ли оно.

...