android BaseFragment со своим собственным xml и представлением унаследованного фрагмента внутри frameLayout родителя. - PullRequest
0 голосов
/ 11 февраля 2020

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

Унаследованное представление фрагмента должно go в: (найдено в родительском элементе xml)

<FrameLayout
    android:id="@+id/gamePadContainer"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layout_constraintBottom_toTopOf="@+id/gamePadHistoryScroller"
    app:layout_constraintTop_toTopOf="parent" />

Базовый фрагмент (аннотация):

override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        val rootView = inflater.inflate(R.layout.fragment_gamepad, container, false)

        val gamePadView = inflater.inflate(onFragmentLayoutRequest(), null)
        gamePadView.viewTreeObserver.addOnGlobalLayoutListener(object :
            ViewTreeObserver.OnGlobalLayoutListener {
            override fun onGlobalLayout() {
                joystickLeftCenter[0] = 0
                joystickLeftCenter[1] = 0

                joystickRightCenter[0] = 0
                joystickRightCenter[1] = 0

                gamePadButtonsMap[KeyEvent.KEYCODE_BUTTON_THUMBL]?.let {
                    joystickLeftCenter[0] = it.buttonView.left
                    joystickLeftCenter[1] = it.buttonView.top
                }

                gamePadButtonsMap[KeyEvent.KEYCODE_BUTTON_THUMBR]?.let {
                    joystickRightCenter[0] = it.buttonView.left
                    joystickRightCenter[1] = it.buttonView.top
                }

                gamePadView.viewTreeObserver.removeOnGlobalLayoutListener(this)
            }
        })
        gamePadButtonsMap = onGamePadButtonMapRequest(gamePadView)

        return rootView
    }

Базовый фрагмент XML:

    <?xml version="1.0" encoding="utf-8"?>
<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/gamePadContainer"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_constraintBottom_toTopOf="@+id/gamePadHistoryScroller"
        app:layout_constraintTop_toTopOf="parent" />

    <!--  Buttons History  -->
    <HorizontalScrollView
        android:id="@+id/gamePadHistoryScroller"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:layout_marginTop="28dp"
        android:layout_marginBottom="24dp"
        android:fillViewport="true"
        android:scrollbars="none"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintVertical_bias="0.265"
        tools:layout_editor_absoluteX="0dp">

        <androidx.appcompat.widget.LinearLayoutCompat
            android:id="@+id/gamePadHistoryContainer"
            android:layout_width="wrap_content"
            android:layout_height="50dp"
            android:layout_marginBottom="52dp"
            android:background="@color/bg_buttons_history"
            android:gravity="left"
            android:orientation="horizontal" />
    </HorizontalScrollView>
</androidx.constraintlayout.widget.ConstraintLayout>

Наследующий фрагмент:

class PS4Fragment : GamePadFragment() {

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        super.onCreateView(inflater, container, savedInstanceState)

        return inflater.inflate(R.layout.fragment_ps4, container, false)
    }
}

1 Ответ

0 голосов
/ 12 февраля 2020
override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        val rootView = inflater.inflate(R.layout.fragment_gamepad, container, false)

        val gamePadView = LayoutInflater.from(requireContext()).inflate(onFragmentLayoutRequest(), rootView.gamePadContainer, true)

        gamePadButtonsMap = onGamePadButtonMapRequest(gamePadView)

rootView.gamePadContainer.addView (gamePadView) вернуть rootView}

Я использовал тот же инфлятор, теперь он работает, как и ожидалось. В дочернем фрагменте (Inherit фрагмента) нет «onCreateView»

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

Спасибо!

...