当前位置: 首页 > 知识库问答 >
问题:

活动片段内的recreate()导致底部导航栏停止工作

萧心水
2023-03-14

我在MainActivity中使用了两个片段,一个是首选项片段,另一个(默认)是主片段。我想确保,若在导航栏中选择了相同的项目,则不会重新创建该片段。但是现在我有两个问题:
1。如果我尝试更改首选项中的主题,底部导航栏将停止工作。切换到preferences片段不会更改操作栏中的标题,但它应该会更改(在实施片段替换预防之前,我进行了测试,它起到了作用。下面是一些代码:
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"
    }

}

首选项ragment.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个答案

秋阳荣
2023-03-14

切换到导航组件。这比手动创建片段事务要好得多

 类似资料:
  • 我的主要活动中有一个底部导航栏。通过单击底部导航中的一个选项卡,我想更改视图中的片段。我有以下代码:主要活动: } 我的一个片段: 如果我单击其中一个选项卡,就会显示正确的片段,因此这是可行的。然而,当新片段出现时,我想单击另一个选项卡来显示另一个片段,这就行不通了。底部导航栏不会对单击做出反应。甚至日志。i语句不起作用,因此似乎没有调用导航项SelectedListener。 我对android

  • 我创建了一个带有底部导航栏的活动。我在谷歌上搜索了很多关于它的信息,但现在我不知道如何准确地处理这个问题。之前,当用户点击底部导航时,我刚刚开始了另一个活动,但我认为这不好。 如何在选项卡之间切换?我必须处理碎片吗?那么“setContentView(int layoutResID)”呢?我该怎么做?我很困惑。。。 非常感谢你的帮助——我希望你明白我的意思。

  • 我创建了一个带有“底部导航活动”的新项目: 这是生成的代码: 如何使用底部栏更改为新片段?例如,我有3个片段:Fragment1 Fragment2和Fragment3,我想用底部栏中的3个按钮更改为它们。我还想通过左右滑动手指来切换片段,我该怎么做?

  • Tabbar 底部导航栏 1.4.8 优点: 此组件一般用于应用的底部导航,具有如下特点: 可以设置凸起的按钮,且是全端通用的 图标可以使用字体图标(内置图标和扩展图标)或者图片 可以动态切换菜单的数量以及配置 切换菜单之前,可以进行回调鉴权 可以设置角标 有效防止组件区域高度塌陷,无需给父元素额外的内边距或者外边距来避开导航的区域 缺点: 虽然优点很多,但是如果用此组件模拟tabbar页面的话依

  • 我将其添加到我的应用程序底部导航栏中,但现在的问题是,我想从底部导航栏中的一个按钮移动到活动必须分段才能查看的活动(TabLayout,ViewPager)。当我尝试将其设置为selectedFragment=newmainActivityoderlistfargmant()时;“显示我”这样的错误。。也是这样,也不管用。。startActivity(新意图(NafMain.this,MainAc

  • 我试图设置一个显示3个片段的底部导航。 问题是,该应用程序完全适用于Android 5.0,但在Android 6.0及更高版本上抛出错误... SdkVersion 26-minSdkVersion 21-塔吉特SdkVersion 26- 可以肯定的是,我一直在使用这个例子来构建这个应用程序,在我的代码中实现了这个方法之后,仍然会抛出一个异常。 提前感谢您的帮助。 错误: 主要活动 主要活动X