FrameLayout 是 Android 中的一个简单布局容器,用于将子视图堆叠在一起(后添加的视图默认覆盖在前一个视图之上)。它通常用于需要重叠视图或动态切换视图的场景(如 Fragment 容器)。
AppBar 是 Material Design 中的顶部工具栏,通常包含标题、导航按钮、菜单项等。在 Android 中,Toolbar
或 MaterialToolbar
是实现 AppBar 的常用组件。
当需要动态切换 Fragment(例如底部导航或侧边栏导航)时,FrameLayout
是一个轻量级的选择。它的特点是:
FragmentTransaction.replace()
)。<!-- activity_main.xml -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<!-- AppBar -->
<com.google.android.material.appbar.MaterialToolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
android:elevation="4dp"/>
<!-- Fragment 容器 -->
<FrameLayout
android:id="@+id/fragment_container"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</LinearLayout>
// MainActivity.kt
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// 设置 Toolbar 为 ActionBar
setSupportActionBar(findViewById(R.id.toolbar))
// 初始加载第一个 Fragment
if (savedInstanceState == null) {
supportFragmentManager.beginTransaction()
.replace(R.id.fragment_container, HomeFragment())
.commit()
}
}
// 切换 Fragment 的方法示例
fun switchFragment(fragment: Fragment) {
supportFragmentManager.beginTransaction()
.replace(R.id.fragment_container, fragment)
.addToBackStack(null) // 可选:加入返回栈
.commit()
}
}
原因:Activity 重建时未检查 savedInstanceState
,导致重复添加 Fragment。
解决:在 onCreate
中判断 savedInstanceState
:
if (savedInstanceState == null) {
supportFragmentManager.beginTransaction()
.replace(R.id.fragment_container, HomeFragment())
.commit()
}
原因:未正确设置 Toolbar
为 ActionBar,或主题未使用 NoActionBar
。
解决:
setSupportActionBar()
。解决:添加过渡动画:
supportFragmentManager.beginTransaction()
.setCustomAnimations(
R.anim.slide_in_right, // 进入动画
R.anim.slide_out_left // 退出动画
)
.replace(R.id.fragment_container, fragment)
.commit()
如果需更复杂的布局管理(如协调 AppBar 滚动),可考虑:
FrameLayout
作为 Fragment 容器适合简单场景,需注意状态管理和重叠问题。结合 Toolbar
实现 AppBar 时,需确保主题和代码配置正确。对于复杂需求,建议使用更高级的布局或导航库。