From f9570806f98030c43d9677fa795cff0dfdd41c24 Mon Sep 17 00:00:00 2001 From: Christopher Date: Fri, 31 May 2024 20:16:39 +0200 Subject: [PATCH] added a ViewPager2 to switch between page fragments added a PagerAdapter (FragmentStateAdapter) to provide the fragments for the ViewPager2 added the necessary fragments added the necessary listeners for the TabLayout and the ViewPager2 --- .../adapter/DashboardFragmentPagerAdapter.kt | 20 +++++++ .../store/ui/dashboard/DashboardFragment.kt | 45 +++++++++++--- .../tabfragment/ShoppinglistFragment.kt | 60 +++++++++++++++++++ .../tabfragment/UnderstockFragment.kt | 60 +++++++++++++++++++ .../main/res/layout/fragment_dashboard.xml | 12 ++++ .../main/res/layout/fragment_shoppinglist.xml | 19 ++++++ .../main/res/layout/fragment_understock.xml | 19 ++++++ 7 files changed, 226 insertions(+), 9 deletions(-) create mode 100644 app/src/main/java/de/chrissthecoder/store/adapter/DashboardFragmentPagerAdapter.kt create mode 100644 app/src/main/java/de/chrissthecoder/store/ui/dashboard/tabfragment/ShoppinglistFragment.kt create mode 100644 app/src/main/java/de/chrissthecoder/store/ui/dashboard/tabfragment/UnderstockFragment.kt create mode 100644 app/src/main/res/layout/fragment_shoppinglist.xml create mode 100644 app/src/main/res/layout/fragment_understock.xml diff --git a/app/src/main/java/de/chrissthecoder/store/adapter/DashboardFragmentPagerAdapter.kt b/app/src/main/java/de/chrissthecoder/store/adapter/DashboardFragmentPagerAdapter.kt new file mode 100644 index 0000000..69a65ee --- /dev/null +++ b/app/src/main/java/de/chrissthecoder/store/adapter/DashboardFragmentPagerAdapter.kt @@ -0,0 +1,20 @@ +package de.chrissthecoder.store.adapter + +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager +import androidx.lifecycle.Lifecycle +import androidx.viewpager2.adapter.FragmentStateAdapter +import de.chrissthecoder.store.ui.dashboard.tabfragment.ShoppinglistFragment +import de.chrissthecoder.store.ui.dashboard.tabfragment.UnderstockFragment + +class DashboardFragmentPagerAdapter(manager: FragmentManager, lifecycle: Lifecycle) : FragmentStateAdapter(manager, lifecycle) { + + override fun getItemCount() : Int { + return 2 + } + + override fun createFragment(position: Int) : Fragment { + return if(position == 0) { ShoppinglistFragment() } + else { UnderstockFragment() } + } +} \ No newline at end of file diff --git a/app/src/main/java/de/chrissthecoder/store/ui/dashboard/DashboardFragment.kt b/app/src/main/java/de/chrissthecoder/store/ui/dashboard/DashboardFragment.kt index 276ccf3..f908fb1 100644 --- a/app/src/main/java/de/chrissthecoder/store/ui/dashboard/DashboardFragment.kt +++ b/app/src/main/java/de/chrissthecoder/store/ui/dashboard/DashboardFragment.kt @@ -6,26 +6,53 @@ import android.view.View import android.view.ViewGroup import androidx.fragment.app.Fragment import androidx.lifecycle.ViewModelProvider +import androidx.viewpager2.widget.ViewPager2 +import androidx.viewpager2.widget.ViewPager2.OnPageChangeCallback +import com.google.android.material.tabs.TabLayout +import com.google.android.material.tabs.TabLayout.OnTabSelectedListener +import de.chrissthecoder.store.adapter.DashboardFragmentPagerAdapter import de.chrissthecoder.store.databinding.FragmentDashboardBinding class DashboardFragment : Fragment() { private var _binding: FragmentDashboardBinding? = null - - // This property is only valid between onCreateView and - // onDestroyView. private val binding get() = _binding!! - override fun onCreateView( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? - ): View { - val dashboardViewModel = ViewModelProvider(this).get(DashboardViewModel::class.java) + private lateinit var tabLayout: TabLayout + private lateinit var viewPager: ViewPager2 + private lateinit var adapter: DashboardFragmentPagerAdapter + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?) : View { _binding = FragmentDashboardBinding.inflate(inflater, container, false) val root: View = binding.root + val dashboardViewModel = ViewModelProvider(this).get(DashboardViewModel::class.java) + + tabLayout = binding.tabLayout + viewPager = binding.viewPager + adapter = DashboardFragmentPagerAdapter(parentFragmentManager, lifecycle) + viewPager.adapter = adapter + + tabLayout.addOnTabSelectedListener(object : OnTabSelectedListener { + override fun onTabSelected(tab: TabLayout.Tab?) { + if (tab != null) { + viewPager.currentItem = tab.position + } + } + + override fun onTabUnselected(tab: TabLayout.Tab?) { } + override fun onTabReselected(tab: TabLayout.Tab?) { } + }) + + viewPager.registerOnPageChangeCallback(object : OnPageChangeCallback() { + override fun onPageSelected(position: Int) { + super.onPageSelected(position) + tabLayout.selectTab(tabLayout.getTabAt(position)) + } + }) + + + return root } diff --git a/app/src/main/java/de/chrissthecoder/store/ui/dashboard/tabfragment/ShoppinglistFragment.kt b/app/src/main/java/de/chrissthecoder/store/ui/dashboard/tabfragment/ShoppinglistFragment.kt new file mode 100644 index 0000000..b015a20 --- /dev/null +++ b/app/src/main/java/de/chrissthecoder/store/ui/dashboard/tabfragment/ShoppinglistFragment.kt @@ -0,0 +1,60 @@ +package de.chrissthecoder.store.ui.dashboard.tabfragment + +import android.os.Bundle +import androidx.fragment.app.Fragment +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import de.chrissthecoder.store.R + +// TODO: Rename parameter arguments, choose names that match +// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER +private const val ARG_PARAM1 = "param1" +private const val ARG_PARAM2 = "param2" + +/** + * A simple [Fragment] subclass. + * Use the [ShoppinglistFragment.newInstance] factory method to + * create an instance of this fragment. + */ +class ShoppinglistFragment : Fragment() { + // TODO: Rename and change types of parameters + private var param1: String? = null + private var param2: String? = null + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + arguments?.let { + param1 = it.getString(ARG_PARAM1) + param2 = it.getString(ARG_PARAM2) + } + } + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + // Inflate the layout for this fragment + return inflater.inflate(R.layout.fragment_shoppinglist, container, false) + } + + companion object { + /** + * Use this factory method to create a new instance of + * this fragment using the provided parameters. + * + * @param param1 Parameter 1. + * @param param2 Parameter 2. + * @return A new instance of fragment ShoppinglistFragment. + */ + // TODO: Rename and change types and number of parameters + @JvmStatic + fun newInstance(param1: String, param2: String) = + ShoppinglistFragment().apply { + arguments = Bundle().apply { + putString(ARG_PARAM1, param1) + putString(ARG_PARAM2, param2) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/de/chrissthecoder/store/ui/dashboard/tabfragment/UnderstockFragment.kt b/app/src/main/java/de/chrissthecoder/store/ui/dashboard/tabfragment/UnderstockFragment.kt new file mode 100644 index 0000000..890a6df --- /dev/null +++ b/app/src/main/java/de/chrissthecoder/store/ui/dashboard/tabfragment/UnderstockFragment.kt @@ -0,0 +1,60 @@ +package de.chrissthecoder.store.ui.dashboard.tabfragment + +import android.os.Bundle +import androidx.fragment.app.Fragment +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import de.chrissthecoder.store.R + +// TODO: Rename parameter arguments, choose names that match +// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER +private const val ARG_PARAM1 = "param1" +private const val ARG_PARAM2 = "param2" + +/** + * A simple [Fragment] subclass. + * Use the [UnderstockFragment.newInstance] factory method to + * create an instance of this fragment. + */ +class UnderstockFragment : Fragment() { + // TODO: Rename and change types of parameters + private var param1: String? = null + private var param2: String? = null + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + arguments?.let { + param1 = it.getString(ARG_PARAM1) + param2 = it.getString(ARG_PARAM2) + } + } + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + // Inflate the layout for this fragment + return inflater.inflate(R.layout.fragment_understock, container, false) + } + + companion object { + /** + * Use this factory method to create a new instance of + * this fragment using the provided parameters. + * + * @param param1 Parameter 1. + * @param param2 Parameter 2. + * @return A new instance of fragment UnderstockFragment. + */ + // TODO: Rename and change types and number of parameters + @JvmStatic + fun newInstance(param1: String, param2: String) = + UnderstockFragment().apply { + arguments = Bundle().apply { + putString(ARG_PARAM1, param1) + putString(ARG_PARAM2, param2) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_dashboard.xml b/app/src/main/res/layout/fragment_dashboard.xml index 3f4fb26..cfd0619 100644 --- a/app/src/main/res/layout/fragment_dashboard.xml +++ b/app/src/main/res/layout/fragment_dashboard.xml @@ -7,6 +7,7 @@ tools:context=".ui.dashboard.DashboardFragment"> + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_shoppinglist.xml b/app/src/main/res/layout/fragment_shoppinglist.xml new file mode 100644 index 0000000..b45de0f --- /dev/null +++ b/app/src/main/res/layout/fragment_shoppinglist.xml @@ -0,0 +1,19 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_understock.xml b/app/src/main/res/layout/fragment_understock.xml new file mode 100644 index 0000000..d8c42d3 --- /dev/null +++ b/app/src/main/res/layout/fragment_understock.xml @@ -0,0 +1,19 @@ + + + + + + \ No newline at end of file