Как изменить Фрагмент Котлин - PullRequest
0 голосов
/ 13 сентября 2018

Я начинаю в Котлинге и не знаю, как переключаться между фрагментами, я пробовал этот код:

val manager = supportFragmentManager
    val transaction = manager.beginTransaction()
    transaction.add(R.layout.fragment_information.toInt(), ComplainFragment())
    transaction.commit()

R.layout.fragment_information.toInt ()

Но у меня есть ошибка с этим параметром, потому что он не находит идентификатор фрагмента.

Ответы [ 4 ]

0 голосов
/ 28 апреля 2019

Другие ответы будут работать, но все же мы можем значительно улучшить, используя функции расширения в Kotlin.

Добавьте функцию расширения к классу FragmentManager, как показано ниже,

inline fun FragmentManager.doTransaction(func: FragmentTransaction.() -> 
FragmentTransaction) {
    beginTransaction().func().commit()
}

затем создайте функцию расширения для класса AppCompatActivity,

fun AppCompatActivity.addFragment(frameId: Int, fragment: Fragment){
    supportFragmentManager.doTransaction { add(frameId, fragment) }
}


fun AppCompatActivity.replaceFragment(frameId: Int, fragment: Fragment) {
    supportFragmentManager.doTransaction{replace(frameId, fragment)}
}

fun AppCompatActivity.removeFragment(fragment: Fragment) {
    supportFragmentManager.doTransaction{remove(fragment)}
}

Теперь, чтобы добавить и удалить фрагменты из любого действия, вам просто нужно позвонить так:

addFragment(R.id.fragment_container, fragment)

replaceFragment(R.id.fragment_container, fragment)

Пожалуйста, обратитесь к ссылке ниже для получения дополнительной информации,

https://medium.com/thoughts-overflow/how-to-add-a-fragment-in-kotlin-way-73203c5a450b

0 голосов
/ 13 сентября 2018

Я обычно использую замену для переключения между фрагментами.Также измените R.layout.fragment_information только на R.id.fragment_layout_id, поэтому не нужно toInt ()

transaction.replace(R.id.fragment_layout_id, fragment)

Вот мое предложение.

    var fragment: Fragment? = null

            when (itemId) {
                        R.id.fragment_information -> {
                            fragment = ComplainFragment()
                        }
            }

            if (fragment != null) {
                    val transaction = supportFragmentManager.beginTransaction()
                    transaction.replace(R.id.fragment_layout_id, fragment)
                    add.commit()
            }
0 голосов
/ 27 апреля 2019

На случай, если кому-то еще понадобится быстрый подход к этому.Я создал функцию, которую можно легко вызывать всякий раз, когда вам нужно изменить фрагмент.

 private fun replaceFragment(fragment: Fragment) {
    val transaction = supportFragmentManager.beginTransaction()
    transaction.replace(R.id.frame, fragment)
    transaction.commit()
}

R.id.frame в данном случае это идентификатор моего Framelayout в действии, котороебудет держать мой фрагмент.Все, что вам нужно сделать сейчас, это вызвать функцию.

replaceFragment(HomeFragment())
0 голосов
/ 13 сентября 2018

Когда вы добавляете фрагмент, вам нужно добавить его к идентификатору, который существует в макете вашей активности, а не во весь макет:

supportFragmentManager.beginTransaction().add(R.id.some_id_in_your_activity_layout, ComplainFragment()).commit()
...