Activity.recreate () внутри фрагмента приводит к тому, что нижняя панель навигации перестает работать - PullRequest
0 голосов
/ 13 апреля 2020

Я использую 2 фрагмента внутри своей 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 голосов
/ 15 апреля 2020

Переключено на компоненты навигации. Это намного лучше, чем вручную делать фрагменты транзакций

...