Android入门到实战(四):App UI主框架搭建
本文介绍了使用BottomNavigationView实现Android App底部导航栏的开发方法。主要内容包括:1)采用FrameLayout+BottomNavigationView的基础结构设计,包含首页、书架等四个Fragment模块;2)布局文件配置,包括菜单项定义和状态颜色控制;3)MainActivity中实现Fragment切换逻辑。通过ColorStateList实现导航项选中
·
一. 引言
在 Android 开发中,很多 App 都会有底部导航栏(Bottom Navigation),用于在不同模块之间快速切换。今天我们就用 BottomNavigationView 来搭建一个简单的 App 框架,包含 首页、书架、发现、我的 四个模块。
二. 项目结构设计
在这个示例中,我们采用最基础的结构:
MainActivity
├─ FrameLayout(fragment_container)
└─ BottomNavigationView(bottom_navigation)
- FrameLayout:用于承载各个 Fragment 的内容
- BottomNavigationView:底部导航栏,控制不同模块切换
四个模块对应四个 Fragment:
- HomeFragment(首页)
- LibraryFragment(书架)
- DiscoverFragment(发现)
- MineFragment(我的)
这种结构清晰明了,适合大部分 App 框架。
三. 布局文件
我们首先在 activity_main.xml 中定义布局:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/main"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<FrameLayout
android:id="@+id/fragment_container"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1" />
<com.google.android.material.bottomnavigation.BottomNavigationView
android:id="@+id/bottom_navigation"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:menu="@menu/bottom_nav_menu"
app:itemIconTint="@color/bottom_nav_icon_color"
app:itemTextColor="@color/bottom_nav_text_color"
app:labelVisibilityMode="labeled"/>
</LinearLayout>
- itemIconTint 和 itemTextColor 使用 ColorStateList,实现选中和未选中状态的颜色切换
- labelVisibilityMode="labeled" 保证文字始终可见
1️⃣ 菜单文件 bottom_nav_menu.xml
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/nav_home"
android:icon="@drawable/tab_home"
android:title="首页" />
<item
android:id="@+id/nav_library"
android:icon="@drawable/tab_library"
android:title="书架" />
<item
android:id="@+id/nav_discover"
android:icon="@drawable/tab_discover"
android:title="发现" />
<item
android:id="@+id/nav_profile"
android:icon="@drawable/tab_profile"
android:title="我的" />
</menu>
2️⃣ ColorStateList 资源
图标颜色 res/color/bottom_nav_icon_color.xml
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="#A0D8EF" android:state_checked="true"/>
<item android:color="#999999"/>
</selector>
文字颜色 res/color/bottom_nav_text_color.xml
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="#A0D8EF" android:state_checked="true"/>
<item android:color="#999999"/>
</selector>
这样 BottomNavigationView 就能在选中时显示主题色,未选中显示灰色。
四. MainActivity 代码实现
class MainActivity : AppCompatActivity() {
private val homeFragment = HomeFragment()
private val libraryFragment = LibraryFragment()
private val discoverFragment = DiscoverFragment()
private val profileFragment = ProfileFragment()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge() // 让布局延伸到屏幕底部
supportActionBar?.hide()
setContentView(R.layout.activity_main)
setFragment(homeFragment)
val bottomNav = findViewById<BottomNavigationView>(R.id.bottom_navigation)
bottomNav.setOnItemSelectedListener { item ->
when (item.itemId) {
R.id.nav_home -> setFragment(homeFragment)
R.id.nav_library -> setFragment(libraryFragment)
R.id.nav_discover -> setFragment(discoverFragment)
R.id.nav_profile -> setFragment(profileFragment)
}
true
}
}
private fun setFragment(fragment: Fragment) {
supportFragmentManager.beginTransaction()
.replace(R.id.fragment_container, fragment)
.commit()
}
}
- enableEdgeToEdge() 用于处理底部导航栏和安全区域
- setOnItemSelectedListener 切换不同 Fragment,实现底部导航栏的点击逻辑
五. 结语
通过这篇博客,我们完成了一个最基础的 App 框架:
- 四个 Fragment + BottomNavigationView
- ColorStateList 控制图标和文字的选中状态
- labelVisibilityMode 保证文字始终显示
- 布局简洁明了,方便在后续项目中扩展
这种结构非常适合快速搭建一个可用的 Android App,后续可以在 Fragment 里添加具体业务逻辑。
更多推荐
所有评论(0)