Android Jetpack从入门到精通(深度好文,值得收藏,裸辞奋战25天三面美团

Android Jetpack从入门到精通(深度好文,值得收藏,裸辞奋战25天三面美团,第1张

Android Jetpack从入门到精通(深度好文,值得收藏,裸辞奋战25天三面美团

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 | 默认的起始位置 |

第三步 建立NavHostFragment

我们创建一个新的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中。

这里我使用了两种方式实现:

方式一 利用ID导航

目标: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即可,这里不再出示代码。最后的效果:

方式二 利用Safe Args

目标: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=“[email protected]

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(“[email protected]”)

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学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》收录

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5687732.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存