如何更改片段科特林

时间:2018-09-13 16:40:35

标签: android android-fragments kotlin fragment

我从Kotling开始,我不知道如何在片段之间进行更改,我尝试了以下代码:

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

R.layout.fragment_information.toInt()

但是此参数有一个错误,因为它找不到片段ID。

6 个答案:

答案 0 :(得分:2)

我通常使用replace在片段之间进行更改。还要仅将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()
            }

答案 1 :(得分:0)

添加片段时,需要将其添加到“活动”布局而不是整个布局中存在的ID中:

    void _start() {

    /* main body of program: call main(), etc */

    /* exit system call */
    asm("movl $1,%eax;"
        "xorl %ebx,%ebx;"
        "int  $0x80"
    );
}

答案 2 :(得分:0)

万一仍然有人需要一种快速的方法。我创建了一个函数,可以在需要更改片段时轻松调用它。

 private fun replaceFragment(fragment: Fragment) {
    val transaction = supportFragmentManager.beginTransaction()
    transaction.replace(R.id.frame, fragment)
    transaction.commit()
}
在这种情况下,

R.id.frame 是活动中将保存我的片段的Framelayout的ID。您现在要做的就是调用该函数。

replaceFragment(HomeFragment())

答案 3 :(得分:0)

其他答案也可以,但仍然可以通过使用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

答案 4 :(得分:0)

这是您通过单击另一个片段内的按钮进入片段或活动的示例:

class Fragment_One: Fragment() {

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_one, container, false)
    }

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

        btn_goToActivity2.setOnClickListener {
            val intent = Intent(context, SecondActivity::class.java)
            startActivity(intent)
        }

        btn_goToFragment2.setOnClickListener {
            var fr = getFragmentManager()?.beginTransaction()
            fr?.replace(R.id.fragment, Fragment_Two())
            fr?.commit()
        }
    }
}

答案 5 :(得分:0)

fragment-ktx jetpack库包含方便的扩展功能,可简化许多事情,including transactions

// MyActivity.kt

class MyActivity : AppCompatActivity() {
  ...

  fun showMyFragment() {
    val fragment = MyFragment()
    supportFragmentManager.commit {
      replace(R.id.fragment_container, fragment)
    }
  }
}

R.id.fragment_container是父布局中片段容器的ID。 FragmentContainerViewrecommended容器,例如:

<!-- my_activity_layout.xml -->

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout ...>

    <androidx.fragment.app.FragmentContainerView
        android:id="@+id/fragment_container"
        ... />

    ...

</androidx.constraintlayout.widget.ConstraintLayout>

但是,如果您的目的是实现应用内导航,那么使用Navigation component而不是手动切换片段会更好,更容易。