努力将代码从 AppcompatActivity 转换为 Fragment无法使用 setSupportActionBar(toolbar)

问题描述

我正在尝试从使用 AppcomatActivity 过渡到 Fragment,因为我正在更新我的应用程序,但遇到了问题。当我尝试运行我的应用程序时,我得到一个 “未解析的引用:supportFragmentManager”和“未解析的引用:setSupportActionBar”(这是 Logcat 向我显示的所有内容)。现在我选择改用fragments,因为我也想换apps UI,使用上比之前的版本快。无论如何,这是我的代码

记录片段

    package com.khumomashapa.notes.fragments

import android.os.Build
import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Toolbar
import androidx.annotation.RequiresApi
import androidx.fragment.app.FragmentManager
import androidx.fragment.app.FragmentPagerAdapter
import androidx.viewpager.widget.ViewPager
import com.astuetz.PagerSlidingTabStrip
import com.khumomashapa.notes.R
import kotlinx.android.synthetic.main.toolbar3.*


class RecorderFragment : Fragment() {

    private var tabs: PagerSlidingTabStrip? = null
    private var pager: ViewPager? = null

    @RequiresApi(Build.VERSION_CODES.LOLLIPOP)
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        activity?.title = "Recorder";

        pager = pager?.findViewById<View>(R.id.pager) as ViewPager
        pager!!.adapter = MyAdapter(supportFragmentManager)
        tabs = tabs?.findViewById<View>(R.id.tabs) as PagerSlidingTabStrip
        tabs!!.setViewPager(pager)
        val toolbar = toolbar?.findViewById<View>(R.id.toolbar) as Toolbar
        toolbar.popupTheme = R.style.ThemeOverlay_AppCompat_Light
        setSupportActionBar(toolbar)




    }


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



        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_recorder,container,false)
    }

    override fun onViewCreated(view: View,savedInstanceState: Bundle?) {
        super.onViewCreated(view,savedInstanceState)

    }

    inner class MyAdapter(fm: FragmentManager?) : FragmentPagerAdapter(
        fm!!
    ) {
        private val titles = arrayOf(
            getString(R.string.tab_title_record),getString(R.string.tab_title_saved_recordings)
        )

        override fun getItem(position: Int): Fragment {
            when (position) {
                0 -> {
                    return RecordFragment.newInstance(position)
                }
                1 -> {
                    return FileViewerFragment.newInstance(position)
                }
            }
            return null!!
        }

        override fun getCount(): Int {
            return titles.size
        }

        override fun getPageTitle(position: Int): CharSequence? {
            return titles[position]

        }
    }

    companion object {
        private val LOG_TAG = RecorderFragment::class.java.simpleName
    }
}

这个类的目的是展示一个视图分页器,它可以在我已经创建的其他片段之间切换。我能够修复与此相关的其他错误,例如“未解析的 findViewById 引用”和“MyAdapter 类”。

解决方法

对于 Fragment,实际上有两个相关的片段管理器。决定使用哪一种取决于您的用例。

子片段管理器

一个片段有一个子片段管理器,负责管理它的子/嵌套片段。您可以通过以下方式获得:

Fragment.getChildFragmentManager()

父母的片段管理器

片段还包含对其父片段管理器的引用。如果片段是活动的直接子级,则 his 代表活动片段管理器。否则,如果片段是另一个片段的子片段,则表示父片段的子片段管理器。这可以通过以下方式获得:

Fragment.getParentFragmentManager()

请注意,虽然 Fragment 具有 Fragment.getFragmentManager() 方法,但它已被弃用,而支持 Fragment.getParentFragmentManager(),因此不应使用它。

从技术上讲,您还可以通过使用 Fragment.getAcitivity() 获取片段活动的引用然后调用 Activity.getSupportFragmentManager() 来获取活动片段管理器。但通常父片段管理器更有用和清晰。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...