新的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的更多相关文章

  1. Android Navigation 架构组件入门教程

    Android Navigation 架构组件入门教程 版权声明:本文为博主原创文章,未经博主允许不得转载. 转载请表明出处:https://www.cnblogs.com/cavalier-/p/1 ...

  2. Android Navigation使用

    简介 Navigation导航编辑器旨在简化Android开发中导航的实现,可以帮助我们很好的处理Activity和fragment之间通过FragmentTransaction交互的复杂性,也可以很 ...

  3. 【从零开始撸一个App】Fragment和导航中的使用

    Fragment简介 Fragment自从Android 3.0引入开始,它所承担的角色就是显而易见的.它之于Activity就如html片段之于页面,好处无需赘述. Fragment的生命周期和Ac ...

  4. Thymeleaf3语法详解和实战

    Thymeleaf3语法详解 Thymeleaf是Spring boot推荐使用的模版引擎,除此之外常见的还有Freemarker和Jsp.Jsp应该是我们最早接触的模版引擎.而Freemarker工 ...

  5. Thymeleaf3语法详解

    每天学习一点点 编程PDF电子书.视频教程免费下载:http://www.shitanlife.com/code   Thymeleaf是Spring boot推荐使用的模版引擎,除此之外常见的还有F ...

  6. NavigationView使用简介

    Android支持直接创建带有NavigationView的Activity,这里主要介绍NavigationView的逻辑. NavigationView通常是跟DrawerLayout一起使用.D ...

  7. Navigation activity回退到fragment失败

    我有一个activity--MainActivity, 布局中设置了一个 <androidx.fragment.app.FragmentContainerView android:layout_ ...

  8. Navigation 实现不同fragment之间的view的共享(含动画过渡)

    以imageView的共享举例 两个fragment都要有各自的imageview视图,id可以不同,但transitonName一定要相同, 都要指定相同的src 例如: fragment A &l ...

  9. Navigation 在fragment之间用bundel传递数据

    使用 Bundle 对象在目的地之间传递参数 如果您不使用 Gradle,仍然可以使用 Bundle 对象在目的地之间传递参数.创建 Bundle 对象并使用 navigate() 将它传递给目的地, ...

随机推荐

  1. Docker简易安装教程

    Docker介绍 Docker 是一种开源容器化技术,用于构建和容器化应用程序.Docker 使用客户端-服务器架构.Docker客户端与 Docker守护进程对话,后者负责构建.运行和分发 Dock ...

  2. Fedora无法安装Qt4

    针对QT4,6安装时遇到的情况 安装平台:fedora14i686 Qt版本:4.6.2 1:解压qt的tar包 我们进行解压(tar xzvf ***.tar.gz),解压到指定目录的话后边加上: ...

  3. argparse模块基本用法

    argparse模块基本用法 在 python 编写的程序中,我们经常会看到的 argparse 相关代码,而它究竟怎么使用呢?接招! argparse 是一个命令行参数解析模块 现在提出需求,我需要 ...

  4. 自学linux——15.云主机的购买流程及域名的购买备案解析

    项目上线流程 一.服务器选配购买 项目上线的服务器必须是外网服务器 1.服务器购买情况 真实服务器(成本过高,购买内部自用) 云服务器(上线首选):阿里云,腾讯云,华为云 2.购买阿里云服务器:htt ...

  5. Nature | 多层次蛋白质组学综合分析冠状病毒侵染宿主细胞的分子机制

    冠状病毒是一种自然界普遍存在的单股正链RNA病毒,电镜下呈日冕状或皇冠状,故命名为冠状病毒.在本世纪初短短20年中,共爆发了三次冠状病毒疫情,即2003年SARS-CoV.2012年MERS-CoV和 ...

  6. linux 20个常用命令

    一.文件和目录 1. cd命令 (它用于切换当前目录,它的参数是要切换到的目录的路径,可以是绝对路径,也可以是相对路径) cd /home    进入 '/ home' 目录 cd ..       ...

  7. 第2篇-JVM虚拟机这样来调用Java主类的main()方法

    在前一篇 第1篇-关于JVM运行时,开篇说的简单些 中介绍了call_static().call_virtual()等函数的作用,这些函数会调用JavaCalls::call()函数.我们看Java类 ...

  8. 以TiDB热点问题来谈Region的调度流程

    什么是热点问题 说这个话题之前我们先回顾一下TiDB的主要结构和概念. TiDB的核心架构分为TiDB.TiKV.PD三个部分,其中TiKV是一个分布式数据存储引擎用来存储真实的数据,在TiKV中又对 ...

  9. Android系统编程入门系列之服务Service齐头并进多线程任务

    在上篇文章中初步了解了Android系统的四大组件之一的服务Service,在服务内可以执行无用户交互的耗时操作任务,但是包括之前关于界面系列文章在内,生命周期方法都是在主线程内被系统回调的.如果直接 ...

  10. Vue-axios 封装了一手好axios:)

    请求方式 很多种请求方式,重点还是第一种吧 下载 npm install axios --save 下载完成 直接导入 import axios from 'axios' 简单配置 axios({ u ...