tools:layout="@layout/fragment_welcome">
…/>
…/>
android:id="@+id/register" android:name=“com.joe.jetpackdemo.ui.fragment.login.RegisterFragment” android:label=“LoginFragment” tools:layout="@layout/fragment_register"
…/> 我在这里省略了一些不必要的代码。让我们看一下navigation标签的属性: | 属性 | 解释 | | — | — | | app:startDestination | 默认的起始位置 | 我们创建一个新的LoginActivity,在activity_login.xml文件中:
…> android:id="@+id/my_nav_host_fragment" android:name=“androidx.navigation.fragment.NavHostFragment” app:navGraph="@navigation/login_navigation" app:defaultNavHost=“true” android:layout_width=“match_parent” android:layout_height=“match_parent”/> 有几个属性需要解释一下: | 属性 | 解释 | | — | — | | android:name | 值必须是androidx.navigation.fragment.NavHostFragment,声明这是一个NavHostFragment | | app:navGraph | 存放的是第二步建好导航的资源文件,也就是确定了Navigation Graph | | app:defaultNavHost="true" | 与系统的返回按钮相关联 | 在WelcomeFragment中,点击登录和注册按钮可以分别跳转到LoginFragment和RegisterFragment中。 这里我使用了两种方式实现: 目标:WelcomeFragment携带key为name的数据跳转到LoginFragment,LoginFragment接收后显示。 Have a account ? Login按钮的点击事件如下: btnLogin.setonClickListener { // 设置动画参数 val navOption = navOptions { anim { enter = R.anim.slide_in_right exit = R.anim.slide_out_left popEnter = R.anim.slide_in_left popExit = R.anim.slide_out_right } } // 参数设置 val bundle = Bundle() bundle.putString(“name”,“TeaOf”) findNavController().navigate(R.id.login, bundle,navOption) } 后续LoginFragment的接收代码比较简单,直接获取Fragment中的Bundle即可,这里不再出示代码。最后的效果: 目标:WelcomeFragment通过Safe Args将数据传到RegisterFragment,RegisterFragment接收后显示。 再看一下已经展示过的login_navigation.xml: …> … /> android:id="@+id/welcome"
android:id="@+id/action_welcome_to_login" app:destination="@id/login"/>
android:id="@+id/action_welcome_to_register" app:enterAnim="@anim/slide_in_right" app:exitAnim="@anim/slide_out_left" app:popEnterAnim="@anim/slide_in_left" app:popExitAnim="@anim/slide_out_right" app:destination="@id/register"/> android:id="@+id/register" …
android:name=“EMAIL” android:defaultValue=“2005@qq.com” app:argType=“string”/> 细心的同学可能已经观察到navigation目录下的login_navigation.xml资源文件中的action标签和argument标签,这里需要解释一下: action标签 | 属性 | 作用 | | — | — | | app:destination | 跳转完成到达的fragment的Id | | app:popUpTo | 将fragment从栈中d出,直到某个Id的fragment | argument标签 | 属性 | 作用 | | — | — | | android:name | 标签名字 | | app:argType | 标签的类型 | | android:defaultValue | 默认值 | 点击Android studio中的Make Project按钮,可以发现系统为我们生成了两个类: WelcomeFragment中的JOIN US按钮点击事件: btnRegister.setonClickListener { val action = WelcomeFragmentDirections .actionWelcomeToRegister() .setEMAIL(“TeaOf1995@Gamil.com”) findNavController().navigate(action) } RegisterFragment中的接收: override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) // … val safeArgs:RegisterFragmentArgs by navArgs() val email = safeArgs.email mEmailEt.setText(email) } 以及效果: 需要提及的是,如果不用Safe Args,action可以由Navigation.createNavigateonClickListener(R.id.next_action, null)方式生成,感兴趣的同学可以自行编写。 三、更多 Navigation可以绑定menus、drawers和bottom navigation,这里我们以bottom navigation为例,我先在navigation目录下新创建了main_navigation.xml,接着新建了MainActivity,下面则是activity_main.xml: …> android:id="@+id/my_nav_host_fragment" android:name=“androidx.navigation.fragment.NavHostFragment” android:layout_width=“match_parent” app:navGraph="@navigation/main_navigation" app:defaultNavHost=“true” android:layout_height=“0dp” android:layout_weight=“1”/> android:id="@+id/navigation_view" android:layout_width=“match_parent” android:layout_height=“wrap_content” android:background="@android:color/white" app:itemIconTint="@color/colorAccent" app:itemTextColor="@color/colorPrimary" app:menu="@menu/menu_main"/> MainActivity中的处理也十分简单: class MainActivity : AppCompatActivity() { lateinit var bottomNavigationView: BottomNavigationView override fun onCreate(savedInstanceState: Bundle?) { //… val host: NavHostFragment = supportFragmentManager.findFragmentById(R.id.my_nav_host_fragment) as NavHostFragment val navController = host.navController initWidget() initBottomNavigationView(bottomNavigationView,navController) } private fun initBottomNavigationView(bottomNaviga 《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》 【docs.qq.com/doc/DSkNLaERkbnFoS0ZF】 完整资料开源分享 tionView: BottomNavigationView, navController: NavController) { bottomNavigationView.setupWithNavController(navController) } private fun initWidget() { bottomNavigationView = findViewById(R.id.navigation_view) } } 《960全网最全Android开发笔记》 《379页Android开发面试宝典》 《507页Android开发相关源码解析》 因为文件太多,全部展示会影响篇幅,暂时就先列举这些部分截图 ttomNavigationView, navController: NavController) { bottomNavigationView.setupWithNavController(navController) } private fun initWidget() { bottomNavigationView = findViewById(R.id.navigation_view) } } 《960全网最全Android开发笔记》 [外链图片转存中…(img-qeLDkJMB-1640918341569)] 《379页Android开发面试宝典》 [外链图片转存中…(img-ZkzImyXT-1640918341569)] 《507页Android开发相关源码解析》 [外链图片转存中…(img-Amzh7MKX-1640918341570)] 因为文件太多,全部展示会影响篇幅,暂时就先列举这些部分截图 本文已被CODING开源项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》收录 欢迎分享,转载请注明来源:内存溢出
评论列表(0条)