Вложенный фрагмент не учитывает максимальную ширину - PullRequest
0 голосов
/ 14 декабря 2018

Я пытаюсь перейти на Приложение с одним действием (и готовлюсь использовать новую навигационную библиотеку JetPack).

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

Я хочу перевести логику, содержащуюся в Деятельности, во фрагмент, и все работает нормально, но по какой-то причине в случаеширокий макет (тот, который позволяет одновременно показывать основной фрагмент и дополнительный фрагмент, например, в планшете) основной фрагмент занимает всю ширину (должно быть 50%) .Вторичный фрагмент работает хорошо (это видно под основным).

Bad layout

Есть какие-нибудь идеи, как это можно исправить?

Макет упражнения:

<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%) при использовании с вложенными фрагментами?

1 Ответ

0 голосов
/ 14 декабря 2018

Попробуйте это

<android.support.constraint.Guideline
    android:id="@+id/guideline"
    android:layout_width="1dp"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    app:layout_constraintGuide_percent="0.5"/>

<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_constraintEnd_toStartOf="@id/guideline"
    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_constraintStart_toEndOf="@id/guideline"
    tools:ignore="InconsistentLayout" />
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...