android - kotlin android 底部导航片段 setRetainInstance(true)
问题描述
我创建了一个带有 4 个片段的底部导航项目,并将 setHasOptionsMenu(true) 放在 qponFragment 的 onCreate() 中,以便在切换片段后保持 qponFragment 的相同内容。但是,它不起作用,qponFragment 从其他 Fragment 切换回来后仍然会刷新。请帮助修复它并找出我的代码有什么问题。
这里有 MainActivity.kt 的代码
class MainActivity : AppCompatActivity() {
private var mFirebaseAnalytics: FirebaseAnalytics? = null
private val mOnNavigationItemSelectedListener = BottomNavigationView.OnNavigationItemSelectedListener { item ->
when (item.itemId) {
R.id.navigation_qpon -> {
//message.setText(R.string.title_qpon)
actionBarIcon(R.drawable.ic_title_black)
createQponFragment()
return@OnNavigationItemSelectedListener true
}
R.id.navigation_me-> {
//message.setText(R.string.title_me)
actionBarIcon(R.drawable.logged)
createMeFragment()
return@OnNavigationItemSelectedListener true
}
R.id.navigation_tool -> {
//message.setText(R.string.title_tool)
actionBarIcon(R.drawable.logged)
createToolFragment()
return@OnNavigationItemSelectedListener true
}
R.id.navigation_tutorial -> {
//message.setText(R.string.title_tutorial)
actionBarIcon(R.drawable.tutorial)
createTutorialFragment()
return@OnNavigationItemSelectedListener true
}
}
false
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// Obtain the FirebaseAnalytics instance.
mFirebaseAnalytics = FirebaseAnalytics.getInstance(this)
actionBarIcon(R.drawable.ic_title_black)
createQponFragment()
navigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener)
}
fun actionBarIcon(imageName:Int) {
setSupportActionBar(findViewById(R.id.my_toolbar))
my_toolbar.setLogo(imageName)
if (imageName == R.drawable.ic_title_black) {
my_toolbar.setTitle("")
}
if (imageName == R.drawable.logged) {
my_toolbar.setTitle("login name")
}
if (imageName == R.drawable.tutorial) {
my_toolbar.setTitle("Tutorial")
}
}
val manager = supportFragmentManager
fun createQponFragment() {
val transaction = manager.beginTransaction()
val fragment = qponFragment()
transaction.replace(R.id.fragmentholder,fragment)
transaction.addToBackStack(null)
transaction.commit()
}
fun createMeFragment() {
val transaction = manager.beginTransaction()
val fragment = meFragment()
transaction.replace(R.id.fragmentholder,fragment)
transaction.addToBackStack(null)
transaction.commit()
}
fun createToolFragment() {
val transaction = manager.beginTransaction()
val fragment = toolFragment()
transaction.replace(R.id.fragmentholder,fragment)
transaction.addToBackStack(null)
transaction.commit()
}
fun createTutorialFragment() {
val transaction = manager.beginTransaction()
val fragment = tutorialFragment()
transaction.replace(R.id.fragmentholder,fragment)
transaction.addToBackStack(null)
transaction.commit()
}
}
这里有 qponFragment.kt 的代码
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setRetainInstance(true)
}
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?): View? {
setHasOptionsMenu(true)
return inflater.inflate(R.layout.fragment_qpon, container, false)
}
解决方案
如果您尝试保留片段实例而不每次都创建新实例,它应该可以工作。请找到代码
class MainActivity : AppCompatActivity() {
private var mFirebaseAnalytics: FirebaseAnalytics? = null
private var meFragment:Fragment? = null
var toolFragment :Fragment? =null
var qponFragment:Fragment? =null
var tutorialFragment:Fragment? = null
private val mOnNavigationItemSelectedListener = BottomNavigationView.OnNavigationItemSelectedListener { item ->
when (item.itemId) {
R.id.navigation_qpon -> {
//message.setText(R.string.title_qpon)
actionBarIcon(R.drawable.ic_title_black)
createQponFragment()
return@OnNavigationItemSelectedListener true
}
R.id.navigation_me-> {
//message.setText(R.string.title_me)
actionBarIcon(R.drawable.logged)
createMeFragment()
return@OnNavigationItemSelectedListener true
}
R.id.navigation_tool -> {
//message.setText(R.string.title_tool)
actionBarIcon(R.drawable.logged)
createToolFragment()
return@OnNavigationItemSelectedListener true
}
R.id.navigation_tutorial -> {
//message.setText(R.string.title_tutorial)
actionBarIcon(R.drawable.tutorial)
createTutorialFragment()
return@OnNavigationItemSelectedListener true
}
}
false
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// Obtain the FirebaseAnalytics instance.
mFirebaseAnalytics = FirebaseAnalytics.getInstance(this)
actionBarIcon(R.drawable.ic_title_black)
createQponFragment()
navigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener)
}
fun actionBarIcon(imageName:Int) {
setSupportActionBar(findViewById(R.id.my_toolbar))
my_toolbar.setLogo(imageName)
if (imageName == R.drawable.ic_title_black) {
my_toolbar.setTitle("")
}
if (imageName == R.drawable.logged) {
my_toolbar.setTitle("login name")
}
if (imageName == R.drawable.tutorial) {
my_toolbar.setTitle("Tutorial")
}
}
val manager = supportFragmentManager
fun createQponFragment() {
val transaction = manager.beginTransaction()
if(qponFragment == null) qponFragment = qponFragment() // *****code changed here***********
transaction.replace(R.id.fragmentholder,qponFragment)
transaction.addToBackStack(null)
transaction.commit()
}
fun createMeFragment() {
val transaction = manager.beginTransaction()
if(meFragment == null) meFragment = meFragment()
transaction.replace(R.id.fragmentholder,meFragment)
transaction.addToBackStack(null)
transaction.commit()
}
fun createToolFragment() {
val transaction = manager.beginTransaction()
if(toolFragment == null) toolFragment = toolFragment()
transaction.replace(R.id.fragmentholder,toolFragment)
transaction.addToBackStack(null)
transaction.commit()
}
fun createTutorialFragment() {
val transaction = manager.beginTransaction()
val fragment = tutorialFragment()
if(tutorialFragment == null) toolFragment = tutorialFragment() // *****code changed here***********
transaction.replace(R.id.fragmentholder,tutorialFragment)
transaction.replace(R.id.fragmentholder,fragment)
transaction.addToBackStack(null)
transaction.commit()
}
}
它显示错误:
推荐阅读
- php - 带空格的 PHP 电子邮件提取器
- c++ - SetWindowsHookEx 不适用于另一个进程线程 ID 上的 WH_CBT(但适用于自己的线程 ID)
- apache-nifi - QueryDNS 卡住了,如何摆脱 UnexpectedNamingException?
- flutter - 颤振儿童小部件......有区别吗?
- swift - 调用生成发布者的通用函数的正确语法是什么?
- php - wordpress 网站请求错误的网址
- node.js - 快速路由与 url 不匹配
- python - 文件“device/generic/goldfish/tools/mk_combined_img.py”,第 48 行打印“'%s' 无法转换为 int”%(行 [2])
- javascript - (append = false) 在 javascript 中是什么意思?
- dcmtk - 使用 apt-get install 安装 WSL ubuntu 后包含 dcmtk 头文件