【问题标题】:android - How to set a Fragment on Activity OnCreate? (Kotlin)android - 如何在 Activity OnCreate 上设置片段? (科特林)
【发布时间】:2020-09-08 20:55:24
【问题描述】:

我目前正在开发具有设置活动的应用程序。在这个 Activity 中,有一个 FrameLayout,用于加载 Settings Main 片段。

当我尝试使用包含 supportFragmentManager 的函数在活动的 onCreate 中加载片段时,我收到错误 Unable to start activity: java.lang.IllegalStateException: Fragment not attached to a context。奇怪的是,Android Studio 指向val frgSettingsMain = FragmentSettingsMain()DataItemsSettings

我做错了什么?还有其他更简洁的方法可以在 onCreate 中初始化 Fragment 吗?

代码:

ActivitySettings.kt

class ActivitySettings : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_settings)

        topToolbarBack.setNavigationOnClickListener {
            finish()
        }

        val frgSettingsMain = FragmentSettingsMain()

        setCurrentFragment(frgSettingsMain)

    }

    private fun setCurrentFragment(fragment: Fragment) =
        supportFragmentManager.beginTransaction().apply {
            replace(R.id.framelayoutSettings, fragment)
            commit()
        }
}

FragmentSettingsMain.kt

class FragmentSettingsMain : Fragment(), AdapterSettings.OnItemClickListener {
    val settingsList = listOf(
        DataItemsSettings(getString(R.string.look), getString(R.string.lookdescription), R.drawable.ic_colored_color_lens),
        DataItemsSettings(getString(R.string.playing), getString(R.string.playingdescription), R.drawable.ic_colored_view_carousel),
        DataItemsSettings(getString(R.string.images), getString(R.string.imagesdscription), R.drawable.ic_colored_image),
        DataItemsSettings(getString(R.string.audio), getString(R.string.audiodescription), R.drawable.ic_colored_volume_up),
        DataItemsSettings(getString(R.string.other), getString(R.string.otherdescription), R.drawable.ic_colored_shape),
        DataItemsSettings(getString(R.string.about), getString(R.string.aboutdescription), R.drawable.ic_colored_info)
    )

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        retainInstance = true
    }

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? = inflater.inflate(R.layout.fragment_settings_main, container, false)

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        rvSettings.apply {
            layoutManager = LinearLayoutManager(activity)
            adapter = AdapterSettings(settingsList, this@FragmentSettingsMain)
        }
    }

    override fun OnItemClick(position: Int) {
        when(position) {
            0 -> Toast.makeText(context, "Pressed Option 0", Toast.LENGTH_LONG).show()
            1 -> Toast.makeText(context, "Pressed Option 1", Toast.LENGTH_LONG).show()
            2 -> Toast.makeText(context, "Pressed Option 2", Toast.LENGTH_LONG).show()
            3 -> Toast.makeText(context, "Pressed Option 3", Toast.LENGTH_LONG).show()
            4 -> Toast.makeText(context, "Pressed Option 4", Toast.LENGTH_LONG).show()
            5 -> Toast.makeText(context, "Pressed Option 5", Toast.LENGTH_LONG).show()
        }
    }
}

【问题讨论】:

    标签: android kotlin android-fragments


    【解决方案1】:

    问题是getstring() 方法需要上下文。当您调用 FragmentSettingsMain() 时,上下文不会附加到 Fragment。尝试在将 Fragment 添加到容器后初始化变量 settingsList。例如:

    lateinit var settingsList : List<DataItemSettings>
    override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            retainInstance = true
            settingsList = listOf(
            DataItemsSettings(getString(R.string.look), getString(R.string.lookdescription), R.drawable.ic_colored_color_lens),
            DataItemsSettings(getString(R.string.playing), getString(R.string.playingdescription), R.drawable.ic_colored_view_carousel),
            DataItemsSettings(getString(R.string.images), getString(R.string.imagesdscription), R.drawable.ic_colored_image),
            DataItemsSettings(getString(R.string.audio), getString(R.string.audiodescription), R.drawable.ic_colored_volume_up),
            DataItemsSettings(getString(R.string.other), getString(R.string.otherdescription), R.drawable.ic_colored_shape),
            DataItemsSettings(getString(R.string.about), getString(R.string.aboutdescription), R.drawable.ic_colored_info)
        )
    
        }
    

    【讨论】:

    • 完美!它适用于无法在构造函数中初始化的 var(请关注 thislink 了解一些 lateinit var 用法)。例如,您可以检查 var 是否已初始化 this::settingsList.isInitialized,这可能很有用。
    猜你喜欢
    • 2022-01-15
    • 2018-05-09
    • 1970-01-01
    • 1970-01-01
    • 2020-07-21
    • 2016-02-13
    • 2019-07-09
    • 2022-11-24
    • 1970-01-01
    相关资源
    最近更新 更多