Программное добавление фрагментов в макет ограничения - PullRequest
0 голосов
/ 25 мая 2020

Я пытаюсь добавить два фрагмента в макет ограничения, а затем установить их ограничения, чтобы нижний фрагмент всегда был привязан к нижней части макета приложения, а верхний фрагмент мог заполнить любое оставшееся пространство. Мой код для этого выглядит следующим образом:

        val fragmentTransaction = fragmentManager.beginTransaction()
        fragmentTransaction.add(R.id.app_con_layout,fragmentA)
        fragmentTransaction.add(R.id.app_con_layout,fragmentB)
        fragmentTransaction.commit()

        val mConstraintLayout = findViewById<ConstraintLayout>(R.id.app_con_layout)
        val set = ConstraintSet()

        set.clone(mConstraintLayout)
        set.connect(fragmentA.id, ConstraintSet.TOP, R.id.app_toolbar, ConstraintSet.BOTTOM)
        set.connect(fragmentB.id, ConstraintSet.BOTTOM, mConstraintLayout.id, ConstraintSet.BOTTOM)
        set.applyTo(mConstraintLayout)

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

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

1 Ответ

1 голос
/ 25 мая 2020

Вы используете неправильный идентификатор для set.connect(…). Фрагмент имеет представление, и вам понадобится этот идентификатор представления, если вы хотите передать его в connect(…). Для меня это слишком сложно, потому что тогда вам нужно будет дождаться запуска жизненного цикла фрагмента (fragmentTransaction.commit() асинхронный). Я не знаю, может ли commitNow() помочь вам в этом.

Я мог бы добавить макеты фреймов в макет ограничений в xml

Я бы взял это подход, если бы я был вами. Таким образом, макет останется в XML, и только добавление фрагментов в их заполнитель (и обработка их жизненных циклов и распространения событий) будет выполняться программно.

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