问题描述
我正在尝试从使用 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()
来获取活动片段管理器。但通常父片段管理器更有用和清晰。