Это, безусловно, возможно, единственное, что вам нужно сделать, это сгенерировать ваши собственные идентификаторы. Идентификаторы могут быть любыми, но они не должны конфликтовать с идентификаторами aapt (те, что в R) и не должны быть отрицательными.
Следующий пример демонстрирует это с набором фиксированных идентификаторов:
public class MainActivity extends Activity {
private final int ID_TABLE = 0xA;
private final int ID_ROW1 = 0xB;
private final int ID_ROW2 = 0xC;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
LinearLayout ll = (LinearLayout) findViewById(R.id.root);
TableLayout tl = new TableLayout(this);
tl.setId(ID_TABLE);
TableRow tr1 = new TableRow(this);
tr1.setId(ID_ROW1);
TableRow tr2 = new TableRow(this);
tr2.setId(ID_ROW2);
tl.addView(tr1);
tl.addView(tr2);
ll.addView(tl);
MyFragment frag1 = new MyFragment();
MyFragment frag2 = new MyFragment();
MyFragment frag3 = new MyFragment();
MyFragment frag4 = new MyFragment();
getFragmentManager().beginTransaction()
.add(ID_ROW1, frag1, "cell1_1")
.add(ID_ROW1, frag2, "cell1_2")
.add(ID_ROW2, frag3, "cell2_1")
.add(ID_ROW2, frag4, "cell2_2")
.commit();
getFragmentManager().executePendingTransactions();
}
}
Чтобы переключиться на другой макет, вы можете удалить фрагменты и добавить их в другом месте.
Дайте мне знать, как это происходит.
РЕДАКТИРОВАТЬ: для пояснения, нет необходимости создавать экземпляры Views и ViewGroups один раз, а затем сохранять их в течение всего срока действия. Просто убедитесь, что все фрагменты либо удалены, либо отсоединены, прежде чем удалять их связанный вид. Кроме того, если вы создаете и удаляете представления вне onCreate, вы должны убедиться, что они могут быть восстановлены с помощью onSaveInstanceState и повторяя процесс в onCreate. Прочитайте схему здесь и параграф об изменениях конфигурации .