本文介绍了kotlin android底部导航片段setRetainInstance(true)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我创建了一个包含4个片段的底部导航项目,并将setHasOptionsMenu(true)放在qponFragment的onCreate()中,以便在切换Fragments之后保持qponFragment的相同内容.但是,它不起作用,从其他片段切回后,qponFragment仍会刷新.请帮助修复它,并找出我的代码有什么问题.

I created an bottom navigation project with 4 fragment and put setHasOptionsMenu(true) in onCreate() of the qponFragment in order to keep the same content of qponFragment after switching around the Fragments. However, it doesn't work, the qponFragment is still refreshed after switching back from other fragments. please help to fix it and find out what is the problem with my code.

此处包含MainActivity.kt的代码

Here with the code for 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的代码

Here with the code for 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)

}

推荐答案

如果您尝试保留片段实例而不每次都创建新实例,则它应该可以工作.请找到代码bel

If you try to keep the fragment instance without creating new Instance everytime, it should work. Please find the code bel

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()
   }
}

显示错误:

这篇关于kotlin android底部导航片段setRetainInstance(true)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

09-04 22:00