Прежде всего, я бы порекомендовал отказаться от старого и неприятного TabLayout и переключиться на новый ViewPager2 вместо старого ViewPager. В пользовательском интерфейсе вместо TabLayout создайте пользовательские 3 кнопки внутри LinearLayout или ConstraintLayout.
Теперь, в вашем случае, я бы использовал ViewPager2 с FragmentStateAdapter, потому что он был разработан, чтобы хорошо работать с Fragments, и вы можете создать столько, сколько вам нужно. У меня даже был проект, в котором у меня было 80 фрагментов, созданных с помощью FragmentStateAdapter.
Во-вторых, вам нужен конструктор newInstance для ваших фрагментов в качестве безопасного шаблона. Если вы не используете это, вы можете получить некоторые исключения позже в своем приложении, но кроме этого вы также будете использовать функцию для передачи ваших данных в каждый фрагмент.
Вот как я это делаю:
class FragmentStateAdapter(
fragmentManager: FragmentManager,
lifecycle: Lifecycle,
car: Car
) : FragmentStateAdapter(fragmentManager, lifecycle) {
override fun getItemCount(): Int = 3
override fun createFragment(position: Int): Fragment {
return when (position) {
0 -> InfoFragment.newInstance(car)
1 -> AboutFragment.newInstance(car)
else -> LocationFragment.newInstance(car)
}
}
По сути, я передаю ваш автомобильный объект (предположим, что это единственный объект данных, который должен достичь фрагментов) в качестве параметра FragmentStateAdapter, блокируя itemCount на 3, потому что у вас есть 3 фрагмента, и затем возвращая экземпляр каждого фрагмента в методе переопределения createFragment (). Теперь создаем функции экземпляра:
class InfoFragment : Fragment() {
companion object {
private const val BUNDLE_KEY = "car_object"
fun newInstance(car: Car) = InfoFragment().apply {
arguments = Bundle().apply {
putParcelable<Car>(BUNDLE_KEY, car)
}
}
}
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_car_details_info, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val car = arguments.getParcelable<Car>(BUNDLE_KEY)
}
}
И вот как вы помещаете свой автомобильный объект в свои фрагменты. По сути, в функции newInstance () вы создаете новый экземпляр вашего фрагмента и передаете ему данные через связку. Внутри вашей деятельности вы инициализируете свой адаптер следующим образом:
val adapter = FragmentStateAdapter(supportFragmentManager, lifecycle, car)
Теперь, о замене вида вкладки, сделайте пользовательский LinearLayout так:
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:weightSum="1.0">
<Button
android:id="@+id/button1"
style="@style/Widget.AppCompat.Button.Borderless"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="0.333"
android:minWidth="0dp"
android:minHeight="0dp"
android:paddingTop="14dp"
android:paddingBottom="14dp"
android:text="Details"
android:textAllCaps="true" />
<Button
android:id="@+id/button2"
style="@style/Widget.AppCompat.Button.Borderless"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="0.333"
android:minWidth="0dp"
android:minHeight="0dp"
android:paddingTop="14dp"
android:paddingBottom="14dp"
android:text="About"
android:textAllCaps="true" />
<Button
android:id="@+id/button3"
style="@style/Widget.AppCompat.Button.Borderless"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="0.333"
android:minWidth="0dp"
android:minHeight="0dp"
android:paddingTop="14dp"
android:paddingBottom="14dp"
android:text="Locations"
android:textAllCaps="true" />
, а затем установите исходный цвет кнопок после вашего собственного предпочтения с помощью android:background="#COLOR_OR_CHOICE"
. В действии добавьте три кнопки в ArrayList кнопок и используйте этот слушатель на viewPager2:
viewPager2.registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() {
// here, get the position of the viewPager2 and change the color of the current button using the arrayList index that matches the viewPager2 position.
})
Затем в каждом прослушивателе щелчка каждой кнопки выполните viewPager2.setCurrentItem (position_you_want_to_go_to, true), где true - это проверка для плавной прокрутки.
Надеюсь, это поможет.