🔍 Giới thiệu
BottomNavigationView
là một thành phần UI phổ biến, thường được đặt ở cuối màn hình, giúp người dùng điều hướng giữa các chức năng chính như Trang chủ, Tìm kiếm, Tài khoản,…
Mã nguồn: SOT397-MobileAppDev/BottomNavigationView_Ex at main · maicuongtho/SOT397-MobileAppDev
🧱 Kiến trúc tổng quan
Bố cục hoạt động như sau:
FragmentContainerView
: vùng hiển thị nội dung của từng màn hình (Cần tạo trước 1 Fragment để hiển thị mạc định, hoặc sử dụng FrameLayout (Xem video dưới, hoặc bài viết về sử dụng Fragment)BottomNavigationView
: thanh điều hướng ở dưới cùng, chứa các mục điều hướng (item).
🗂️ Cấu trúc thư mục
📁 res/
┣ 📁 layout/
┃ ┣ activity_main.xml
┃ ┣ fragment_home.xml
┃ ┣ fragment_search.xml
┃ ┗ fragment_profile.xml
┣ 📁 menu/
┃ ┗ bottom_nav_menu.xml
1️⃣ Màn hình (Fragment) ví dụ – HomeFragment.java
Tham khảo Video, Bài viết về việc Tạo mới Fragment
Tạo tương tự
SearchFragment
vàProfileFragment
.
2️⃣ Tạo menu điều hướng – bottom_nav_menu.xml
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/nav_home"
android:icon="@drawable/ic_home"
android:title="Home" />
<item
android:id="@+id/nav_search"
android:icon="@drawable/ic_search"
android:title="Search" />
<item
android:id="@+id/nav_profile"
android:icon="@drawable/ic_person"
android:title="Profile" />
</menu>
3️⃣ Giao diện chính – activity_main.xml
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<!-- Vùng hiển thị Fragment -->
<androidx.fragment.app.FragmentContainerView
android:id="@+id/nav_host_fragment"
android:name="...HomeFragment"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toTopOf="@+id/bottom_nav"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent" />
<!-- Thanh điều hướng dưới -->
<com.google.android.material.bottomnavigation.BottomNavigationView
android:id="@+id/bottom_nav"
android:layout_width="0dp"
android:layout_height="wrap_content"
app:menu="@menu/bottom_nav_menu"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"/>
</androidx.constraintlayout.widget.ConstraintLayout>
4️⃣ MainActivity.java
public class MainActivity extends AppCompatActivity {
new NavigationBarView.OnItemSelectedListener() {
private BottomNavigationView bottomNav;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bottomNav = findViewById(R.id.bottom_nav);
// Load Fragment mặc định
if (savedInstanceState == null) {
loadFragment(new HomeFragment());
}
bottomNav.setOnItemSelectedListener(
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item){
Fragment selectedFragment;int itemId = item.getItemId();
if (itemId == R.id.nav_home) {
selectedFragment = new HomeFragment();
} else if (itemId == R.id.nav_search) {
selectedFragment = new SearchFragment();
} else if (itemId == R.id.nav_profile) {
selectedFragment = new ProfileFragment();
} else {
return false;
}
loadFragment(selectedFragment);
return true;
});
}
private void loadFragment(Fragment fragment) {
getSupportFragmentManager().beginTransaction()
.replace(R.id.nav_host_fragment, fragment)
.commit();
}
}
💡 Gợi ý nâng cao
- Sử dụng
Navigation Component
để quản lý Fragment mượt mà hơn. - Kết hợp
ViewBinding
hoặcJetpack Compose
để hiện đại hóa code. - Áp dụng
State Management
để giữ trạng thái mỗi Fragment.
✅ Tổng kết
Thành phần | Vai trò |
---|---|
BottomNavigationView | Điều hướng giữa các màn hình chính |
FragmentContainerView | Vùng hiển thị nội dung Fragment |
Fragment | Đại diện cho từng màn hình chức năng |