From 19b29781045dcaa6316080c63d4c5e4002290120 Mon Sep 17 00:00:00 2001 From: Mihai-Cristian Condrea Date: Mon, 1 Sep 2025 00:19:11 +0300 Subject: [PATCH 1/2] feat: add navigation rail and update navigation components --- .../java/ui/screens/main/MainActivity.java | 32 ++++++++++++------- app/src/main/res/layout/activity_main.xml | 17 ++++++++-- app/src/main/res/menu/bottom_nav_menu.xml | 9 ++++-- 3 files changed, 41 insertions(+), 17 deletions(-) diff --git a/app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/main/MainActivity.java b/app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/main/MainActivity.java index 3308efb4..0177c5de 100644 --- a/app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/main/MainActivity.java +++ b/app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/main/MainActivity.java @@ -41,8 +41,8 @@ import com.d4rk.androidtutorials.java.utils.EdgeToEdgeDelegate; import com.google.android.gms.ads.AdRequest; import com.google.android.gms.ads.MobileAds; -import com.google.android.material.bottomnavigation.BottomNavigationView; import com.google.android.material.dialog.MaterialAlertDialogBuilder; +import com.google.android.material.navigation.NavigationBarView; import com.google.android.material.navigationrail.NavigationRailView; import com.google.android.material.snackbar.Snackbar; import com.google.android.play.core.appupdate.AppUpdateInfo; @@ -185,18 +185,28 @@ private void launcherShortcuts() { ShortcutManagerCompat.pushDynamicShortcut(this, shortcut); } + private boolean shouldUseNavigationRail() { + return getResources().getConfiguration().smallestScreenWidthDp >= 600; + } + private void observeViewModel() { mainViewModel.getUiState().observe(this, uiState -> { if (uiState == null) { return; } + boolean useRail = shouldUseNavigationRail(); EdgeToEdgeDelegate edgeToEdgeDelegate = new EdgeToEdgeDelegate(this); - if (mBinding.navView instanceof BottomNavigationView) { - + if (useRail) { + mBinding.navRail.setVisibility(View.VISIBLE); + mBinding.navView.setVisibility(View.GONE); + edgeToEdgeDelegate.applyEdgeToEdge(mBinding.container); + } else { + mBinding.navRail.setVisibility(View.GONE); + mBinding.navView.setVisibility(View.VISIBLE); edgeToEdgeDelegate.applyEdgeToEdgeBottomBar(mBinding.container, mBinding.navView); - ((BottomNavigationView) mBinding.navView).setLabelVisibilityMode(uiState.getBottomNavVisibility()); + mBinding.navView.setLabelVisibilityMode(uiState.getBottomNavVisibility()); if (mBinding.adView != null) { if (ConsentUtils.canShowAds(this)) { MobileAds.initialize(this); @@ -206,8 +216,6 @@ private void observeViewModel() { mBinding.adView.setVisibility(View.GONE); } } - } else { - edgeToEdgeDelegate.applyEdgeToEdge(mBinding.container); } NavHostFragment navHostFragment = (NavHostFragment) @@ -225,15 +233,15 @@ private void observeViewModel() { .setPopExitAnim(R.anim.fragment_spring_pop_exit) .build(); - if (mBinding.navView instanceof BottomNavigationView bottomNav) { - NavigationUI.setupWithNavController(bottomNav, navController); - bottomNav.setOnItemSelectedListener(item -> { + if (useRail) { + NavigationUI.setupWithNavController(mBinding.navRail, navController); + mBinding.navRail.setOnItemSelectedListener(item -> { navController.navigate(item.getItemId(), null, springNavOptions); return true; }); - } else if (mBinding.navView instanceof NavigationRailView railView) { - NavigationUI.setupWithNavController(railView, navController); - railView.setOnItemSelectedListener(item -> { + } else { + NavigationUI.setupWithNavController(mBinding.navView, navController); + mBinding.navView.setOnItemSelectedListener(item -> { navController.navigate(item.getItemId(), null, springNavOptions); return true; }); diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 7dd30641..b8e38be0 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -19,12 +19,24 @@ app:title="@string/app_name" /> + + @@ -37,10 +49,11 @@ app:adUnitId="@string/ad_banner_unit_id" app:layout_constraintBottom_toTopOf="@id/nav_view" /> - \ No newline at end of file diff --git a/app/src/main/res/menu/bottom_nav_menu.xml b/app/src/main/res/menu/bottom_nav_menu.xml index 4ff7592a..1125fbb3 100644 --- a/app/src/main/res/menu/bottom_nav_menu.xml +++ b/app/src/main/res/menu/bottom_nav_menu.xml @@ -3,13 +3,16 @@ + android:title="@string/home" + android:contentDescription="@string/home" /> + android:title="@string/android_studio" + android:contentDescription="@string/android_studio" /> + android:title="@string/about" + android:contentDescription="@string/about" /> \ No newline at end of file From da863e86ace504bd40df58d0e13b116715fd59de Mon Sep 17 00:00:00 2001 From: Mihai-Cristian Condrea Date: Mon, 1 Sep 2025 00:28:42 +0300 Subject: [PATCH 2/2] fix: cast NavigationBarView in MainActivity --- .../java/ui/screens/main/MainActivity.java | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/main/MainActivity.java b/app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/main/MainActivity.java index 0177c5de..a2abf5d6 100644 --- a/app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/main/MainActivity.java +++ b/app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/main/MainActivity.java @@ -197,16 +197,17 @@ private void observeViewModel() { boolean useRail = shouldUseNavigationRail(); EdgeToEdgeDelegate edgeToEdgeDelegate = new EdgeToEdgeDelegate(this); + NavigationBarView navBarView = (NavigationBarView) mBinding.navView; if (useRail) { mBinding.navRail.setVisibility(View.VISIBLE); - mBinding.navView.setVisibility(View.GONE); + navBarView.setVisibility(View.GONE); edgeToEdgeDelegate.applyEdgeToEdge(mBinding.container); } else { mBinding.navRail.setVisibility(View.GONE); - mBinding.navView.setVisibility(View.VISIBLE); - edgeToEdgeDelegate.applyEdgeToEdgeBottomBar(mBinding.container, mBinding.navView); + navBarView.setVisibility(View.VISIBLE); + edgeToEdgeDelegate.applyEdgeToEdgeBottomBar(mBinding.container, navBarView); - mBinding.navView.setLabelVisibilityMode(uiState.getBottomNavVisibility()); + navBarView.setLabelVisibilityMode(uiState.getBottomNavVisibility()); if (mBinding.adView != null) { if (ConsentUtils.canShowAds(this)) { MobileAds.initialize(this); @@ -240,8 +241,8 @@ private void observeViewModel() { return true; }); } else { - NavigationUI.setupWithNavController(mBinding.navView, navController); - mBinding.navView.setOnItemSelectedListener(item -> { + NavigationUI.setupWithNavController(navBarView, navController); + navBarView.setOnItemSelectedListener(item -> { navController.navigate(item.getItemId(), null, springNavOptions); return true; });