△ 左图: 平板电脑的竖屏模式 (单窗格)。右图: 平板电脑的横屏模式 (双窗格)。 我们采用了 SlidingPaneLayout,它为上述问题提供了一个直观的解决方案。...我们可以用某窗格的 NavController 来管理该窗格内包含的各个目的页面,比如会议详情、讲师详情。...上面这些情况都可以在 OnBackPressedCallback 中处理,这个回调在双窗格 Fragment 的 onViewCreated() 方法执行时会被注册 (您可以在这里了解更多关于添加 自定义导航..., private val detailPaneNavController: NavController ) : OnBackPressedCallback(false), SlidingPaneLayout.PanelSlideListener...欢迎您 点击这里 向我们提交反馈,或分享您喜欢的内容、发现的问题。您的反馈对我们非常重要,感谢您的支持!
了解Navigation使用后,思考几个问题 NavHostFragmnet作为路由容器,是如何解析nav_graph资源文件,从而生成NavGraph对象? 跳转时,路由是如何被执行的?...NavController: 外部调用的入口,提供路由,回退等核心操作 NavDestination 节点的封装类对应nav_graph.xml文件中的 , </fragment...NavController中的navigation()会转到它的子类,包括NavGraphNavigator,ActivityNavigator,FragmentNavigator,DialogFragmentNavigator...总结如下: NavHostController 这个类没啥实际作用,就是为了和NavHostFragment形式上同样,真正的实现都在父类NavController中 想要自定义自己的Navigator...就是Map的key NavHostController 这个类没啥实际作用,就是为了和NavHostFragment形式上同样,真正的实现都在父类NavController中 有需求要拦截返回键,做我们想做的事情
概述 OnBackPressedDispatcher 解决了什么问题: 在 Activity 里可以通过回调方法 onBackPressed() 处理,而 Fragment / View 却没有直接的回调方法...public void addCallback(LifecycleOwner owner, OnBackPressedCallback onBackPressedCallback) 3、判断是否有启用的回调...OnBackPressedDispatcher 源码分析 OnBackPressedDispatcher 源码不多,我直接带着问题入手,帮你梳理 OnBackPressedDispatcher 内部的实现原理...另外,添加回调的 addCallback() 方法也要求在主线程执行,分发器内部使用非并发安全容器 ArrayDeque 存储回调对象。...3.4 OnBackPressedCallback 可以同时添加到不同分发器吗? 答:可以。 3.5 加入返回栈的Fragment 事务,如何回退?
一、非静态内部类: 1、变量和方法不能声明为静态的。(类的编译顺序:外部类–静态方法或属性–内部类,如果内部类声明为静态的,造成编译顺序冲突。...个人理解) 2、实例化的时候需要依附在外部类上面。比如:B是A的非静态内部类,实例化B,则:A.B b = new A().new B(); 3、内部类可以引用外部类的静态或者非静态属性或者方法。...二、静态内部类: 1、属性和方法可以声明为静态的或者非静态的。 2、实例化静态内部类:比如:B是A的静态内部类,A.B b = new A.B(); 3、内部类只能引用外部类的静态的属性或者方法。...比如B是A的静态内部类,b()是B中的一个静态属性,则可以:A.B.b(); 三、关于java静态方法的相关总结: 一个类的静态方法只能访问静态属性(静态方法是属于类的,而普通方法是属于对象的。)...”,当然也不能使用”super”; 静态方法不能被非静态方法覆盖; 构造方法不允许声明为 static 的; 局部变量不能使用static修饰; 问题:为什么一个类的静态方法只能访问静态属性或静态方法
# 解决redis集群内部ip问题 # 背景 服务上云,内网的redis集群,通过ip映射的方式把redis的端口映射到公网(白名单),公网的机器通过lettuce等客户端连接的时候,lettuce客户端的集群模式是先通过...cluster nodes 获取节点拓扑 ,在操作key的时候先通过算法定位到key在哪个节点,获取key如果重定向到其它节点的话,就会从对应的节点获取。...这就会导致获取到的ip是内网的ip,公网连接不上的问题,以下是通过iptables的方式解决。...1 0 0 RETURN all -- docker0 * 0.0.0.0/0 0.0.0.0/0 访问正常,因为网络是通的了
fragmentA.handleBackPressed()) { super.onBackPressed() } } } 这个策略的问题也是很明显 不符合单一职责原则...,一个新的activityB,有类似的场景,还是需要专门处理 方案2 - 采用系统方案 AndroidX库内部,也提供了一个现成的方案,代码如下 class BaseFragment : Fragment...,最终使我抛弃使用了 先看下系统内部的实现代码 @MainThread public void onBackPressed() { Iterator<OnBackPressedCallback...= null) { mFallbackOnBackPressed.run(); } } 内部会判断callback.isEnabled(),如果是true...,就强制拦截,false就什么都不做,这样设计有什么问题呢?
MailOperationContent.MailAttachmentInfo(); 但是编译报错 这个时候就会出现编译错误:"xxx.OuterClass" is not an enclosing class 解决办法:若要创建内部类的实例...,需要有外部类的实例才行,或者是将内部类设置为静态的。...方法一: mailAttachmentInfo = new MailOperationContent().new MailAttachmentInfo(); 方法二:将内部类设置为静态的 @Data
Navigation是一种导航的概念,即把Activity和fragment当成一个个的目的地Destination,各目的地形成一张导航图NavGraph,由导航控制器NavController来统一调度跳转...和导航控制器 NavigationUI.setupWithNavController(navView, navController); } } 代码大致就这些,接下来看看内部实现...); } }); //在目的地发生切换的时候,更新底部导航的选中状态,先不看 navController.addOnDestinationChangedListener...ft.replace(mContainerId, frag); //提交事务 ft.commit(); } 这里可以看出一个问题,每次切换目的地,fragment是反复销毁重建的,按照谷歌推荐的...1个APP只需1个activity的思路开发,这样是没问题的,但是这里的fragment是作为首页的3个常驻页面,我们是希望能够保存起来的,毕竟,销毁重建需要重新请求网络数据,重新初始化view,严重影响用户体验
本篇文章主要介绍下我在项目中遇到的问题,以及目前关于Navigation实现的一些探讨。...但是我在使用的时候发现,当一个Fragment中的布局稍微复杂一些,切换Fragment的时候会顿卡,而且如果再配合DrawrLayout使用的话,还会闪一下屏,效果体验不是很好,本着这个问题,我又再次对...所以…还是看源码吧: 2.1 NavController private void navigate(@NonNull NavDestination node, @Nullable Bundle args...对于这个问题其实根据上面的分析,也能大概想到是因为什么,但是返回按钮的操作我之前还真没有看过源码,所以这次顺便了解一下: 3....我还发现一个问题,就是Play商店,现在就是这样的情况,抽屉栏中的Item每个基本都是重新绘制,而且第一个Item我的应用和游戏切换的时候就会有很明显的卡顿和闪屏,猜测Google play 商店具体是不是使用的
中)注册 OnBackPressedCallback。...根据您的需要,您可以在任意位置定义 OnBackPressedCallback,使其可复用,或根据应用程序的架构进行任何操作。...从 AndroidX SavedState 1.0.0(它是 AndroidX Activity 和 AndroidX Fragment 内部的依赖。...FragmentFactory Fragment 最常提及的问题之一是不能使用带有参数的构造函数。...现在,您可以通过指定 FragmentFactory 类来减少 Fragment 创建过程中的类似问题。
进行展示的 3.NavController:用于在代码中完成Navigation Graph中具体的页面切换工作 当想要切换Fragment时,使用NavController对象,指定跳转Navigation...中设置一个点击事件,使用NavController进行fragment跳转,通过内部任意一个View就能获取NavController对象 HomeFragment package com.aruba.navigation...(); } 2.跳转动画 添加Fragment的跳转动画比较简单,只需要在NavigationGraph中的action添加即可 image.png 3.参数传递 NavController...的navigate方法可以传递一个bundle,接受的Fragment和以前一样可以用getArguments方法获取: //Activity中绑定后,可以通过内部任意一个View获取NavController...("name", "张三"); //指定跳转的fragment,即navigation graph中的action navController.navigate(R.id.action_homeFragment_to_detailFragment
,就可以用内部类解决这个问题 而如果此时这个作为返回值的内部类不需要引用外围类对象的话,就可以加上STATIC 静态内部类 取消产生内部类的作用 因为内部类对象总有一个隐式引用,它指向了创建它的外部对象...当你使用了静态Static来修饰这个内部类的时候,这个引用将被取消。...也就是有这样一个特性: 静态内部类的对象除了没有对生成它的外围类对象的引用特权外,与其他所有内部类完全一样 接下来我们看看java技术核心提供的代码: 内部类: package org.innerclass.operate...,因为外部类对象是在静态方法中构造这个内部类的对象的。...如果没有static,表示这个内部类是静态内部类,那么编译器将会给出错误报告: 没有可用的隐式ArrayAlg类型对象初始化内部类对象
dispatcher的 onBackPressed: Iterator iterator = mOnBackPressedCallbacks.descendingIterator...= null) { mFallbackOnBackPressed.run(); } 这里可以看到会把第一个可以触发的 OnBackPressedCallback 触发。...注意这里的iterator是降序拿的,也就是后跳的页面先处理。...owner, @NonNull OnBackPressedCallback onBackPressedCallback) { onBackPressedCallback.addCancellable...(onBackPressedCallback); onBackPressedCallback.addCancellable(cancellable); 这里把回退的回调添加到分发对象中。
中)注册 OnBackPressedCallback。...根据您的需要,您可以在任意位置定义 OnBackPressedCallback,使其可复用,或根据应用程序的架构进行任何操作。...从 AndroidX SavedState 1.0.0(它是 AndroidX Activity 和 AndroidX Fragment 内部的依赖。...FragmentFactory Fragment 最常提及的问题之一是不能使用带有参数的构造函数。...现在,您可以通过指定FragmentFactory 类来减少 Fragment 创建过程中的类似问题。
系列——进阶篇 作者 大家好,我叫小琪; 本人16年毕业于中南林业科技大学软件工程专业,毕业后在教育行业做安卓开发,后来于19年10月加入37手游安卓团队; 目前主要负责国内发行安卓相关开发,同时兼顾内部几款...成员变量,mNavController就是前篇文章中提到的管理导航的navController对象,只不过它是继承自NavController的,戳进去构造方法,发现调用了父类的构造方法,再戳进去来到了...,也就是一个个页面,NavGraph内部有个集合mNodes,用来保存一组NavDestination。...至此我们具体分析了两个重要的步骤,一个是navigator的,一个是nav_graph.xml是如何被解析并关联到navController,弄清楚这两个步骤,对接下来的分析大有帮助。...有个mNavController成员变量,它是一个NavController对象,最终页面导航都是通过调用它的navigate方法实现的 mNavController内部通过NavigatorProvider
本篇文章中,码匠将带您深入探讨内部系统 UI 设计,具体我们会介绍内部系统界面设计以及它所面临的挑战。企业内部系统界面设计有何不同首先,让我们看一下有效的内部系统界面在公司环境中扮演的角色。...你可能想问,to C 的软件界面与交互设计也要考虑这些,那它们与 to B 的内部系统相比,在界面设计上有何不同?一个区别是,内部系统主要用于满足公司组织的需求而不是单个用户的需求。...图片内部系统界面设计所面临的挑战从设计的角度来看,企业工具的设计会面临很多不一样的挑战,设计团队需要应对在其他组织中不太常见的额外限制和痛点。以下是内部系统 UI 设计中会出现的 6 个关键问题。...复杂性在内部系统中,业务流程通常更加繁复与多变,这使得界面与交互设计变得非常复杂,如多数据状态、指标可视化、权限、多用户协作以及其他工具的集成等,内部系统的复杂度通常高于其他的应用程序。...图片安全性无论是在处理复杂的合规标准的层面上,还是避免成为黑客和网络犯罪分子攻击目标的问题上,内部系统往往有更高的安全需求。
隐秘的访问方法需要拥有包的可见性,所有攻击代码需要与被攻击类放在同一个包中。...当使用了内部类的时候,编译器做了这样一件事: 它在外围类添加了一个静态方法 static boolean access$0(外部类); 内部类方法将调用这个函数 这个是有风险的,因为任何人都可以通过access...$0方法很容易的读取到外围类的私有域 黑客可以使用十六进制编辑器轻松创建一个用虚拟机指令调用这个函数的类文件。...结论就是: 如果内部类访问了私有数据域,就有可能通过附加在外围类所在的包中的其他类访问它们。 请慎用!
内部类的概述: 把类定义在另一个类的内部,该类就被称为内部类。 举例:把类B定义在类A中,类B就被称为内部类。...内部类的访问特点: A:内部类可以直接访问外部类的成员,包括私有成员。 B:外部类要想访问内部类成员,必须创建内部类的对象,通过内部类的对象去访问。 示例代码如下: ?...内部类的分类(内部类的位置): ?
1.1 nsenter介绍 1.1.1 命令介绍 在docker中,为了尽可能缩减镜像大小,常常不会包含一些常用的工具,类似ping,curl,tcpdump等,虽然精简了镜像,但如果我们需要在容器内部测试网络联通性时...其实容器内部和主机之间的网络环境是互相隔离的,处于独立的命名空间下,那如果能在主机上切换命名空间,就可以在主机上以容器的网络环境进行操作,就可以利用主机上的工具,利用这个思想,我们就能够实现不用进入容器内部也可以实现容器内部一样的环境...很多时候我们需要知道容器内部解析的域名ip信息,如果没有这些工具,本来很简单的事就变得很麻烦,通过以下步骤就可以通过nsenter解决以上问题 1.1.2 使用方法 第一步获取容器的PID // 方法一...State.Pid}}' 23069 第二步使用命令nsenter 进入空间 // 根据id进入空间 [root@VM-4 ~]# nsenter -n -t23069 // 这个时候我们就已经有了容器内部的环境...,这里的pid=23069的容器的ip是10.0.0.2,可以看到已经打印出来了。
) { Text("执行了${count}次") } } 效果: 3.rememberUpdatedState LaunchedEffect一旦启动,同一个key其内部的方法调用和引用都是...,所以此时无论外部变量的引用发生如何改变,并不会改变LaunchedEffect内部变量的引用 rememberUpdatedState在remember的基础上做了更新值处理,每次调用到rememberUpdatedState...时,将值更新,也就是引用的值的更新,此时不管外部变量还是LaunchedEffect内部变量的值引用都会发生变化,LaunchedEffect调用的自然就是最新的方法了,下面是rememberUpdatedState...接下来使用navController来导航到不同的可组合项,下面是官方给出的示例的几种方式: 在导航到“friendslist”并加到返回堆栈中 navController.navigate("friendslist...("home") { inclusive = true } } 只有当我们还不在“search”时,才能导航到“search”目标地,避免在后堆栈的顶部有多个副本 navController.navigate
领取专属 10元无门槛券
手把手带您无忧上云