Another Solution
Simply save NavigationExtensions.kt as it is in java project and use it in java code.
Make a class NavigationExtensions
with the content of NavigationExtensions.kt file.
Need to enable project for Kotlin as well. Here are the changes I made to my App build.gridle -
Apply plugin apply plugin: 'kotlin-android'
and apply plugin: 'kotlin-android-extensions'
Implement Kotlin extension in my dependencies implementation 'androidx.core:core-ktx:1.3.1'
Added Kotlin jvmTarget 1.8 as
android {
compileSdkVersion 29
buildToolsVersion "29.0.2"
defaultConfig {
.........
}
compileOptions {
sourceCompatibility 1.8
targetCompatibility 1.8
}
kotlinOptions {
jvmTarget = "1.8"
}
buildTypes {
release {
.......
}
}
}
This is how to use the NavigationExtensions
in MainActivity.java
public class MainActivity extends AppCompatActivity {
private LiveData<NavController> currentNavController = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
BottomNavigationView bottomNavigationView = (BottomNavigationView) findViewById(R.id.bottom_nav_view);
List<Integer> navGraphList = new ArrayList<>();
navGraphList.add(R.navigation.dashboard_navigation);
navGraphList.add(R.navigation.find_navigation);
navGraphList.add(R.navigation.options_navigation);
LiveData<NavController> navControllerLiveData = new NavigationExtensions().setupWithNavController(
bottomNavigationView
, navGraphList
, getSupportFragmentManager()
, R.id.fragment_container, getIntent()
);
currentNavController = navControllerLiveData;
}
@Override
public boolean onNavigateUp() {
currentNavController.getValue().navigateUp();
return super.onNavigateUp();
}
}
NavigationExtension file location in project
.
Edit (Fix Configuration Changes)
To survive a configuration change (like screen rotation), you need to following changes under MainActivity.java
public class MainActivity extends AppCompatActivity {
private LiveData<NavController> currentNavController = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if(savedInstanceState==null){
setupBottomNavigation();
}
//else we need to wait for onRestoreInstanceState
}
@Override
protected void onRestoreInstanceState(@NonNull Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
setupBottomNavigation();
}
@Override
public boolean onNavigateUp() {
currentNavController.getValue().navigateUp();
return super.onNavigateUp();
}
private void setupBottomNavigation(){
BottomNavigationView bottomNavigationView = (BottomNavigationView) findViewById(R.id.bottom_nav_view);
List<Integer> navGraphList = new ArrayList<>();
navGraphList.add(R.navigation.dashboard_navigation);
navGraphList.add(R.navigation.find_navigation);
navGraphList.add(R.navigation.options_navigation);
LiveData<NavController> navControllerLiveData = new NavigationExtensions().setupWithNavController(
bottomNavigationView
, navGraphList
, getSupportFragmentManager()
, R.id.fragment_container, getIntent()
);
currentNavController = navControllerLiveData;
}
}
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/coordinatorLayout_main"
tools:context=".MainActivity">
<FrameLayout
android:id="@+id/fragment_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginBottom="?attr/actionBarSize" />
<com.google.android.material.bottomnavigation.BottomNavigationView
android:id="@+id/bottom_nav_view"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:layout_gravity="bottom"
android:background="@color/white"
app:labelVisibilityMode="auto"
app:itemTextColor="@drawable/bottom_nav_selector"
app:menu="@menu/bottom_nav_menu"/>
</androidx.coordinatorlayout.widget.CoordinatorLayout>
Happy Coding !