Я пытаюсь перейти на Приложение с одним действием (и готовлюсь использовать новую навигационную библиотеку JetPack).
Я получил гибкий пользовательский интерфейс (типичный фрагмент двойной панели): Действие с макетом, зависящим от размера, и динамическое добавление одного или двух фрагментов (как описано здесь ).Основной фрагмент содержит список элементов, дополнительный фрагмент содержит сведения об элементе.
Я хочу перевести логику, содержащуюся в Деятельности, во фрагмент, и все работает нормально, но по какой-то причине в случаеширокий макет (тот, который позволяет одновременно показывать основной фрагмент и дополнительный фрагмент, например, в планшете) основной фрагмент занимает всю ширину (должно быть 50%) .Вторичный фрагмент работает хорошо (это видно под основным).
![Bad layout](https://i.stack.imgur.com/hEthA.png)
Есть какие-нибудь идеи, как это можно исправить?
Макет упражнения:
<fragment
android:id="@+id/mainFragment"
android:name="jp.rodriguez.kanjisenpai.fragment.StudyListManagePanelFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@+id/appbar"/>
Создание макета StudyListManagePanelFragment:
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? =
inflater.inflate(R.layout.fragment_studylistmanage, container, false)
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
// Make back button work properly in single pane version
fragmentManager!!.beginTransaction().setPrimaryNavigationFragment(this).commit()
if (savedInstanceState == null) {
studyingFragment = StudyListManageFragment()
childFragmentManager
.beginTransaction()
.setPrimaryNavigationFragment(studyingFragment)
.add(R.id.mainFragment, studyingFragment)
.commit()
} else
studyingFragment = childFragmentManager.findFragmentById(R.id.mainFragment) as StudyListManageFragment
}
fun showStudyListDetails(studyList: StudyList) {
if (view!!.findViewById<View>(R.id.fragmentDetails) != null) { // Dual pane
val oldDetailsFragment = termsFragment
val fragmentTransaction = childFragmentManager.beginTransaction()
if (oldDetailsFragment != null)
fragmentTransaction.remove(oldDetailsFragment)
if (studyList.itemCount != 0 || studyList.isUserCreated) {
val detailsFragment = StudyListTermFragment()
detailsFragment.studyListId = studyList.id
fragmentTransaction
.add(R.id.fragmentDetails, detailsFragment, "termDetailsFragment")
}
fragmentTransaction.commit()
}
}
xlarge layout (я пробовал много разных макетов, но он не работает, один и тот же код в словах Activity):
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<FrameLayout
android:id="@+id/mainFragment"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintWidth_default="percent"
app:layout_constraintWidth_percent=".5"
tools:layout="@layout/list_item_studylist" />
<FrameLayout
android:id="@+id/fragmentDetails"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintWidth_default="percent"
app:layout_constraintWidth_percent=".5"
tools:ignore="InconsistentLayout" />
</androidx.constraintlayout.widget.ConstraintLayout>
Оба фрагмента - androidx.fragment.app.ListFragment.
Есть идеи, почему первый FrameLayout всегда имеет максимальную ширину (не 50%) при использовании с вложенными фрагментами?