我从Kotling开始,我不知道如何在片段之间进行更改,我尝试了以下代码:
val manager = supportFragmentManager
val transaction = manager.beginTransaction()
transaction.add(R.layout.fragment_information.toInt(), ComplainFragment())
transaction.commit()
R.layout.fragment_information.toInt()
但是此参数有一个错误,因为它找不到片段ID。
答案 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。 FragmentContainerView是recommended容器,例如:
<!-- 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而不是手动切换片段会更好,更容易。