3. 起始应用概览
Sports 应用由两个画面组成。第一个画面显示体育项目列表。用户可以选择特定体育项目,然后系统会显示第二个画面。第二个画面是一个详情画面,其中会显示所选体育项目的新闻。为了简化实现,详情画面将显示占位文本。
起始代码演示
您下载的起始代码已为您预先设计了列表画面布局和详情画面布局。在本衔接课程中,您只需专注于使应用适应大屏幕即可。您将使用 SlidingPaneLayout 来充分利用大屏幕。下面简要介绍了一些文件,以帮助您上手。
fragment_sports_list.xml
在 Design 视图中,打开 res/layout/fragment_sports_list.xml。
此文件包含应用中第一个画面(即体育项目列表)的布局。
该布局由一个显示体育新闻列表的 Recyclerview 组成。
sports_list_item.xml
在 Design 视图中,打开 res/layout/sports_list_item.xml。
此文件包含 Recyclerview 中每一项的布局。
该布局由以下内容组成:体育项目的缩略图、新闻标题以及简要体育新闻的占位文本。
fragment_sports_news.xml
在 Design 视图中,打开 res/layout/fragment_sports_news.xml。
此文件包含应用中第二个画面的布局。当用户从 Recyclerview 中选择了某个体育项目时,系统就会显示这个画面。
该布局由以下内容组成:体育项目图片横幅以及体育新闻的占位文本。
main_activity.xml 和 content_main.xml
这两个文件定义了只有一个 fragment 的主 activity 布局。
navigation/nav_graph.xml
导航图包含两个目的地,一个对应于体育项目列表,另一个对应于体育新闻。
res/values 文件夹
此文件夹中是一些您非常熟悉的资源文件。
colors.xml 包含应用中使用的主题颜色。
strings.xml 包含应用所需的全部字符串。
themes.xml 包含为应用进行的界面自定义。
MainActivity.kt
此文件包含默认模板生成的代码,用于将 activity 的内容视图设为 main_activity.xml。我们替换了 onSupportNavigateUp() 方法,以便处理应用栏中的默认向上导航。
model/Sport.kt
这是一个数据类,其中包含要在体育项目列表 Recyclerview 的每一行中显示的数据。
data/SportsData.kt
此文件包含一个称为 getSportsData() 的函数,该函数可返回一个预先填充了硬编码体育项目数据的 ArrayList。
警告:建议不要在代码中对数据进行硬编码。不过,在该应用中,为了简便起见,也为了侧重于自适应布局,我们对字符串进行了硬编码。
SportsViewModel.kt
这是应用的共享 ViewModel。ViewModel 由 SportsListFragment(显示体育项目列表的第一个画面)和 NewsDetailsFragment(显示详细体育新闻的第二个画面)共享。
_currentSport 属性的类型为 MutableLiveData, 用于存储用户当前选择的体育项目。currentSport 属性是 _currentSport 的后备属性,并且已作为公共只读版本公开,以供其他类使用。
_sportsData 属性包含体育项目数据列表。与上一个属性类似,sportsData 是此属性的公共只读版本。
初始化程序 init{} 块用于初始化 _currentSport 和 _sportsData。它会使用 data/SportsData.kt 中的整个体育项目列表初始化 _sportsData,并使用列表中的第一项初始化 _currentSport。
updateCurrentSport() 函数可接收 Sports 实例,并使用传入的值更新 _currentSport。
SportsAdapter.kt
这是 RecyclerView 的适配器。在构造函数中,会传入点击监听器。此文件中的大部分代码都是您在之前的 Codelab 中已经熟悉的样板代码。
SportsListFragment.kt
这是第一个画面 fragment,其中会显示体育项目列表。
onCreateView() 函数使用绑定对象膨胀 fragment_sports_list 布局 XML 文件。
onViewCreated() 函数可设置 RecyclerView 适配器。它会将用户选择的体育项目更新为共享 ViewModel(即 SportsViewModel)中的当前体育项目。此外,它会导航到包含体育新闻的详情画面,并使用 submitList(List) 将体育项目列表提交给适配器以供显示。
NewsDetailsFragment.kt
这是应用中的第二个画面,其中会显示体育新闻的占位文本。
onCreateView() 函数使用绑定对象膨胀 fragment_sports_news 布局 XML 文件。
onViewCreated() 函数会在 SportsViewModel 的 currentSport 属性上附加一个观察器,以便在数据发生变化时自动更新界面。在观察器内部,体育项目标题、图片和新闻会保持最新状态。
构建并运行应用
构建应用并在模拟器或设备上运行应用。从体育项目列表中选择任何一项,应用应该会转到第二个画面,其中包含新闻的占位文本。