Можно ли установить представление содержимого одной группы представлений в коде? - PullRequest
3 голосов
/ 20 июня 2011

Я хочу знать, возможно ли использовать файл макета xml для динамического определения содержимого представления из кода. Когда мы запускаем действие, мы передаем его макету xml для использования с вызовом метода setContentView(R.layout.main);, но возможно ли использовать файл макета xml для определения динамически создаваемой ViewGroup, такой как LinearLayout?

У меня есть макет XML, который показывает таблицу результатов игры. Каждый счет, который отображается на этом экране, должен динамически добавляться с помощью кода. Я знаю, что в коде можно создать ViewGroup для этой оценки и заполнить ее всеми вещами, необходимыми для создания единой оценки, а затем делать это каждый раз для каждой оценки, а затем добавлять их все в существующий интерфейс пользователя. структура, уже определенная в макете xml. Я хотел бы знать, можно ли использовать для этого другой XML-файл?

Например, XML-файл макета:

<LinearLayout android:id="@+id/top">
  <LinearLayout android:id="@+id/column_heading"/>
</LinearLayout>

В другом XML-файле макета есть что-то вроде:

<LinearLayout android:id="@+id/row">
  <TextView/>
  <TextView/>
  <TextView/>
  <TextView/>
</LinearLayout>

В коде я хотел бы сделать что-то вроде следующего:

LinearLayout top = (LinearLayout)findViewById(R.id.top);
for (int i = 0; i < num_of_rows; i++) {
  LinearLayout row = new LinearLayout(this);
  row.setContentView(R.layout.row);  //where R.layout.row is the second layout above
  // ... dynamically change values as needed
  top.addView(row);
}

Однако .setContentView(...) не является допустимым методом LinearLayout. Есть ли другой способ сделать это? Я знаю, что могу сделать все это с помощью кода, но это довольно грязно, и этот способ может показаться очень аккуратным и рациональным.

Ответы [ 3 ]

2 голосов
/ 20 июня 2011

Вы должны использовать LayoutInflater для этого. Вот краткий пример

LinearLayout top = (LinearLayout)findViewById(R.id.top);
for (int i = 0; i < num_of_rows; i++) {
    LayoutInflater inflater = LayoutInflater.from(this);
    LinearLayout row = (LinearLayout)inflater.inflate(R.layout.row, null);    
    // ... dynamically change values as needed
    top.addView(row);
}
1 голос
/ 20 июня 2011

Вы можете использовать метод LayoutInflater inflate для раздувания произвольного макета из ресурсов.Если вы предоставите этому методу параметр корневого представления, в нем будет содержаться раздутая компоновка.Таким образом, вы можете накачать представление XML в свою строку.

1 голос
/ 20 июня 2011
LayoutInflater vi = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View v = vi.inflate(R.layout.row, null);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...