Android - изменение макета фрагмента во время выполнения - PullRequest
8 голосов
/ 23 октября 2011

Я бы хотел реализовать дизайн с несколькими фрагментами в своем приложении. Я планирую иметь несколько «экранов» (макетов фрагмента), между которыми я буду переключаться (возможно, добавляя в back-stack) в коде.

Насколько я понимаю, расположение фрагментов на каждом экране устанавливается с использованием объектов Layout (например, FrameLayout), которые действуют в качестве заполнителей для фрагментов (имеющих один и тот же идентификатор). Так как разные экраны имеют разное расположение фрагментов (один может быть FrameLayout, другой LinearLayout и т. Д.), Мне было интересно: как переключаться между макетами фрагментов во время выполнения?

Я понимаю добавление / замену фрагментов (через FragmentManager), но я бы хотел полностью добавить новый макет, который их содержит, в рамках активной деятельности. Вроде как иметь транзакции для "setContentView" ...

Как мне это сделать? Спасибо! Дэнни.

1 Ответ

4 голосов
/ 23 октября 2011

Это, безусловно, возможно, единственное, что вам нужно сделать, это сгенерировать ваши собственные идентификаторы. Идентификаторы могут быть любыми, но они не должны конфликтовать с идентификаторами 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. Прочитайте схему здесь и параграф об изменениях конфигурации .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...