而通过Jetpack的导航组件——Navigation,就可以很方便的管理各fragment之间的切换,让开发变得更简单。...组成三要素 Navigation graph 一个包含所有导航相关信息的 XML 资源 NavHostFragment 一种特殊的Fragment,用于承载导航内容的容器 NavController 管理应用导航的对象...,相当于上图中的每条线,destination定义跳转的目标页,还可以定义跳转时的动画等等 添加NavHostFragment 在MainActivity的布局文件中配置NavHostFragment...,首先得到navController对象,然后调用它的navigate方法,传入前面nav_graph中定义的action的id即可。...更多用法 在编辑nav_graph的时候,action属性除了设置目标页外,还可以设置动画、页面间参数传递、fragment回退栈管理等 动画 enterAnim: 进场时目标页面动画 exitAnim
简化fragment栈管理,终结IllegalStateExceptions这个异常?...>>>> 传递数据 您可以通过两种方式在目标之间传递数据:使用Bundle对象或使用safeargs Gradle插件以类型安全的方式传递数据。...= view.findViewById(R.id.textViewAmount); tv.setText(getArguments().getString("amount")); 2、以类型安全的方式在目标之间传递数据...导航架构组件有一个名为safeargs的Gradle插件,它生成简单的对象和构建器类,以便对目标和动作指定的参数进行类型安全访问。...先看看NavHostFragment,NavHostFragment在布局中提供一个载体,控制和管理导航行为。它实现NavHost,NavHost是提供导航的接口,便于扩展。
但是它同样可以指代 Activity、其它的导航图。...最初要有个起始页面,叫 start destination,处于栈底,是启动时的第一个页面,当然也是返回可见的最后一个页面。...多个 destination 连接起来就组成了一个导航图,类似于一种栈结构,页面先进先出。destination 之间的连接叫做 action。 概念略抽象,下面看具体的应用。...app:id 定义这个 action 的 id,代码里执行跳转时要用到。...的参数可以是一个 destination(这里就是 fragment 在导航图 nav_graph 中的 id),也可以是 action 的 id。
页面的切换通常还包括对应用程序App bar的管理,Fragment之间的切换动画以及Fragment之间的参数传递。...Graph中的Fragment正是通过NavHostFragment进行展示的 NavController:导航控制器,用于在代码中完成Navigation Graph中具体的页面切换动作 它们三者之间的关系可以通过下面的这段话来理解...:当你想要切换Fragment时,使用NavController对象,告诉它你想要去Navigation Graph中的哪个Fragment,NavController会将你想去的Fragment展示在...5.使用NavController完成导航 经过以上的步骤后,我们还需要通过NavController对象,在代码中完成具体的页面跳转工作,我们需要在MainFragment的布局文件中添加一个...然后,我们就可以利用所生成的代码文件,在Fragment之间进行参数的传递了,代码如下: //MainFragment @Override public void onClick(View view
点击底部可以切换页面,有了上一篇的基础,先新建一个nav_graph的导航资源文件,包含三个framgent子节点 <?...可能大家迫不及待的想应用到自己的项目中去了,可殊不知还有坑在里面。...()方法中可以看出,mGraphId就是在布局文件中定义NavHostFragment时,通过app:navGraph属性指定的导航资源文件, 跟进setGraph()方法, public void...由此可见,导航资源文件nav_graph会被解析成一个NavGraph对象,看下NavGraph public class NavGraph extends NavDestination implements...定义BottomNavigationView时 app:menu属性指定的menu资源文件中,item标签的id和nav_graph中fragment标签的id保持一致的原因了吧,我们继续跟踪, public
导航是发生在应用的目标示图之间——用户可以导航到应用当中的任何的位置。...在File name这一栏当中输入名称,比如“nav_graph”。 ? 在Resource type下拉列表然后选择Navigation,点击ok就可以了。 ?...然后我们直接拖NavHostFragment 的视图到我们的activity文件当中 在导航视图当中添加目标视图 这里总共有三种不同的方式可以在我们的导航视图当中添加目标视图 添加已经存在的目标视图 如果我们想把已经存在的目标视图想要添加在导航图当中...导航到目标视图,我们需要用到NavController,它是用于管理NavHost中的应用程序导航的对象。...那么不同的Fragment之间的跳转,可能就是摆在我们面前的一大难题,经常会有这样会那样的问题,同时逻辑不是很清晰并且需要大量的代码用来实现。
1 在JetPack中有一个组件是Navigation,顾名思义它是一个页面导航组件,相对于其他的第三方导航,不同的是它是专门为Fragment的页面管理所设计的。...通常的实现都要自己维护Fragment之间的栈关系,同时要对Fragment的Transaction操作非常熟悉。为了降低使用与维护成本,所以就有了今天的主角Navigation。...一共有6个页面,最左边的为程序入口页面,它们间的线条指向为它们间可跳转的方向。...大家想到的应该都是bundle,将传递的数据填入到bundle中。没错Navigator提供的navigate方法可以进行传递bundle数据?...,它其中包含了传递过来的页面数据。
的动作,这个是我们之前在导航视图中配置好的,会导航到SecondFragment。...注意首先通过findNavController()来获取一个NavController对象,然后调用它的navigate函数即可,当然这个函数有多种重载,比如可以传递参数,如下: public void...是在NavHostFragment的onCreate中创建出来的,是一个NavHostController对象,它继承NavController,所以就是NavController。...除了这个,我们还可以发现当在切换页面的时候,标题栏的返回按钮也会自动显示和隐藏。当导航到第二个页面SecondFragment,返回按钮显示;当回退到首页时,返回按钮隐藏。...除此之外,Google还提供了Safe Args Gradle插件,该插件可以生成简单的对象和构建器类,这些类支持在目的地之间进行类型安全的导航和参数传递。
思考几个问题: 可以在代码中用Bundle传递参数,为什么要在XML去配置 XML中的参数标签,只能设置和读取,无法在XML中跳转是附带传过去,如B页面要求传入name:String,于是在标签中配置,但A去跳转时,无法在XML中传入,只能在代码中定义参数名称和值,那么XML的参数还有何意义?...navigationUp和popBackStack()回退上一级时有什么区别,该如何正确使用 跳转时 有时用的是Action的ID,有时用的是Fragment的ID 他俩到底在什么场景下,区分该将哪个传入方法作为参数...Default Value 为空的时的默认值 更多支持的参数类型: 图片.png 2.2 跳转路由动作 (Action) 图片.png ID 当前跳转动作节点的唯一标识,后续在代码中调用navController.navigation...bundle 设置传递参数 Options设置其他配置参数,如动画,popUpTo等,也就说,在XML中的配置,在代码中都可实现。
了解Navigation使用后,思考几个问题 NavHostFragmnet作为路由容器,是如何解析nav_graph资源文件,从而生成NavGraph对象? 跳转时,路由是如何被执行的?...,将app:navGraph="@navigation/nav_graph解析封装成NavGraph对象,里面包含nav_graph.xml中的所有信息。...抛出异常。找到id对应的节点,找不到抛出异常。...抛出异常 找不到对应的NavDestination,抛出异常 上面就是启动首页第一个页面的导航路由过程,下面路由分到中 ActivityNavigator...抛出异常,找不到对应的NavDestination,抛出异常 Navigation 优缺点 优点: 支持Activity,Fragment,Dialog跳转 safesArgs安全数据传输 允许自定义导航行为
父子组件之间数据交互 7. 数据的交互@click 8. 消息订阅,打破父子组件信息传递的约束 9. 异步请求 10. 路由: 10.1. 定义路由器 10.2....向路由组件传递值 一 10.7. 向路由组件传递值 二 10.8. 编程式的路由导航 11. slot标签 12. Vuex 12.1....父子组件之间数据交互 在拆分组件的时候,本着多个组件共享的数据放在根组件的原则,于是我们把共用的数据放在根组件,于此同时操作这些数据的方法也被我们定义在根组件,子组件想要使用这些数据,想要操作这些数据怎么办呢...像下面那样,进行组件之间的数据传递 在父组件中给子组件传递方法或数据 使用:强制数据绑定的方法,ChildTarget 是我们在 components 模块将子组件映射得来的子组件标签,name 可以是...-- 这里使用插槽占位--> 在父组件中使用:注意啊,下面的组件想往 MyHeader.vue 中的插槽中,传递进去代码片段
NavController:在得知切换目标时,控制NavHost去显示B这个Fragment。 这么一说,你是否有一些理解了呢? 2....Fragment之间跳转并传值 平时在实际的开发中常常会从一个Fragment跳转到另一个Fragment,并且带一些参数过去,之前这些跳转都是比较麻烦的,需要自己去写一些业务逻辑,而且还很容易出问题,...navigate,表示导航的意思,这里面我传入了刚才定义在nav_graph.xml中的action的id。...很明显,跳过去了,不过感觉还少了点什么,因为平常Fragment之间跳转时都会传递参数过去,那么这个也要传参数,而Navigation也提供了这个功能,可以通过Bundle进行传参。...底部导航栏控制Fragment切换 在上面已经添加了底部导航栏,但是这个导航栏还没有和NavHost绑定起来,所以自然就无法在切换底部导航的同时,改变NavHost中的Fragment。
常见的配置选项有 deep 和 immediate,对应原理如下 deep:深度监听对象,为对象的每一个属性创建一个 watcher,从而确保对象的每一个属性更新时都会触发传入的回调函数。...在代码渲染到页面之前,vue会把代码转换成一个对象(虚拟 DOM)。以对象的形式来描述真实DOM结构,最终渲染到页面。...,可以将无用模块“剪辑”,仅打包需要的,使打包的整体体积变小了 更快 主要体现在编译方面: diff算法优化 静态提升 事件监听缓存 SSR优化 更友好 vue3在兼顾vue2的options API的同时还推出了...:声明式导航和编程方式导航 声明式导航方式使用router-link组件,添加to属性导航;编程方式导航更加灵活,可传递调用router.push(),并传递path字符串或者RouteLocationRaw.../foo/:id,在 /foo/1 和 /foo/2 之间跳转的时候, // 由于会渲染同样的 Foo 组件,因此组件实例会被复用。
(在本例中,此值为 false,因为系统已将扩展布局插入 container,而传递 true 值会在最终布局中创建一个多余的视图组。) 接下来,需将该片段添加到您的 Activity 中。...向 FragmentTransaction 添加更改的顺序无关紧要,不过: 必须最后调用 commit()。 如果要向同一容器添加多个片段,则添加片段的顺序将决定它们在视图层次结构中出现的顺序。...Fragment 替代 TabActivity 做导航,性能更好。 Fragment 在 4.2.版本中新增嵌套 fragment 使用方法,能够生成更好的界面效果。 3....Fragment与Activity之间是如何传值的 Activity向Fragment传值: 将要传的值,放到bundle对象里; 在Activity中创建该Fragment的对象fragment, 通过调用...fragment.setArguments()传递到fragment中; 在该Fragment中通过调用getArguments()得到bundle对象,就能得到里面的值。
可迭代对象分为两大类,一种是实际保存的序列,即列表、元组,字符串;另一种就是我们上一节总提到的“不一次性产生所有结果列表,而是可以在for循环中按需一次产生一个结果的对象”。...2.迭代器 我们注意到,这一小节的标题中还有一个词叫做迭代器,他俩放在一起容易把人弄迷糊,他们之间的关系,相信你看完下面一段介绍就会很清楚了: 2.1.迭代器与可迭代对象的关系 可迭代对象支持内置函数iter...函数,不断的依次获取元素,并在捕捉到StopIteration异常时确定完成迭代,这就是完整的迭代过程。...,先把可迭代对象转换成迭代器,然后用next方法进行手动迭代,迭代到最后出现StopIteration异常退出。...节:函数参数的传递、修改、匹配与解包过程全解析 第11节:函数闭包与装饰器用法详解 第12节:异常的处理方式
ViewController可以验证来自视图的输入,然后以数据对象需要的格式打包输入,但是应该最小化ViewController在管理实际数据中的角色。...UIKit期望您以规定的方式使用ViewController。 维护正确的ViewController关系可确保自动行为在需要时传递给正确的ViewController。...例如,UINavigationController对象显示来自子ViewController的内容以及由导航控制器管理的导航栏和可选工具栏。...在呈现ViewController时,UIKit会在呈现ViewController和呈现的ViewController之间创建一个关系,如图所示。...在两个ViewController需要来回传递或传递数据的情况下,他们应该始终使用明确定义的公共接口来实现。 代理设计模式经常用于管理ViewController之间的通信。
为了减少播放列表膨胀,一旦媒体播放列表中的部分片段从 live edge 中超过 3 个目标持续时间,服务器就会将其从媒体播放列表中删除。...您可以使用新的 EXT-X-PART 标记将部分片段添加到媒体播放列表中。你可以在父段边界处放置其他视频段标记(如EXT-X-DISCONTINUITY)。...当客户端发出 HTTP GET 请求媒体播放列表更新时,它可以添加称为传递指令的特殊查询参数,以指定相应的播放列表进行增量更新。然后服务器保留请求(块),直到包含该片段的播放列表版本可用。...阻止播放列表重新加载,可消除播放列表轮询。 预加载提示和阻塞媒体下载 在全球范围内交付低延迟流时,消除不必要的往返至关重要。...提供报告的副本 在低延迟播放时,客户端必须能够以最少的往返次数切换格式副本,以便执行比特率自适应。为支持此功能,服务器会将主播放列表中其他格式的副本报告添加到每个媒体播放列表中。
代码膨胀 【代码膨胀】是代码、方法和类,它们的规模已经增加到了难以处理的地步。通常,这些异味不会立即出现,而是随着程序的演化而积累(尤其是当没有人努力根除它们的时候)。...提取方法 问题:你有一个可以组合在一起的代码片段。 解决方案:将此代码移动到一个单独的新方法(或函数),并用对该方法的调用替换旧代码。 内联函数 问题:当方法主体比方法本身更明显时,请使用此技巧。...解决方案:用新算法替换实现算法的方法体。 在对象间移动功能 即使你在不同的类之间,以不太完美的方式分布了功能,仍然存在希望。...引入参数对象 问题:你的方法包含一组重复的参数。 解决方案:用对象替换这些参数。 移除设置方法 问题:字段的值应该只在创建时设置,之后任何时候都不能更改。 解决方案:删除设置字段值的方法。...解决方案:抛出一个异常。 用测试替换异常 问题:在一个简单的测试就能完成任务的地方抛出异常? 解决方案:用条件测试替换异常。
componentWillReceiveProps 在组件接收到一个新的 prop (更新后)时被调用。这个方法在初始化render时不会被调用。...在组件接收到新的props或者state时被调用。在初始化时或者使用forceUpdate时不被调用。 可以在你确认不需要更新组件时使用。...componentWillUpdate在组件接收到新的props或者state但还没有render时被调用。在初始化时不会被调用。 componentDidUpdate 在组件完成更新后立即调用。...render 事件机制 Touchable组件 设置是否监听,冒泡方式传递(html的子节点向根节点传递) View.props.onStartShouldSetResponder: (evt) =...创建react项目(需要安装create-react-app,否则执行的时候会出现ssl连接错误提示) react和vue react拆分html到不同的对象,封装性更好,和html很难混用,vue和html
问题 我发现 copy-and-swap 这个名词在很多地方都出现, What are your favorite C++ Coding Style idioms: Copy-swap Copy constructor...一,防止做无用功;二,防止自赋值时出现问题(看上面的代码就知道了)。但是这种检查没什么意义,因为很少出现,加上它反而徒增消耗。...如果管理多个资源,那么这里的代码就会变得膨胀。(译注:这里的冗余应该是指与复制构造函数的代码实现有重复。)...赋值运算符(=)的参数是值传递,这样可以在进入函数体内部的时候就已经实现内存的申请和对象的复制,避免了代码冗余,而无异常的 swap 可以提供强异常安全保证,至于自赋值,这里就更不存在了,因为函数体内部的对象完全是一个新对象...,具体可以参考, 引用传递的弊端 aliasing 的解释 aliasing 的弊端 在 C++ 11 中有何变化 进入 C++ 11 时代,三法则就变为了五法则,多了 移动语义。
领取专属 10元无门槛券
手把手带您无忧上云