江苏建站系统,家装公司哪家比较好,淘宝站外引流推广方法,百度免费优化在这个实践案例中#xff0c;我们将使用Jetpack Navigation创建一个简单的新闻应用。这个应用将包含以下功能#xff1a;
新闻列表页面#xff1a;显示一组新闻文章。新闻详情页面#xff1a;显示选定新闻文章的详细信息。用户资料页面#xff1a;显示用户的资料信息。
…
在这个实践案例中我们将使用Jetpack Navigation创建一个简单的新闻应用。这个应用将包含以下功能
新闻列表页面显示一组新闻文章。新闻详情页面显示选定新闻文章的详细信息。用户资料页面显示用户的资料信息。
我们将通过导航图、传递数据、处理返回操作和集成底部导航来展示Jetpack Navigation的强大功能。
第一步项目设置
添加依赖项
在build.gradle文件中添加必要的依赖项
dependencies {def nav_version 2.4.0implementation androidx.navigation:navigation-fragment-ktx:$nav_versionimplementation androidx.navigation:navigation-ui-ktx:$nav_versionimplementation com.google.android.material:material:1.4.0
}创建导航图
在res/navigation目录中创建一个新的导航图文件nav_graph.xml。
?xml version1.0 encodingutf-8?
navigation xmlns:androidhttp://schemas.android.com/apk/res/androidxmlns:apphttp://schemas.android.com/apk/res-autoxmlns:toolshttp://schemas.android.com/toolsapp:startDestinationid/newsListFragmentfragmentandroid:idid/newsListFragmentandroid:namecom.example.newsapp.NewsListFragmentandroid:labelNews Listtools:layoutlayout/fragment_news_list actionandroid:idid/action_newsListFragment_to_newsDetailFragmentapp:destinationid/newsDetailFragment /actionandroid:idid/action_newsListFragment_to_userProfileFragmentapp:destinationid/userProfileFragment //fragmentfragmentandroid:idid/newsDetailFragmentandroid:namecom.example.newsapp.NewsDetailFragmentandroid:labelNews Detailtools:layoutlayout/fragment_news_detail argumentandroid:namearticleIdapp:argTypeinteger //fragmentfragmentandroid:idid/userProfileFragmentandroid:namecom.example.newsapp.UserProfileFragmentandroid:labelUser Profiletools:layoutlayout/fragment_user_profile //navigation主Activity布局
创建主Activity布局文件activity_main.xml包含一个NavHostFragment和BottomNavigationView。
?xml version1.0 encodingutf-8?
androidx.drawerlayout.widget.DrawerLayout xmlns:androidhttp://schemas.android.com/apk/res/androidxmlns:apphttp://schemas.android.com/apk/res-autoandroid:layout_widthmatch_parentandroid:layout_heightmatch_parentandroidx.constraintlayout.widget.ConstraintLayoutandroid:layout_widthmatch_parentandroid:layout_heightmatch_parentfragmentandroid:idid/nav_host_fragmentandroid:nameandroidx.navigation.fragment.NavHostFragmentandroid:layout_width0dpandroid:layout_height0dpapp:defaultNavHosttrueapp:navGraphnavigation/nav_graphapp:layout_constraintTop_toTopOfparentapp:layout_constraintBottom_toTopOfid/bottom_navapp:layout_constraintLeft_toLeftOfparentapp:layout_constraintRight_toRightOfparent /com.google.android.material.bottomnavigation.BottomNavigationViewandroid:idid/bottom_navandroid:layout_width0dpandroid:layout_heightwrap_contentandroid:layout_gravitystartapp:menumenu/bottom_nav_menuapp:layout_constraintBottom_toBottomOfparentapp:layout_constraintLeft_toLeftOfparentapp:layout_constraintRight_toRightOfparent //androidx.constraintlayout.widget.ConstraintLayout/androidx.drawerlayout.widget.DrawerLayoutBottomNavigationView菜单
在res/menu目录中创建bottom_nav_menu.xml。
?xml version1.0 encodingutf-8?
menu xmlns:androidhttp://schemas.android.com/apk/res/androiditemandroid:idid/newsListFragmentandroid:icondrawable/ic_newsandroid:titleNews /itemandroid:idid/userProfileFragmentandroid:icondrawable/ic_profileandroid:titleProfile /
/menu主Activity
在MainActivity.kt中设置NavController和BottomNavigationView。
class MainActivity : AppCompatActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)val navController findNavController(R.id.nav_host_fragment)val bottomNavigationView findViewByIdBottomNavigationView(R.id.bottom_nav)bottomNavigationView.setupWithNavController(navController)}override fun onSupportNavigateUp(): Boolean {val navController findNavController(R.id.nav_host_fragment)return navController.navigateUp() || super.onSupportNavigateUp()}
}第二步创建Fragment
新闻列表Fragment
创建NewsListFragment.kt显示一组新闻文章。
class NewsListFragment : Fragment(R.layout.fragment_news_list) {override fun onViewCreated(view: View, savedInstanceState: Bundle?) {super.onViewCreated(view, savedInstanceState)val navController findNavController()// 示例数据val articles listOf(Article 1, Article 2, Article 3)val adapter ArrayAdapter(requireContext(), android.R.layout.simple_list_item_1, articles)view.findViewByIdListView(R.id.newsListView).adapter adapterview.findViewByIdListView(R.id.newsListView).setOnItemClickListener { _, _, position, _ -val action NewsListFragmentDirections.actionNewsListFragmentToNewsDetailFragment(position)navController.navigate(action)}}
}新闻详情Fragment
创建NewsDetailFragment.kt显示选定新闻文章的详细信息。
class NewsDetailFragment : Fragment(R.layout.fragment_news_detail) {override fun onViewCreated(view: View, savedInstanceState: Bundle?) {super.onViewCreated(view, savedInstanceState)val args: NewsDetailFragmentArgs by navArgs()val articleId args.articleIdview.findViewByIdTextView(R.id.articleTextView).text Displaying details for article $articleId}
}用户资料Fragment
创建UserProfileFragment.kt显示用户的资料信息。
class UserProfileFragment : Fragment(R.layout.fragment_user_profile) {override fun onViewCreated(view: View, savedInstanceState: Bundle?) {super.onViewCreated(view, savedInstanceState)// 示例用户信息view.findViewByIdTextView(R.id.userNameTextView).text John Doeview.findViewByIdTextView(R.id.userEmailTextView).text john.doeexample.com}
}第三步运行和测试
现在我们已经完成了所有必要的步骤可以运行应用程序并测试导航功能。
启动应用程序底部导航栏将显示新闻列表和用户资料页面。在新闻列表页面点击任意文章将导航到新闻详情页面并显示选定文章的详细信息。点击底部导航栏中的用户资料图标将导航到用户资料页面显示用户的相关信息。
结论
通过这个实践案例我们展示了如何使用Jetpack Navigation创建一个简单的新闻应用。我们涵盖了设置导航图、在Fragment之间导航、传递数据、处理返回操作以及集成底部导航。Jetpack Navigation提供了强大且灵活的解决方案使得管理复杂的导航场景变得更加简单和高效。
Best regards!