Лучший подход - использовать Fragment
s для обоих.Если вы используете Activity
для каждого экрана, доступного из нижней части навигации, вам нужно будет поставить BottomNavigationView
в каждом и дублировать много кода, а также настроить переходы между этими действиями.
Действиядолжны рассматриваться как точки входа вашего приложения: при нажатии на значок приложения в панели запуска запускается основное действие, определенное в манифесте.Для всего остального (части пользовательского интерфейса, части потока навигации ...) вы можете использовать Fragment
s.
Вот пример организации действий и фрагментов для решения вашего случая:
MainActivity
|--- TopLevelFragment1
|--- TopLevelFragment2
| |--- TabFragment1
| |--- TabFragment2
| |--- TabFragment3
|
|--- TopLevelFragment3
|--- TopLevelFragment4
Как видно из приведенной выше схемы, Activity может содержать дочерние фрагменты, а фрагменты также могут иметь вложенные фрагменты (также называемые «дочерними фрагментами»).TopLevelFragmentN
- это фрагменты, которые отображаются при выборе элемента в BottomNavigationView
.TabFragmentN
- это фрагменты, которые отображаются при выборе вкладки из TopLevelFragment2
.
Давайте погрузимся в реализацию.Я не проверял следующие фрагменты кода, они просто предоставлены для руководства.Вот пример кода для действия:
main_activity.xml
<CoordinatorLayout android:id="@+id/coordinator_layout">
<FrameLayout android:id="@+id/fragment_host"><!-- TopLevelFragments will be displayed here --></FrameLayout>
<BottomNavigationView android:id="@+id/bottom_nav"/>
</CoordinatorLayout>
MainActivity.java
public class MainActivity extends AppCompatActivity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_activity);
// Retrieve a reference to the BottomNavigationView and listen for click events.
BottomNavigationView bottomNav = findViewById<BottomNavigationView>(R.id.bottom_nav);
bottomNav.setOnNavigationItemSelectedListener(item -> {
// Depending on the clicked item, change the displayed TopLevelFragment.
switch(item.getItemId()) {
case R.id.top_level_1:
showTopLevelFragment(new TopLevelFragment1());
return true;
case R.id.top_level_2:
// Do the same with other TopLevelFragments
return true;
default:
return false;
}
}
// Show the first TopLevelFragment by default.
showTopLevelFragment(new TopLevelFragment1());
}
private void showTopLevelFragment(Fragment fragment) {
// Use the fragment manager to dynamically change the fragment displayed in the FrameLayout.
getSupportFragmentManager().beginTransaction()
.replace(R.id.fragment_host, fragment)
.commit();
}
}
Пожалуйста, обратитесь к документации попонять, как определять элементы в BottomNavigationView
.
Теперь давайте сосредоточимся на TopLevelFragment2
, который содержит вкладки.Это обычный шаблон для использования TabLayout
с ViewPager
, так что вы можете перемещаться от одной вкладки к другой, проводя пальцем влево или вправо.
top_level_fragment_2.xml
<ConstraintLayout android:id="@+id/constraint_layout">
<AppBarLayout android:id="@+id/appbar_layout">
<Toolbar android:id="@+id/toolbar"/>
<TabLayout android:id="@+id/tab_layout"/>
</AppBarLayout>
<ViewPager android:id="@+id/tab_pager"/>
</ConstraintLayout>
TopLevelFragment2.java
public class TopLevelFragment2 extends Fragment {
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.top_level_fragment_2, container, false);
}
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
MyTabPagerAdapter tabPager = new MyTabPagerAdapter(getFragmentManager());
ViewPager viewPager = getView().findViewById(R.id.tab_pager);
viewPager.setAdapter(tabPager);
// Display a tab for each Fragment displayed in ViewPager.
TabLayout tabLayout = getView.findViewById(R.id.tab_layout);
tabLayout.setupWithViewPager(viewPager);
}
static class MyTabPagerAdapter extends FragmentPagerAdapter {
MyTabPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public int getCount() {
return 3; // One for each tab, 3 in our example.
}
@Override
public Fragment getItem(int position) {
switch(position) {
case 0:
return new TabFragment1();
case 1:
// Return a new instance of the fragment associated with the tab at position 1
default:
throw new IllegalArgumentException();
}
}
}
}
После этих шагов все, что вам нужно сделать, это написать код для других фрагментов.