首页 > 解决方案 > 类型不匹配:推断的类型是 FragmentManager 但 FragmentActivity 是预期的

问题描述

因此,从 viewpager 迁移到 viewpager2 时,我在 Kotlin 中遇到了问题。下面是旧的工作代码和迁移到 viewpager2 的新尝试,以及我在运行新代码时收到的错误消息。

旧的工作代码 DashboardFragment.kt

package com.example.profilside.ui.dashboard

import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentManager
import androidx.fragment.app.FragmentPagerAdapter
import androidx.viewpager.widget.ViewPager
import com.example.profilside.R

class DashboardFragment : Fragment() {

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

        val viewPager = root.findViewById(R.id.view_pager2) as ViewPager
        // Important: Must use the child FragmentManager or you will see side effects.
        viewPager.adapter = MyAdapter(childFragmentManager)

        return root
    }

    class MyAdapter internal constructor(fm: FragmentManager) : FragmentPagerAdapter(fm) {

        override fun getCount(): Int = 2

        override fun getItem(position: Int): Fragment {
            if(position == 0){
                return ProfileStatsFragment.newInstance()
            }
            else {
                return ProfilePlatformsFragment.newInstance()
            }
        }

        override fun getPageTitle(position: Int): CharSequence = "Tab $position"
    }

    companion object {
        val TAG: String = DashboardFragment::class.java.name
    }

}

新的非工作代码 DashboardFragment.kt

package com.example.profilside.ui.dashboard

import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentActivity
import androidx.fragment.app.FragmentManager
import androidx.fragment.app.FragmentPagerAdapter
import androidx.viewpager2.adapter.FragmentStateAdapter
import androidx.viewpager2.widget.ViewPager2
import com.example.profilside.R

class DashboardFragment : Fragment() {

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

        val viewPager2 = root.findViewById(R.id.view_pager2) as ViewPager2
        // Important: Must use the child FragmentManager or you will see side effects.
        viewPager2.adapter = MyAdapter(childFragmentManager)

        return root
    }

    class MyAdapter internal constructor(fa: FragmentActivity) : FragmentStateAdapter(fa) {

        override fun getItemCount(): Int = 2

        override fun createFragment(position: Int): Fragment {
            if (position == 0) {
                return ProfileStatsFragment.newInstance()
            } else {
                return ProfilePlatformsFragment.newInstance()
            }
        }
    }

    companion object {
        val TAG: String = DashboardFragment::class.java.name
    }

}

当我尝试运行最后一个代码时,出现以下错误

Type mismatch: inferred type is FragmentManager but FragmentActivity was expected

编辑: 如果有人好奇,我按照本指南从 ViewPager 迁移到 ViewPager2,这就是我得到“新的非工作代码”的方式。

编辑 2 错误来自这一行 viewPager2.adapter = MyAdapter(childFragmentManager),其中 childFragmentManager 是问题所在。有谁知道是否有可以与 FragmentActivity 一起使用的 childFragmentManager 的替代品?

标签: android-studiokotlinandroid-viewpagerandroid-viewpager2

解决方案


推荐阅读