From d97ad3724c25d5e4445c56a4cf61e788c872699d Mon Sep 17 00:00:00 2001 From: "arthur.valin" Date: Fri, 31 Mar 2023 23:27:13 +0200 Subject: [PATCH] Navigation with NavGraph --- app/build.gradle | 3 ++ .../geocaching/model/RoadTrip.kt | 1 + .../recyclerview/RoadTripAdapter.kt | 7 +-- .../recyclerview/RoadTripViewHolder.kt | 10 ++-- .../geocaching/ui/activity/MainWindow.kt | 35 +++++++------- .../ui/fragment/RoadTripFragment.kt | 8 ++-- .../geocaching/ui/fragment/RoadtripDetail.kt | 48 +++++++++++++++++++ app/src/main/res/layout-land/main_window.xml | 19 ++------ app/src/main/res/layout/main_window.xml | 19 ++------ app/src/main/res/layout/roadtrip_detail.xml | 15 ++++++ app/src/main/res/navigation/navgraph.xml | 26 ++++++++++ 11 files changed, 131 insertions(+), 60 deletions(-) create mode 100644 app/src/main/java/uca/baptistearthur/geocaching/ui/fragment/RoadtripDetail.kt create mode 100644 app/src/main/res/layout/roadtrip_detail.xml create mode 100644 app/src/main/res/navigation/navgraph.xml diff --git a/app/build.gradle b/app/build.gradle index 92affa2..80dfa3f 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -38,6 +38,9 @@ dependencies { implementation 'androidx.core:core-ktx:1.9.0' implementation 'androidx.appcompat:appcompat:1.6.1' implementation 'com.google.android.material:material:1.8.0' + implementation 'androidx.constraintlayout:constraintlayout:2.1.4' + implementation 'androidx.navigation:navigation-fragment-ktx:2.5.3' + implementation 'androidx.navigation:navigation-ui-ktx:2.5.3' testImplementation 'junit:junit:4.13.2' androidTestImplementation 'androidx.test.ext:junit:1.1.5' androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1' diff --git a/app/src/main/java/uca/baptistearthur/geocaching/model/RoadTrip.kt b/app/src/main/java/uca/baptistearthur/geocaching/model/RoadTrip.kt index 4352b37..7f8cc10 100644 --- a/app/src/main/java/uca/baptistearthur/geocaching/model/RoadTrip.kt +++ b/app/src/main/java/uca/baptistearthur/geocaching/model/RoadTrip.kt @@ -11,4 +11,5 @@ class RoadTrip( fun addPlaceToRoadTripList(place: Place) = places.add(place) fun addPlaceToRoadTripList(latitude: Double, longitude: Double) = places.add(Place(latitude, longitude)) + } \ No newline at end of file diff --git a/app/src/main/java/uca/baptistearthur/geocaching/recyclerview/RoadTripAdapter.kt b/app/src/main/java/uca/baptistearthur/geocaching/recyclerview/RoadTripAdapter.kt index 17796f6..15a3d96 100644 --- a/app/src/main/java/uca/baptistearthur/geocaching/recyclerview/RoadTripAdapter.kt +++ b/app/src/main/java/uca/baptistearthur/geocaching/recyclerview/RoadTripAdapter.kt @@ -3,18 +3,19 @@ package uca.baptistearthur.geocaching.recyclerview import android.annotation.SuppressLint import android.view.LayoutInflater import android.view.ViewGroup +import androidx.navigation.NavController import androidx.recyclerview.widget.RecyclerView import uca.baptistearthur.geocaching.R import uca.baptistearthur.geocaching.model.RoadTrip -class RoadTripAdapter (val voyages: List) : RecyclerView.Adapter(){ +class RoadTripAdapter(val voyages: List, val navController: NavController) : RecyclerView.Adapter(){ override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RoadTripViewHolder { - return RoadTripViewHolder(LayoutInflater.from(parent.context).inflate(R.layout.cell_one_roadtrip, parent, false)) + return RoadTripViewHolder(LayoutInflater.from(parent.context).inflate(R.layout.cell_one_roadtrip, parent, false), navController) } - @SuppressLint("SetTextI18n") + @SuppressLint("SetTextI18n", "ClickableViewAccessibility") override fun onBindViewHolder(holder: RoadTripViewHolder, position: Int) { holder.roadTripAccessButton.text = "> " + voyages[position].name } diff --git a/app/src/main/java/uca/baptistearthur/geocaching/recyclerview/RoadTripViewHolder.kt b/app/src/main/java/uca/baptistearthur/geocaching/recyclerview/RoadTripViewHolder.kt index a6bd2b8..8d4c656 100644 --- a/app/src/main/java/uca/baptistearthur/geocaching/recyclerview/RoadTripViewHolder.kt +++ b/app/src/main/java/uca/baptistearthur/geocaching/recyclerview/RoadTripViewHolder.kt @@ -3,14 +3,12 @@ package uca.baptistearthur.geocaching.recyclerview import android.util.Log import android.view.View import android.widget.Button +import androidx.navigation.NavController import androidx.recyclerview.widget.RecyclerView.ViewHolder import uca.baptistearthur.geocaching.R -import uca.baptistearthur.geocaching.model.RoadTrip -import uca.baptistearthur.geocaching.services.FragmentService -import uca.baptistearthur.geocaching.ui.activity.MainWindow -import uca.baptistearthur.geocaching.ui.fragment.DetailledRoadTripFragment -class RoadTripViewHolder(val cellule: View): ViewHolder(cellule) { + +class RoadTripViewHolder(val cellule: View, val navController: NavController): ViewHolder(cellule) { var roadTripAccessButton: Button = cellule.findViewById(R.id.btnGetRoadTripsInfo) @@ -18,7 +16,7 @@ class RoadTripViewHolder(val cellule: View): ViewHolder(cellule) { roadTripAccessButton.setOnClickListener{ val roadTripName = roadTripAccessButton.text.substring(3) Log.d("RoadTripViewHolder", "RoadTripViewHolder clicked: ${roadTripName}") - + navController.navigate(R.id.action_roadTripFragment_to_roadtripDetail) // val roadTrip: RoadTrip = Find roadtrip by name here // FragmentService().loadFragment(DetailledRoadTripFragment(roadTrip), (cellule.context as MainWindow).supportFragmentManager) } diff --git a/app/src/main/java/uca/baptistearthur/geocaching/ui/activity/MainWindow.kt b/app/src/main/java/uca/baptistearthur/geocaching/ui/activity/MainWindow.kt index b38938c..73c4971 100644 --- a/app/src/main/java/uca/baptistearthur/geocaching/ui/activity/MainWindow.kt +++ b/app/src/main/java/uca/baptistearthur/geocaching/ui/activity/MainWindow.kt @@ -3,12 +3,14 @@ package uca.baptistearthur.geocaching.ui.activity import android.annotation.SuppressLint import android.os.Bundle import androidx.appcompat.app.AppCompatActivity +import androidx.navigation.findNavController +import androidx.navigation.ui.NavigationUI +import androidx.navigation.ui.setupWithNavController import com.google.android.material.bottomnavigation.BottomNavigationView import uca.baptistearthur.geocaching.R import uca.baptistearthur.geocaching.services.FragmentService import uca.baptistearthur.geocaching.ui.fragment.Map -import uca.baptistearthur.geocaching.ui.fragment.RoadTripFragment class MainWindow: AppCompatActivity() { @SuppressLint("MissingInflatedId") @@ -19,25 +21,20 @@ class MainWindow: AppCompatActivity() { super.onCreate(savedInstanceState) setContentView(R.layout.main_window) - val fragmentService = FragmentService() - -// Bottom menu - fragmentService.loadFragment(Map(), supportFragmentManager) - val navigation = findViewById(R.id.bottom_navigation) - navigation.selectedItemId= R.id.map - navigation.setOnItemSelectedListener { - when (it.itemId) { - R.id.map -> { - fragmentService.loadFragment(map, supportFragmentManager) - true - } - R.id.roadTrip -> { - fragmentService.loadFragment(RoadTripFragment(), supportFragmentManager) - true - } - else -> false - } + val bottomNavigation = findViewById(R.id.bottom_navigation) + val navController = findNavController(R.id.fragment_container) + bottomNavigation.setupWithNavController(navController) + bottomNavigation.setOnItemReselectedListener { item -> + val reselectedDestinationId = item.itemId + navController.popBackStack(reselectedDestinationId, inclusive = false) } + + bottomNavigation.setOnItemSelectedListener { item -> + NavigationUI.onNavDestinationSelected(item, navController) + true + } + + } } \ No newline at end of file diff --git a/app/src/main/java/uca/baptistearthur/geocaching/ui/fragment/RoadTripFragment.kt b/app/src/main/java/uca/baptistearthur/geocaching/ui/fragment/RoadTripFragment.kt index a3870a6..75dd307 100644 --- a/app/src/main/java/uca/baptistearthur/geocaching/ui/fragment/RoadTripFragment.kt +++ b/app/src/main/java/uca/baptistearthur/geocaching/ui/fragment/RoadTripFragment.kt @@ -2,21 +2,19 @@ package uca.baptistearthur.geocaching.ui.fragment import android.annotation.SuppressLint import android.os.Bundle -import android.util.Log import androidx.fragment.app.Fragment import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.Button import android.widget.EditText +import androidx.navigation.fragment.findNavController import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import uca.baptistearthur.geocaching.R import uca.baptistearthur.geocaching.data.Stub import uca.baptistearthur.geocaching.model.RoadTrip import uca.baptistearthur.geocaching.recyclerview.RoadTripAdapter -import uca.baptistearthur.geocaching.services.FragmentService -import uca.baptistearthur.geocaching.ui.activity.MainWindow import java.util.* // TODO: Rename parameter arguments, choose names that match @@ -51,8 +49,10 @@ class RoadTripFragment : Fragment() { override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { val view = inflater.inflate(R.layout.fragment_roadtrip, container, false) + + roadTripRecyclerView = view?.findViewById(R.id.recyclerViewRoadTripList) - roadTripRecyclerView?.adapter = RoadTripAdapter(model) + roadTripRecyclerView?.adapter = RoadTripAdapter(model, findNavController()) roadTripRecyclerView?.layoutManager = LinearLayoutManager(context) editTextRoadTripName = view?.findViewById(R.id.editTextRoadTripName) diff --git a/app/src/main/java/uca/baptistearthur/geocaching/ui/fragment/RoadtripDetail.kt b/app/src/main/java/uca/baptistearthur/geocaching/ui/fragment/RoadtripDetail.kt new file mode 100644 index 0000000..b812524 --- /dev/null +++ b/app/src/main/java/uca/baptistearthur/geocaching/ui/fragment/RoadtripDetail.kt @@ -0,0 +1,48 @@ +package uca.baptistearthur.geocaching.ui.fragment + +import android.content.Context +import android.content.pm.PackageManager +import android.location.LocationManager +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.core.content.ContextCompat +import androidx.fragment.app.Fragment +import org.osmdroid.config.Configuration +import org.osmdroid.util.GeoPoint +import org.osmdroid.views.MapView +import org.osmdroid.views.overlay.ScaleBarOverlay +import android.Manifest.permission.ACCESS_FINE_LOCATION +import android.location.Location +import android.location.LocationListener +import android.util.Log +import android.widget.ProgressBar +import androidx.activity.result.contract.ActivityResultContracts +import org.osmdroid.bonuspack.routing.OSRMRoadManager +import org.osmdroid.bonuspack.routing.RoadManager +import org.osmdroid.config.IConfigurationProvider +import org.osmdroid.library.BuildConfig +import org.osmdroid.tileprovider.tilesource.TileSourceFactory +import org.osmdroid.tileprovider.util.StorageUtils.getStorage +import org.osmdroid.views.overlay.compass.CompassOverlay +import org.osmdroid.views.overlay.compass.InternalCompassOrientationProvider +import org.osmdroid.views.overlay.mylocation.GpsMyLocationProvider +import org.osmdroid.views.overlay.mylocation.MyLocationNewOverlay +import uca.baptistearthur.geocaching.R +import uca.baptistearthur.geocaching.ui.overlay.AddMarkerOverlay +import uca.baptistearthur.geocaching.ui.overlay.RecenterOverlay + +class RoadtripDetail : Fragment() { + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + Log.d("GeoMap", "MAP ON CREATE VIEW") + // Inflate the layout for this fragment + val view = inflater.inflate(R.layout.roadtrip_detail, container, false) + return view + } + +} \ No newline at end of file diff --git a/app/src/main/res/layout-land/main_window.xml b/app/src/main/res/layout-land/main_window.xml index a82a89e..8320c0f 100644 --- a/app/src/main/res/layout-land/main_window.xml +++ b/app/src/main/res/layout-land/main_window.xml @@ -6,23 +6,14 @@ android:layout_height="match_parent" android:orientation="vertical"> - - - + android:layout_weight="8" + app:defaultNavHost="true" + app:navGraph="@navigation/navgraph" /> - - - + android:layout_weight="8" + app:defaultNavHost="true" + app:navGraph="@navigation/navgraph" /> + + + + + \ No newline at end of file diff --git a/app/src/main/res/navigation/navgraph.xml b/app/src/main/res/navigation/navgraph.xml new file mode 100644 index 0000000..1094c5c --- /dev/null +++ b/app/src/main/res/navigation/navgraph.xml @@ -0,0 +1,26 @@ + + + + + + + + \ No newline at end of file