Bottom Navigation View trong Android (Java)

🔍 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ự SearchFragmentProfileFragment.


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 {

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(
new NavigationBarView.OnItemSelectedListener() {
@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ặc Jetpack 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ầnVai trò
BottomNavigationViewĐiều hướng giữa các màn hình chính
FragmentContainerViewVùng hiển thị nội dung Fragment
FragmentĐại diện cho từng màn hình chức năng

Comments are closed.