Skip to content

Commit 0a37e8b

Browse files
Merge pull request #78 from MihaiCristianCondrea/codex/replace-bottomnavigationview-with-navigationbarview
feat: add navigation rail and update navigation components
2 parents 1aa20e2 + da863e8 commit 0a37e8b

File tree

3 files changed

+43
-18
lines changed

3 files changed

+43
-18
lines changed

app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/main/MainActivity.java

Lines changed: 22 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,8 @@
4141
import com.d4rk.androidtutorials.java.utils.EdgeToEdgeDelegate;
4242
import com.google.android.gms.ads.AdRequest;
4343
import com.google.android.gms.ads.MobileAds;
44-
import com.google.android.material.bottomnavigation.BottomNavigationView;
4544
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
45+
import com.google.android.material.navigation.NavigationBarView;
4646
import com.google.android.material.navigationrail.NavigationRailView;
4747
import com.google.android.material.snackbar.Snackbar;
4848
import com.google.android.play.core.appupdate.AppUpdateInfo;
@@ -185,18 +185,29 @@ private void launcherShortcuts() {
185185
ShortcutManagerCompat.pushDynamicShortcut(this, shortcut);
186186
}
187187

188+
private boolean shouldUseNavigationRail() {
189+
return getResources().getConfiguration().smallestScreenWidthDp >= 600;
190+
}
191+
188192
private void observeViewModel() {
189193
mainViewModel.getUiState().observe(this, uiState -> {
190194
if (uiState == null) {
191195
return;
192196
}
193197

198+
boolean useRail = shouldUseNavigationRail();
194199
EdgeToEdgeDelegate edgeToEdgeDelegate = new EdgeToEdgeDelegate(this);
195-
if (mBinding.navView instanceof BottomNavigationView) {
196-
197-
edgeToEdgeDelegate.applyEdgeToEdgeBottomBar(mBinding.container, mBinding.navView);
200+
NavigationBarView navBarView = (NavigationBarView) mBinding.navView;
201+
if (useRail) {
202+
mBinding.navRail.setVisibility(View.VISIBLE);
203+
navBarView.setVisibility(View.GONE);
204+
edgeToEdgeDelegate.applyEdgeToEdge(mBinding.container);
205+
} else {
206+
mBinding.navRail.setVisibility(View.GONE);
207+
navBarView.setVisibility(View.VISIBLE);
208+
edgeToEdgeDelegate.applyEdgeToEdgeBottomBar(mBinding.container, navBarView);
198209

199-
((BottomNavigationView) mBinding.navView).setLabelVisibilityMode(uiState.getBottomNavVisibility());
210+
navBarView.setLabelVisibilityMode(uiState.getBottomNavVisibility());
200211
if (mBinding.adView != null) {
201212
if (ConsentUtils.canShowAds(this)) {
202213
MobileAds.initialize(this);
@@ -206,8 +217,6 @@ private void observeViewModel() {
206217
mBinding.adView.setVisibility(View.GONE);
207218
}
208219
}
209-
} else {
210-
edgeToEdgeDelegate.applyEdgeToEdge(mBinding.container);
211220
}
212221

213222
NavHostFragment navHostFragment = (NavHostFragment)
@@ -225,15 +234,15 @@ private void observeViewModel() {
225234
.setPopExitAnim(R.anim.fragment_spring_pop_exit)
226235
.build();
227236

228-
if (mBinding.navView instanceof BottomNavigationView bottomNav) {
229-
NavigationUI.setupWithNavController(bottomNav, navController);
230-
bottomNav.setOnItemSelectedListener(item -> {
237+
if (useRail) {
238+
NavigationUI.setupWithNavController(mBinding.navRail, navController);
239+
mBinding.navRail.setOnItemSelectedListener(item -> {
231240
navController.navigate(item.getItemId(), null, springNavOptions);
232241
return true;
233242
});
234-
} else if (mBinding.navView instanceof NavigationRailView railView) {
235-
NavigationUI.setupWithNavController(railView, navController);
236-
railView.setOnItemSelectedListener(item -> {
243+
} else {
244+
NavigationUI.setupWithNavController(navBarView, navController);
245+
navBarView.setOnItemSelectedListener(item -> {
237246
navController.navigate(item.getItemId(), null, springNavOptions);
238247
return true;
239248
});

app/src/main/res/layout/activity_main.xml

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,24 @@
1919
app:title="@string/app_name" />
2020
</com.google.android.material.appbar.AppBarLayout>
2121

22+
<com.google.android.material.navigationrail.NavigationRailView
23+
android:id="@+id/nav_rail"
24+
android:layout_width="wrap_content"
25+
android:layout_height="0dp"
26+
android:visibility="gone"
27+
app:layout_constraintStart_toStartOf="parent"
28+
app:layout_constraintTop_toBottomOf="@id/app_bar_layout"
29+
app:layout_constraintBottom_toTopOf="@id/ad_view"
30+
app:menu="@menu/bottom_nav_menu" />
31+
2232
<androidx.fragment.app.FragmentContainerView
2333
android:id="@+id/nav_host_fragment_activity_main"
2434
android:name="androidx.navigation.fragment.NavHostFragment"
25-
android:layout_width="match_parent"
35+
android:layout_width="0dp"
2636
android:layout_height="0dp"
2737
app:defaultNavHost="true"
38+
app:layout_constraintStart_toEndOf="@id/nav_rail"
39+
app:layout_constraintEnd_toEndOf="parent"
2840
app:layout_constraintBottom_toTopOf="@id/ad_view"
2941
app:layout_constraintTop_toBottomOf="@id/app_bar_layout"
3042
app:navGraph="@navigation/mobile_navigation" />
@@ -37,10 +49,11 @@
3749
app:adUnitId="@string/ad_banner_unit_id"
3850
app:layout_constraintBottom_toTopOf="@id/nav_view" />
3951

40-
<com.google.android.material.bottomnavigation.BottomNavigationView
52+
<com.google.android.material.navigation.NavigationBarView
4153
android:id="@+id/nav_view"
4254
android:layout_width="match_parent"
4355
android:layout_height="wrap_content"
56+
app:labelVisibilityMode="labeled"
4457
app:layout_constraintBottom_toBottomOf="parent"
4558
app:menu="@menu/bottom_nav_menu" />
4659
</androidx.constraintlayout.widget.ConstraintLayout>

app/src/main/res/menu/bottom_nav_menu.xml

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,16 @@
33
<item
44
android:id="@+id/navigation_home"
55
android:icon="@drawable/nav_news"
6-
android:title="@string/home" />
6+
android:title="@string/home"
7+
android:contentDescription="@string/home" />
78
<item
89
android:id="@+id/navigation_android_studio"
910
android:icon="@drawable/ic_android"
10-
android:title="@string/android_studio" />
11+
android:title="@string/android_studio"
12+
android:contentDescription="@string/android_studio" />
1113
<item
1214
android:id="@+id/navigation_about"
1315
android:icon="@drawable/nav_about"
14-
android:title="@string/about" />
16+
android:title="@string/about"
17+
android:contentDescription="@string/about" />
1518
</menu>

0 commit comments

Comments
 (0)