片段中的activity.recreate()导致底部导航栏停止工作

时间:2020-04-12 21:07:15

标签: android android-fragments preferencefragment

我在MainActivity中使用2个片段,一个是首选项片段,另一个(默认为一个)是家庭片段。我想确保如果在导航栏中选择了相同的项目,则不会重新创建该片段。但是现在我有两个问题:
1.如果我尝试通过首选项更改主题,则底部导航栏将停止工作
2.切换到首选项片段不会更改操作栏中的标题,但应该(我在实施此功能之前进行了测试,并且可以防止片段替换。) 以下是一些代码:
MainActivity.kt

class MainActivity : ThemeActivity() {

    private val homeFragment: HomeFragment = HomeFragment()
    private val settingsFragment: SettingsFragment = SettingsFragment()

    private var currentFragment: Fragment? = null
    private var activeFragment: Int = R.id.navigation_home

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        savedInstanceState?.let {
            activeFragment = it.getInt(CURRENT_FRAGMENT, R.id.navigation_home)
        }

        val toolbar: MaterialToolbar = findViewById(R.id.home_toolbar)
        setSupportActionBar(toolbar)

        val prefs = getSharedPreferences("prefs", MODE_PRIVATE)
        val firstStart = prefs.getBoolean("firstStart", true)
        if (firstStart) {
            showSecurityDialog()
        }

        when (activeFragment) {
            R.id.navigation_home -> currentFragment = homeFragment
            R.id.navigation_settings -> currentFragment = settingsFragment
        }

        if (savedInstanceState == null) {
            supportFragmentManager
                .beginTransaction()
                .add(R.id.frame_layout, settingsFragment).hide(settingsFragment)
                .add(R.id.frame_layout, homeFragment).hide(homeFragment)
                .show(currentFragment!!)
                .commit()
        }

        val navView: BottomNavigationView = findViewById(R.id.bottom_nav)

        navView.setOnNavigationItemSelectedListener{
            setFragments(it.itemId)
        }
    }

    override fun onCreateOptionsMenu(menu: Menu?): Boolean {
        menuInflater.inflate(R.menu.toolbar_menu, menu)
        return super .onCreateOptionsMenu(menu)
    }

    override fun onOptionsItemSelected(item: MenuItem) = when (item.itemId) {
        R.id.about -> {
            val intent = Intent(this, AboutActivity::class.java)
            startActivity(intent)
            true
        }
        else -> {
            super.onOptionsItemSelected(item)
        }
    }

    private fun showSecurityDialog() {
        AlertDialog.Builder(this)
            .setTitle("Welcome!")
            .setMessage("Before we implement a proper security system to check whether app was modified or not, please be sure that you downloaded manager from vanced.app/github")
            .setPositiveButton("close"
            ) { dialog, _ -> dialog.dismiss() }
            .create().show()

        val prefs = getSharedPreferences("prefs", MODE_PRIVATE)
        val editor = prefs.edit()
        editor.putBoolean("firstStart", false)
        editor.apply()
    }

    private fun setFragments(itemId: Int): Boolean {
        activeFragment = itemId
        when (itemId) {
            R.id.navigation_home -> {
                if (currentFragment is HomeFragment) {
                    return false
                }
                supportFragmentManager
                    .beginTransaction()
                    .hide(currentFragment!!)
                    .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
                    .show(homeFragment)
                    .commit()

                currentFragment = homeFragment
            }
            R.id.navigation_settings -> {
                if (currentFragment is SettingsFragment) {
                    return false
                }
                supportFragmentManager
                    .beginTransaction()
                    .hide(currentFragment!!)
                    .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
                    .show(settingsFragment)
                    .commit()

                currentFragment = settingsFragment
            }
        }
        return true
    }

    companion object{
        const val CURRENT_FRAGMENT = "current_fragment"
    }

}

PreferenceFragment.kt

class SettingsFragment : PreferenceFragmentCompat() {

    override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
        setPreferencesFromResource(R.xml.preferences, rootKey)

        (activity as MainActivity).supportActionBar?.title = getString(R.string.title_settings)

        val updateCheck: Preference? = findPreference("update_check")

       val themeSwitch: ListPreference? = findPreference("theme_mode")
        themeSwitch?.setOnPreferenceChangeListener { _, _ ->

            when (themeSwitch.value){
                "LIGHT" -> {
                    activity?.setTheme(R.style.LightTheme_Blue)
                    activity?.recreate()
                }
                "DARK" -> {
                    activity?.setTheme(R.style.DarkTheme_Blue)
                    activity?.recreate()
                }
                "FOLLOW" -> {
                    when (resources.configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK) {
                        Configuration.UI_MODE_NIGHT_YES ->{
                            activity?.setTheme(R.style.DarkTheme_Blue)
                            activity?.recreate()
                        }
                        Configuration.UI_MODE_NIGHT_NO -> {
                            activity?.setTheme(R.style.LightTheme_Blue)
                            activity?.recreate()
                        }
                    }
                }
                else -> {
                    activity?.setTheme(R.style.LightTheme_Blue)
                    activity?.recreate()
                }
            }
            true
        }

    }
}

我试图在网上查找,但找不到任何有用的东西,我很确定问题出在活动娱乐上,但我真的不知道如何解决该问题。

1 个答案:

答案 0 :(得分:0)

切换到导航组件。比手动进行片段交易要好