Использование Menu Item для ViewPager2
Всем привет! Создаю фрагменты в ViewPager2 и хочу сделать меню (BottomNavigationView), с помощью которого можно было бы перелистывать фрагменты.
Меню сейчас выглядит так:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/navMain"
android:icon="@drawable/custom_login_icon"
android:title="Первый фрагмент" />
<item
android:id="@+id/navMyTrips"
android:icon="@drawable/custom_email_icon"
android:title="Второй фрагмент" />
<item
android:id="@+id/navProfile"
android:icon="@drawable/custom_login_icon"
android:title="Третий фрагмент" />
</menu>
Если делаю перелистывание через TabLayout:
TabLayout tabLayout = findViewById(R.id.tabLayout);
TabLayoutMediator tabLayoutMediator = new TabLayoutMediator(tabLayout, viewPager,
new TabLayoutMediator.TabConfigurationStrategy()
{
@Override
public void onConfigureTab(@NonNull TabLayout.Tab tab, int position)
{
switch (position)
{
case 0:
tab.setText("1");
break;
case 1:
tab.setText("2");
break;
case 2:
tab.setText("3");
break;
}
}
});
tabLayoutMediator.attach();
Всё проходит корректно, но меня не устраивает внешний вид и другие возможности TabLayout.
BottomNavigationView подходит, но не получается реализовать перелистывание при нажатии на пункт меню.
С меню пытаюсь сделать так:
bottomNavigationView = findViewById(R.id.bottomNavigationView);
bottomNavigationView.setOnNavigationItemSelectedListener(
new BottomNavigationView.OnNavigationItemSelectedListener()
{
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item)
{
switch (item.getItemId())
{
case R.id.navMain:
replaceFragment(mainFragment);
return true;
case R.id.navMyTrips:
replaceFragment(userProfileFragment);
return true;
case R.id.navProfile:
replaceFragment(userTripsFragment);
return true;
default:
return false;
}
}
});
Метод для замены фрагмента:
private void replaceFragment(Fragment fragment)
{
FragmentTransaction t = getSupportFragmentManager().beginTransaction();
t.replace(R.id.viewPager, fragment).addToBackStack(null);
t.commit();
}
Android Studio ругается на ViewPager2:
java.lang.IllegalStateException: ViewPager2 does not support direct child views
И насколько я знаю, через FragmentTransaction может проходить замена фрагмента, но без анимации (как у TabLayout при переходе).
Вопрос в том, можно ли использовать Menu Item вместо TabLayout и организовать перелистывание фрагментов по нажатии на кнопку из Menu?
Ответы (2 шт):
Если нет обязательного условия привязывания к ViewPager, то советую изучить рекомендуемую в документации реализацию навигации через BottomNavigationView, которая позволяет избежать некоторых проблем, которые возникают в вариации с ViewPager.
Получилось сделать так:
bottomNavigationView.setOnNavigationItemSelectedListener(
new BottomNavigationView.OnNavigationItemSelectedListener()
{
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item)
{
switch (item.getItemId())
{
case R.id.navMain:
viewPager.setCurrentItem(0);
return true;
case R.id.navMyTrips:
viewPager.setCurrentItem(1);
return true;
case R.id.navProfile:
viewPager.setCurrentItem(2);
return true;
default:
return false;
}
}
});
Нашёл тут.
UPD: Для ViewPager2 (в статье используется ViewPager) и изменения иконки меню при перелистывании:
private MenuItem prevMenuItem;
viewPager.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback()
{
@Override
public void onPageSelected(int position)
{
super.onPageSelected(position);
if (prevMenuItem != null)
prevMenuItem.setChecked(false);
else
bottomNavigationView.getMenu().getItem(0).setChecked(false);
bottomNavigationView.getMenu().getItem(position).setChecked(true);
prevMenuItem = bottomNavigationView.getMenu().getItem(position);
}
});