Android 如何在框架布局中插入片段布局

Android 如何在框架布局中插入片段布局,android,kotlin,Android,Kotlin,我第一次尝试使用Kotlin创建一个Android应用程序,并尝试在用户单击导航图标时使用不同的片段布局,而不让它们与我的底部导航栏重叠。我创建了一个FrameLayout,旨在将片段布局放在其中,但不清楚如何编写代码来实现这一点 这是我的MainActivity.kt,它现在覆盖导航条: private val onNavigationItemSelectedListener = BottomNavigationView.OnNavigationItemSelectedListener { i

我第一次尝试使用Kotlin创建一个Android应用程序,并尝试在用户单击导航图标时使用不同的片段布局,而不让它们与我的底部导航栏重叠。我创建了一个FrameLayout,旨在将片段布局放在其中,但不清楚如何编写代码来实现这一点

这是我的MainActivity.kt,它现在覆盖导航条:

private val onNavigationItemSelectedListener = BottomNavigationView.OnNavigationItemSelectedListener { item ->
       when (item.itemId) {
            R.id.navigation_home -> {
                setContentView(R.layout.fragment_home)
                return@OnNavigationItemSelectedListener true
            }
            R.id.navigation_favorites -> {
                setContentView(R.layout.fragment_favorite)
                return@OnNavigationItemSelectedListener true
            }
            R.id.navigation_calculator -> {
                setContentView(R.layout.fragment_calculator)
                return@OnNavigationItemSelectedListener true
            }
        }
        false
    }
这是我的框架布局:

<FrameLayout
        android:id="@+id/fragment_container"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_above= "@id/nav_view">

</FrameLayout>

当选择导航栏上的选项卡时,您希望导航到相应的片段。你就是这样做的

假设我们有一个MainActivity,它有3个选项卡:“Tab1”、“Tab2”、“Tab3” MainActivity将有两个XML布局:导航栏和框架布局。 然后,您需要创建3个新片段(每个片段也有自己的XML布局)。选择适当的导航栏选项卡时,这3个片段将查看framelayout

例如:

主要活动XML

<FrameLayout
    android:id="@+id/mainFragment"
    android:layout_width="match_parent"
    android:background="#ffffff"
    android:layout_height="match_parent"
    android:layout_above="@+id/bottom_nav"
    android:text="@string/title_home" />

<com.google.android.material.bottomnavigation.BottomNavigationView
    android:id="@+id/bottom_nav"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:background="?android:attr/windowBackground"
    app:menu="@menu/bottom_navigation" />

主要活动KOTLIN

class MainActivity : AppCompatActivity() {

private lateinit var manager: FragmentManager
private lateinit var transaction: FragmentTransaction

private val mOnNavigationItemSelectedListener = BottomNavigationView.OnNavigationItemSelectedListener { item ->
    when (item.itemId) {
        R.id.navigation_tab1 -> {

            title = "Tab1"
            manager = supportFragmentManager
            transaction = manager.beginTransaction()
            transaction.replace(R.id.mainFragment, Tab1Fragment())
            transaction.addToBackStack(null)
            transaction.commit()


            return@OnNavigationItemSelectedListener true
        }
        R.id.navigation_tab2 -> {

            title = "Tab2"
            manager = supportFragmentManager
            transaction = manager.beginTransaction()
            transaction.replace(R.id.mainFragment, Tab2Fragment())
            transaction.addToBackStack(null)
            transaction.commit()

            return@OnNavigationItemSelectedListener true
        }
        R.id.navigation_tab3 -> {

            title = "Tab 3"
            manager = supportFragmentManager
            transaction = manager.beginTransaction()
            transaction.replace(R.id.mainFragment, Tab3Fragment())
            transaction.addToBackStack(null)
            transaction.commit()

            return@OnNavigationItemSelectedListener true
        }
    }
    false
}

@SuppressLint("CommitTransaction")
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    val navigation = findViewById<View>(R.id.bottom_nav) as BottomNavigationView
    navigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener)

    }
}
class MainActivity:AppCompatActivity(){
私有lateinit变量管理器:FragmentManager
私有lateinit var事务:FragmentTransaction
private val mOnNavigationItemSelectedListener=BottomNavigationView.OnNavigationItemSelectedListener{item->
时间(item.itemId){
R.id.navigation_tab1->{
title=“Tab1”
manager=supportFragmentManager
事务=manager.beginTransaction()
transaction.replace(R.id.mainFragment,Tab1Fragment())
transaction.addToBackStack(空)
commit()事务
return@OnNavigationItemSelectedListener真的
}
R.id.navigation_tab2->{
title=“Tab2”
manager=supportFragmentManager
事务=manager.beginTransaction()
transaction.replace(R.id.mainFragment,Tab2Fragment())
transaction.addToBackStack(空)
commit()事务
return@OnNavigationItemSelectedListener真的
}
R.id.navigation_tab3->{
title=“表3”
manager=supportFragmentManager
事务=manager.beginTransaction()
transaction.replace(R.id.mainFragment,Tab3Fragment())
transaction.addToBackStack(空)
commit()事务
return@OnNavigationItemSelectedListener真的
}
}
假的
}
@SuppressLint(“提交交易”)
重写创建时的乐趣(savedInstanceState:Bundle?){
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val navigation=findViewById(R.id.bottom_nav)作为BottomNavigationView
navigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener)
}
}

当选择导航栏上的选项卡时,您希望导航到相应的片段。你就是这样做的

假设我们有一个MainActivity,它有3个选项卡:“Tab1”、“Tab2”、“Tab3” MainActivity将有两个XML布局:导航栏和框架布局。 然后,您需要创建3个新片段(每个片段也有自己的XML布局)。选择适当的导航栏选项卡时,这3个片段将查看framelayout

例如:

主要活动XML

<FrameLayout
    android:id="@+id/mainFragment"
    android:layout_width="match_parent"
    android:background="#ffffff"
    android:layout_height="match_parent"
    android:layout_above="@+id/bottom_nav"
    android:text="@string/title_home" />

<com.google.android.material.bottomnavigation.BottomNavigationView
    android:id="@+id/bottom_nav"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:background="?android:attr/windowBackground"
    app:menu="@menu/bottom_navigation" />

主要活动KOTLIN

class MainActivity : AppCompatActivity() {

private lateinit var manager: FragmentManager
private lateinit var transaction: FragmentTransaction

private val mOnNavigationItemSelectedListener = BottomNavigationView.OnNavigationItemSelectedListener { item ->
    when (item.itemId) {
        R.id.navigation_tab1 -> {

            title = "Tab1"
            manager = supportFragmentManager
            transaction = manager.beginTransaction()
            transaction.replace(R.id.mainFragment, Tab1Fragment())
            transaction.addToBackStack(null)
            transaction.commit()


            return@OnNavigationItemSelectedListener true
        }
        R.id.navigation_tab2 -> {

            title = "Tab2"
            manager = supportFragmentManager
            transaction = manager.beginTransaction()
            transaction.replace(R.id.mainFragment, Tab2Fragment())
            transaction.addToBackStack(null)
            transaction.commit()

            return@OnNavigationItemSelectedListener true
        }
        R.id.navigation_tab3 -> {

            title = "Tab 3"
            manager = supportFragmentManager
            transaction = manager.beginTransaction()
            transaction.replace(R.id.mainFragment, Tab3Fragment())
            transaction.addToBackStack(null)
            transaction.commit()

            return@OnNavigationItemSelectedListener true
        }
    }
    false
}

@SuppressLint("CommitTransaction")
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    val navigation = findViewById<View>(R.id.bottom_nav) as BottomNavigationView
    navigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener)

    }
}
class MainActivity:AppCompatActivity(){
私有lateinit变量管理器:FragmentManager
私有lateinit var事务:FragmentTransaction
private val mOnNavigationItemSelectedListener=BottomNavigationView.OnNavigationItemSelectedListener{item->
时间(item.itemId){
R.id.navigation_tab1->{
title=“Tab1”
manager=supportFragmentManager
事务=manager.beginTransaction()
transaction.replace(R.id.mainFragment,Tab1Fragment())
transaction.addToBackStack(空)
commit()事务
return@OnNavigationItemSelectedListener真的
}
R.id.navigation_tab2->{
title=“Tab2”
manager=supportFragmentManager
事务=manager.beginTransaction()
transaction.replace(R.id.mainFragment,Tab2Fragment())
transaction.addToBackStack(空)
commit()事务
return@OnNavigationItemSelectedListener真的
}
R.id.navigation_tab3->{
title=“表3”
manager=supportFragmentManager
事务=manager.beginTransaction()
transaction.replace(R.id.mainFragment,Tab3Fragment())
transaction.addToBackStack(空)
commit()事务
return@OnNavigationItemSelectedListener真的
}
}
假的
}
@SuppressLint(“提交交易”)
重写创建时的乐趣(savedInstanceState:Bundle?){
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val navigation=findViewById(R.id.bottom_nav)作为BottomNavigationView
navigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener)
}
}

请参考非常好的知识来源:

基本上,您需要创建链接中提到的事务:

val transaction = supportFragmentManager.beginTransaction().apply {
  // Replace whatever is in the fragment_container view with this fragment,
  // and add the transaction to the back stack so the user can navigate back
  replace(R.id.fragment_container, newFragment)
  addToBackStack(null)
transaction.commit()
}
因此,在你的情况下:

when (item.itemId) {
var fragment: Fragment
            R.id.navigation_home -> {
              fragment = HomeFragment()
            }
            .
            .  
            .
val transaction = supportFragmentManager.beginTransaction().apply {
  replace(R.id.fragment_container, fragment)
  addToBackStack(null)
  transaction.commit()
您也可以使用
add
而不是
replace

请参阅本帖以确定使用哪种方法:
请参考非常好的知识来源:

基本上,您需要创建链接中提到的事务:

val transaction = supportFragmentManager.beginTransaction().apply {
  // Replace whatever is in the fragment_container view with this fragment,
  // and add the transaction to the back stack so the user can navigate back
  replace(R.id.fragment_container, newFragment)
  addToBackStack(null)
transaction.commit()
}
因此,在你的情况下:

when (item.itemId) {
var fragment: Fragment
            R.id.navigation_home -> {
              fragment = HomeFragment()
            }
            .
            .  
            .
val transaction = supportFragmentManager.beginTransaction().apply {
  replace(R.id.fragment_container, fragment)
  addToBackStack(null)
  transaction.commit()
您也可以使用
add
而不是
replace

请参阅本帖以确定使用哪种方法: