简体   繁体   English

android - 如何在 Activity OnCreate 上设置片段? (科特林)

[英]android - How to set a Fragment on Activity OnCreate? (Kotlin)

Im currently working on an app which has a Settings Activity.我目前正在开发一个具有设置活动的应用程序。 In this activity, there is a FrameLayout, that loads the Settings Main fragment.在此活动中,有一个 FrameLayout,用于加载 Settings Main 片段。

When i try to load the fragment in onCreate of the activity using a function that contains the supportFragmentManager i get the error Unable to start activity: java.lang.IllegalStateException: Fragment not attached to a context .当我尝试使用包含 supportFragmentManager 的函数在活动的 onCreate 中加载片段时,我收到错误Unable to start activity: java.lang.IllegalStateException: Fragment not attached to a context The weird thing is, Android Studio, points at val frgSettingsMain = FragmentSettingsMain() and DataItemsSettings .奇怪的是,Android Studio 指向val frgSettingsMain = FragmentSettingsMain()DataItemsSettings

What am i doing wrong?我究竟做错了什么? Are there any other cleaner ways to initialize a Fragment in onCreate?还有其他更简洁的方法可以在 onCreate 中初始化 Fragment 吗?

Code:代码:

ActivitySettings.kt活动设置.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 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()
        }
    }
}

The problem is that method getstring() needs context.问题是方法getstring()需要上下文。 The context is not attached to the Fragment when you call FragmentSettingsMain().当您调用 FragmentSettingsMain() 时,上下文未附加到 Fragment。 Try to initialize variable settingsList after the Fragment is added to the container.在将 Fragment 添加到容器后尝试初始化变量 settingsList。 For example:例如:

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

    }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM