AndroidJetpack Fragment之Navigation和ViewPager2
新的Fragment导航方式:Navigation
1.创建若干个fragment
2.添加导航
1)新建Navigation:右键res文件夹,New->Android Resource File,Resource Type选择Navigation
2)添加Freagment:Navagation文件中,点击左上角添加,按顺序添加Fragment,拖动四边的节点可以设置导航顺序
3)添加HostFragment到container中
3.添加容器
activity中拖动添加containers->NavHostFragment并选择Navagation,或者添加代码:
<fragment
android:id="@+id/fragment"
android:name="androidx.navigation.fragment.NavHostFragment"
android:layout_width="0dp"
android:layout_height="0dp"
app:defaultNavHost="true"
app:navGraph="@navigation/main_nav_controler" />
4.设置跳转
指定位置添加代码:
Navigation.findNavController(btn).navigate(R.id.action_mainFragment_to_detailFragment)
//navigate的参数为跳转方向,可自动补全
5.设置左上角点击返回
```
private lateinit var mNavController : NavController
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
mNavController = Navigation.findNavController(this, R.id.fragment)
NavigationUI.setupActionBarWithNavController(this, mNavController)
}
override fun onSupportNavigateUp(): Boolean {
return mNavController.navigateUp()
}
6.生命周期:
切换时销毁上一个Fragment,执行到onDestroy()
7.数据传递
1)bundle方式:Navigation.findController(View).navigate(resId, Bundle)
2)ViewModel方式:和Activity中使用ViewModel类似:在Fragment的onCreateView()中使用 。区别在于:使用DataBinding.inflate()绑定View;onCreateView()返回bind.getRoot()
新的页面切换控件:ViewPager2
1. 单独使用ViewPager2,作为ListView
1.xml:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".PagerFragment">
<androidx.viewpager2.widget.ViewPager2
android:id="@+id/viewpager2"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</FrameLayout>
2.Adapter:
class PagerPhotoListAdapter : ListAdapter<PhotoItem, PagerPhotoViewHolder>(DIFF_UTIL) {
object DIFF_UTIL : DiffUtil.ItemCallback<PhotoItem>() {
override fun areItemsTheSame(oldItem: PhotoItem, newItem: PhotoItem) =
oldItem === newItem
override fun areContentsTheSame(oldItem: PhotoItem, newItem: PhotoItem) =
oldItem.photoId == newItem.photoId
}
override fun onCreateViewHolder(parent:ViewGroup, viewType:Int):PagerPhotoViewHolder{
val view = LayoutInflater.from(parent.context)
.inflate(R.layout.pager_photo_view, parent, false)
return PagerPhotoViewHolder(view)
}
override fun onBindViewHolder(holder: PagerPhotoViewHolder, position: Int) {
Glide.with(holder.itemView)
.load(getItem(position).previewUrl)
.placeholder(R.drawable.ic_photo_gray_24dp)
.into(holder.itemView.pagerPhoto)
}
}
class PagerPhotoViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView)
3.Activity中使用:
val photoList = arguments?.getParcelableArrayList<PhotoItem>("PHOTO_LIST") //获取数据
PagerPhotoListAdapter().apply {
viewpager2.adapter = this //装配适配器
submitList(photoList) //装配数据
}
viewpager2.registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() {
override fun onPageSelected(position: Int) {
super.onPageSelected(position)
photoTag.text = "${position + 1} / ${photoList?.size}"
}
}) //注册分页变化事件
viewpager2.setCurrentItem(arguments?.getInt("PHOTO_POSITION")?:0, false)
2. TabLayout + ViewPager2
1.xml:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity" >
<com.google.android.material.tabs.TabLayout
android:id="@+id/tablayout"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<com.google.android.material.tabs.TabItem
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Monday" />
<com.google.android.material.tabs.TabItem
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Tuesday" />
<com.google.android.material.tabs.TabItem
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Wednesday" />
</com.google.android.material.tabs.TabLayout>
<View
android:id="@+id/divider"
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="?android:attr/listDivider" />
<androidx.viewpager2.widget.ViewPager2
android:id="@+id/view_pager"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
2.Adapter:
class TabViewPagerAdapter : FragmentStateAdapter(this) {
override fun getItemCount() = 3
override fun createFragment(position: Int) = when(position) {
0 -> ScaleFragment()
1 -> RotateFragment()
else -> TranslateFragment()
}
}
AndroidJetpack Fragment之Navigation和ViewPager2的更多相关文章
- Android Navigation 架构组件入门教程
Android Navigation 架构组件入门教程 版权声明:本文为博主原创文章,未经博主允许不得转载. 转载请表明出处:https://www.cnblogs.com/cavalier-/p/1 ...
- Android Navigation使用
简介 Navigation导航编辑器旨在简化Android开发中导航的实现,可以帮助我们很好的处理Activity和fragment之间通过FragmentTransaction交互的复杂性,也可以很 ...
- 【从零开始撸一个App】Fragment和导航中的使用
Fragment简介 Fragment自从Android 3.0引入开始,它所承担的角色就是显而易见的.它之于Activity就如html片段之于页面,好处无需赘述. Fragment的生命周期和Ac ...
- Thymeleaf3语法详解和实战
Thymeleaf3语法详解 Thymeleaf是Spring boot推荐使用的模版引擎,除此之外常见的还有Freemarker和Jsp.Jsp应该是我们最早接触的模版引擎.而Freemarker工 ...
- Thymeleaf3语法详解
每天学习一点点 编程PDF电子书.视频教程免费下载:http://www.shitanlife.com/code Thymeleaf是Spring boot推荐使用的模版引擎,除此之外常见的还有F ...
- NavigationView使用简介
Android支持直接创建带有NavigationView的Activity,这里主要介绍NavigationView的逻辑. NavigationView通常是跟DrawerLayout一起使用.D ...
- Navigation activity回退到fragment失败
我有一个activity--MainActivity, 布局中设置了一个 <androidx.fragment.app.FragmentContainerView android:layout_ ...
- Navigation 实现不同fragment之间的view的共享(含动画过渡)
以imageView的共享举例 两个fragment都要有各自的imageview视图,id可以不同,但transitonName一定要相同, 都要指定相同的src 例如: fragment A &l ...
- Navigation 在fragment之间用bundel传递数据
使用 Bundle 对象在目的地之间传递参数 如果您不使用 Gradle,仍然可以使用 Bundle 对象在目的地之间传递参数.创建 Bundle 对象并使用 navigate() 将它传递给目的地, ...
随机推荐
- 纯C语言(C89)实现简单链表
起因 工作很少接触纯C项目,业余写着玩玩,不断雕琢 目标 纯C实现简单链表,提供方便易用泛型接口,避免依赖 实现 完全封装,隐藏结构体细节,不支持栈创建 拷贝存储,轻微性能代价换来易用性 list.h ...
- 【阿菜读论文】ContractFuzzer:fuzzing方法挖掘智能合约漏洞
论文简介 论文标题:ContractFuzzer: Fuzzing Smart Contracts for Vulnerability Detection 论文链接:ContractFuzzer: F ...
- intouch 趋势图Y轴自适应功能完善
在项目中有利用到历史趋势,其y轴往往展示的是该点的最小/最大值范围,对于曲线波动展示不够友好.故而利用自带方法进行完善,以此记录. Histrend1.MinRange=HTGetAutoScaleV ...
- SAS 常用字符串函数
原文链接:https://www.cnblogs.com/snoopy1866/p/15085466.html CAT(item-1 <, -, item-n>) : 在保留首尾空格的情况 ...
- Hadoop 3.1.1 - Yarn 服务 - 总览
YARN 服务 总览 Yarn 服务框架为在 Yarn 原生环境里长时间运行的服务,提供了一流的支持和接口.简言之,它扮演了容器编排系统的角色,统一管理 Yarn 上运行的容器化服务.它同时支持 Do ...
- ;~ 并发运行的AutoHotkey脚本真机实际测试模板参考20191010.ahk
;~ 并发运行的AutoHotkey脚本真机实际测试模板参考20191010.ahk;~ 2019年10月10日;~ 徐晓亮(aahk6188);~ 操作系统测试环境: Windows 7 专业版 3 ...
- MyBatis使用Zookeeper保存数据库的配置,可动态刷新
核心关键点: 封装一个DataSource, 重写 getConnection 就可以实现 我们一步一步来看. 环境: Spring Cloud + MyBatis MyBatis常规方式下配置数据源 ...
- node溢出
在做项目的过程中,项目越来越大,后面导致项目无法正常启动,查了原因是因为node 溢出了. 先看看溢出时报的错 解决办法: increase-memory-limit插件 1.在package.js ...
- 【Unity3D】Android App Bundle(aab)打包上架Google Play介绍
总体说来,Android App Bundle打包有3种方式,每种方式都有成功上架Google Play进行测试通过,因此实用程度还是挺高的.能够理解以下内容的前提是会打apk包,知道如何生成Asse ...
- 在 CSS 中表示颜色的hex code方法和rgb方法
hexadecimal code(十六进制编码),简写为 hex code. 我们通常使用 decimals,也就是十进制数字,它对每一位数字使用符号0到9来表示.Hexadecimals (或 he ...