Android,将底部导航与选项卡相结合(活动与碎片)



地狱社区,

我是安卓系统的新手,我找不到一个好的答案来解决这个问题:

我想使用底部导航,一些元素也应该使用选项卡。

现在我的问题是,实现这一点最常见(最好)的方式是什么?

我很困惑是否应该使用活动或碎片进行导航。

只对底部导航和选项卡使用片段是一种好的方式吗?还是对底部导航使用活动而只对选项卡使用片段的最佳方式?

向致以最良好的问候

最好的方法是对两者都使用Fragments。如果您对从底部导航可访问的每个屏幕使用Activity,则必须在每个屏幕中放置BottomNavigationView,并复制大量代码,以及调整这些活动之间的转换。

活动应该被视为应用程序的入口点:当单击启动器中的应用程序图标时,Manifest中定义的主活动就会启动。对于任何其他内容(UI的部分、导航流的部分…),您可以使用Fragments。

这里有一个示例活动和碎片组织来解决您的问题:

MainActivity
|--- TopLevelFragment1
|--- TopLevelFragment2
|           |--- TabFragment1
|           |--- TabFragment2
|           |--- TabFragment3
|
|--- TopLevelFragment3
|--- TopLevelFragment4

正如您在上面的模式中看到的,"活动"可以承载子片段,片段也可以具有嵌套片段(也称为"子片段")。CCD_ 5是在CCD_ 6中选择项目时显示的片段。CCD_ 7是当从CCD_ 8中选择选项卡时显示的片段。

让我们深入了解一下实现过程。我还没有测试以下代码,这些代码只是为了提供指导。以下是活动的示例代码:

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>

主活动.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。将TabLayoutViewPager一起使用是一种常见的模式,因此您可以通过向左或向右滑动从一个选项卡移动到另一个选项卡。

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();
}
}
}
}

在这些步骤之后,您所要做的就是为其他片段编写代码。

最新更新