上一篇介绍了Res资源管理目录的大概结构,相信大部分人还是会搞不明白这其中的关系。没事,接下来我们就要结合实际代码来理解了。在上一篇我创建了带有底部导航菜单的项目,可以看到运行出来的效果已经有个App的基本框架了,起到关键作用的就是底部的导航菜单了。实现导航菜单的方式有很多种,我这只说说App里自带的BottomNavigationView。
一、BottomNavigationView
直接看代码,打开Java>com.example.myapp>MainActivity,这里要注意一下,使用BottomNavigationView需要import相关依赖,如果选择了创建带BottomNavigationView的项目,那么这个也会默认import。
import com.google.android.material.bottomnavigation.BottomNavigationView;
有一个被重写的onCreate方法。在方法中可以看到上一篇讲过的读取资源内容的方式:R.layout.activity_main和R.id.nav_view以及其他的R.id.xxx。
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);//设置页面布局
BottomNavigationView navView = findViewById(R.id.nav_view); //找到导航菜单组件
// Passing each menu ID as a set of Ids because each
// menu should be considered as top level destinations.
AppBarConfiguration appBarConfiguration = new AppBarConfiguration.Builder(
R.id.navigation_home, R.id.navigation_dashboard, R.id.navigation_notifications)
.build();
NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment);
NavigationUI.setupActionBarWithNavController(this, navController, appBarConfiguration);
NavigationUI.setupWithNavController(navView, navController);
}
super.onCreate(savedInstanceState);就不说了大家都懂,看第二句:
setContentView(R.layout.activity_main);
我的理解是将res/layout/activity_main.html这个布局文件设置为整个app的主布局。这个文件下有两个子节点,代表底部的导航菜单(BottomNavigationView)和中间可显示的内容(fragment)。这些看属性名就挺好理解的,给节点设置id就可以通过R.id.xx的方式获取,而其他的也能看懂就是控件位置大小之类的。
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingTop="?attr/actionBarSize">
<com.google.android.material.bottomnavigation.BottomNavigationView
android:id="@+id/nav_view"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="0dp"
android:layout_marginEnd="0dp"
android:background="?android:attr/windowBackground"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:menu="@menu/bottom_nav_menu" />
<fragment
android:id="@+id/nav_host_fragment"
android:name="androidx.navigation.fragment.NavHostFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:defaultNavHost="true"
app:lay