>>>> Navigation to a destination 要导航到目的地,您可以使用下列四种方法之一: Navigation.findNavController(Activity, @IdRes...(view).navigate(R.id.confirmationAction, bundle); 在您的接收目标的代码中,使用getArguments()方法获取 TextView tv = view.findViewById...arguments.getString("myarg") 注意: 根据官方文档说明,为了保证导航的正确使用,我们需要在目标的Activity中重写onSupportNavigateUp,以确保导航器能够正确的回退栈...实例,并且给根布局设置一个tag,所以在每次findNavController的时候都会通过这个tag取唯一的实例,如果取不到会循环从父布局在去找。...Navigator是一个抽象类,提供navigate、popBackStack抽象方法,指定导航和回退导航,而ActivityNavigator和FragmentNavigator才是实现类,最终的导航行为都是他们负责实现
使用 Navigation 组件 , 必须导入 Navigation 依赖 , 不同的开发语言导入不同的依赖 : 使用 Java 语言 开发 Navigation 导航 , 导入如下依赖 : dependencies..., 这里将 FragmentA 和 FragmentB 都纳入到 Navigation 导航管理中 ; 创建后可以通过拖动鼠标 , 设置 Navigation Graph 中两个 Fragment...调用上面的两个跳转 , 分别实现两个 Fragment 之间的跳转 ; 5、创建 NavHostFragment NavHostFragment 设置在 Activity 的布局文件中 , 一般是为...在 Activity 中通过 调用 findNavController 函数 , 获取 NavController , 然后通过该 NavController 变量进行导航 ; fragmentContainerView...NavController 并进行导航 在 Activity 中通过 调用 findNavController 函数 , 获取 NavController , 然后通过该 NavController
对应的 action 的导航路线走 navController.navigate(R.id.action_fragmentA_to_fragmentB, args) 最后 , 在跳转后的界面中 , 调用...name = Tom , age = 18 2、使用 Bundle 传递数据安全性差 使用 传统的方式 , 在 Fragment 之间 传递 数据 , 类型很不安全 , 设置 传递的数据时 , 需要设置...("NAME", "Tom") this.putInt("AGE", 18) } 上面的代码中 , 向 Bundle 中设置了如下两个数据 : 设置了 String 类型的数据 , 名称是 “NAME..., 使用传统的方式配置 Gralde 编译过程中使用到的插件 ; 下面的章节中 , 可以查看该 settings.gradle 配置的完整源码 ; 配置如下 : buildscript { repositories...androidx.navigation.safeargs 插件 , 该依赖使用新方式配置无法成功下载 , 这里直接使用老的配置方式 ; dependencyResolutionManagement 中配置的是依赖库的下载地址
顶部应用栏 / 抽屉式导航栏 / 底部导航栏中 的界面导航 ; 本篇博客中介绍一种使用场景 : 使用 AppBar 中的菜单选项控制 Navigation 界面跳转 ; 在 Activity 中 ,...使用 Navigation 组件 切换 Fragment 界面时 , 除了进行界面切换之外 , 不同的界面对应的顶部 标题栏 AppBar 需要进行相应的改变 ; Navigation 组件中 , 提供了...NavigationUI 导航 只显示菜单是不行的 , 还需要设置菜单的行为 , 重写了该方法 , 菜单选项才能生效 , NavigationUI.onNavDestinationSelected(item..., navController) 代码的含义是 : 优先使用 NavigationUI 进行导航 , 如果跳转失败 , 再使用传统的方式执行默认动作 , 代码为 super.onOptionsItemSelected...> b、FragmentB 界面的 Kotlin 源码和布局文件 在该界面中 , 设置了 隐藏 AppBar 中的 菜单按钮 的功能 , 跳转到 FragmentB 之后 , 右上角 就不再显示菜单按钮
起初,我以为它是用来代替 startActivity 的,但其实并不是,大家往下看就知道它的作用了。...Fragment 现在,我们第一个页面是 MainFragment,而 Fragment 需要 Activity 作为容器,修改 MainActivity 的布局: 的简单配置就算完成了,接下来看如何使用它。...此外,还可以在 Navigation 的 xml 文件中配置传参,但这种方式目前支持的数据类型比较少,连 boolean 都不支持,而且我还碰到了 bug,所以目前不建议用。...这一切联系起来,是不是能说明官方间接支持了「少用 Activity 多用 Fragment」的做法?你怎么看?
设置 App Bar 标题:使用 setTitle() 方法设置 App Bar 的标题。 设置 App Bar Logo:使用 setLogo() 方法设置 App Bar 的 Logo。...二、Navigation 特点 Navigation 提供了 可视化的 页面导航图 , 与 iOS 开发中的 Xcode 环境中的 StoryBoard 类似 ; 在 布局文件 的 Design 模式下..., 完成 Fragment 之间的导航 ; 如果要 为 Fragment 跳转设置动画 , 可以直接在 Navigation 图形化界面中选中某个跳转 , 然后直接在 布局文件的 Design 图形化界面中...中定义的 Fragment 页面 需要通过 NavHostFragment 进行展示 ; NavController 组件 : 该组件是 NavHostFragment 中的管理对象 , 用于管理应用中的导航操作...: 使用 NavController 组件 切换 Fragment , 设置 要跳转的 定义在 Navigation Graph 中定义的 Fragment ; NavController 组件 会将
Navigation 是 JetPack 中的一个组件,用于方便的实现页面的导航,所以抽象出了一个 destination 的概念,大部分情况一个 destination 就表示一个 Fragment,...但是它同样可以指代 Activity、其它的导航图。...多个 destination 连接起来就组成了一个导航图,类似于一种栈结构,页面先进先出。destination 之间的连接叫做 action。 概念略抽象,下面看具体的应用。...navigation_add2.png 直接在右侧设置 id,label 等。...的参数可以是一个 destination(这里就是 fragment 在导航图 nav_graph 中的 id),也可以是 action 的 id。
DialogFragment隐藏导航栏 在 Android 中,使用 DialogFragment 显示对话框时,如果您希望隐藏系统导航栏(如状态栏和导航键),可以通过设置相关的系统 UI 标志来实现。...以下是一个完整的例子,展示了如何在 DialogFragment 中隐藏系统导航栏(使用 Kotlin): import android.os.Bundle import android.view.View...onViewCreated 方法中设置系统 UI 的可见性标志,可以实现隐藏系统导航栏的效果。...Dialog中隐藏导航栏 在 Android 中,如果想在 Dialog 中隐藏系统导航栏(包括状态栏和底部的导航键),可以通过设置窗口属性来实现。...在创建 Dialog 时,可以使用 Window 类提供的一些标志来隐藏导航栏。
getLayoutInflater()); // 调用setContentView方法显示视图界面 setContentView(binding.getRoot()); // 设置对工具栏...ToolBar的支持 setSupportActionBar(binding.toolbar); NavController navController = Navigation.findNavController...·····省略部分代码 } MainActivity 继承于AppCompatActivity,并重写了onCreate方法,AppCompatActivity类是Android Studio中默认的构建自定义...它们两个是用来控制图7中的点击按钮的。...v7系统新增的布局,具有便于协调子布局的特点,该布局是增强版的FrameLayout布局,它通常与ToolBar和FloatingActionButton合用。
流程代码 1.点击跳过导航页面,进入登录页面 2.输入用户名和密码,点击登录 3.进入页面点击同意,点击研迅 4.模拟手势,上移 准备工作 安装【考研帮】 ?...2.设置-应用-点击【考研帮】-清除数据 ? 启动【考研帮】 ? 启动直接adb中的uiautomatorviewer.bat 记得看看下载源码包里面的增强版 ?...: x = driver.get_window_size()['width'] y = driver.get_window_size()['height'] return(x,y)#导航点击跳过...2.python在运行过程中如果进行uiautomatorviewer加载会报错 3.python在使用的过程中需要先引入 from appium import webdriver from selenium.webdriver.support.ui...get_size() x1 = int(l[0]0.5) y1 = int(l[1]0.75) y2 = int(l[1]*0.25) driver.swipe(x1,y1,x1,y2) PS:最后实现了如何从登陆到点击研迅
而Android开发中的自定义控件也是继承自View, 但是今天我们的自定义控件是继承自FrameLayout, 在此基础上我们自定义一些东西。...因为FrameLayout, LinearLayout等布局方式都是继承自ViewGroup的,而ViewGroup则继承自View, 所以在自定义控件时,继承自FrameLayout等布局方式肯定是可以的...实现效果分析 接下来我们要自定义一个导航栏,而这个导航栏是模仿iOS系统中的NavigationBar。因为Android开发中没有这个控件,所以我们需要自定义这个控件供开发者使用。...这两者上面放了一个透明的Button, 用来实现返回操作。中间的Title(TextView) 在FrameLayout中设置成居中显示即可。...经过上面的过程,我们自定控件以及实现好了,接下来就是如何使用了。
布局 TabHost、TabWidget、FrameLayout的id必须是系统定义的, 因为可以直接get获取控件,上面的Tab标签一般不写原生的,自己写。...把原生的TabWidget隐藏,用了个垂直的LinearLayout写, 下面是FrameLayout,也是TabHost必须写的 代码: 阴影图片默认是这样的,用动画去动态的变化位置,其实图片还是在那了,只是个动画 ?...int left = llConversation.getLeft();// 获得llConversation 在他的父view中左边距 layoutParams.leftMargin...=left; // 将 llConversation的父view的宽度,设置给 itemLength,需要动态的变化 itemLength = ((ViewGroup)llConversation.getParent
比如我们常见的布局,底部导航,然后每个模块对应不同的 Fragment。其实也是完全可以不使用 Fragment 的,一个页面中包含各个模块的布局,然后通过点击导航来决定隐藏哪些模块。...的声明周期,这一点和 Activity 不一样,Activity 会因为新 Activity 而走生命周期。...而 .add 不会。...动态添加,一般都会选择加载到 FrameLayout 布局上,是因为 FrameLayout 布局足够简单,可以减少不必要的布局加载。...Fragment 的布局只是附着在 FrameLayout 上,作为 FrameLayout 的 子 View ,并没有取代 FrameLayout FrameLayout android
前面的文章介绍了如何实现广告轮播的Banner效果,本想可以告一段落。然而某天产品经理心血来潮,拿着苹果手机,要求像iOS那样把广告图顶到状态栏这儿。...可见这真不是一个省油的灯,许多人用的App尚且未能解决悬浮状态栏的兼容性问题。...,例如调用Window对象的setStatusBarColor方法即可设置顶部状态栏的背景色,调用Window对象的setNavigationBarColor方法即可设置底部导航栏的背景色。...View decorView = window.getDecorView(); // 两个标志位要结合使用,表示让应用的主体内容占用系统状态栏的空间 // 第三个标志位可让底部导航栏变透明...Build.VERSION_CODES.LOLLIPOP) { activity.getWindow().setStatusBarColor(color); // 底部导航栏颜色也可以由系统设置
一般在需要用户等待的场景,显示一个Loading动画可以让用户知道App正在加载数据,而不是程序卡死,从而给用户较好的使用体验。...font> 在BaseActivity/BaseFragment的子类中可通过上一步的封装比较方便地使用加载状态显示功能 这种封装的好处是通过封装动态地创建LoadingView并添加到指定的父容器中,...时,动态新建一个FrameLayout布局 将原View从ParentView中移除,并用它的LayoutParams将FrameLayout添加到ParentView中替代原View在ParentView...时,由于View尚未添加到任何容器中,并无getParent()返回null,此时需要用动态生成的FrameLayout代替原View作为方法的返回值返回 上代码更容易理解: public Holder...,将加载失败点击重试的点击功能放在Adapter.getView中实现 与Android系统中的Adapter不同的是,我们的Adapter是全局使用的,而失败重试所需执行逻辑每个页面都不一样 因为Holder
一般在需要用户等待的场景,显示一个Loading动画可以让用户知道App正在加载数据,而不是程序卡死,从而给用户较好的使用体验。.../BaseFragment的子类中可通过上一步的封装比较方便地使用加载状态显示功能 这种封装的好处是通过封装动态地创建LoadingView并添加到指定的父容器中,让具体页面无需关注LoadingView...,动态新建一个FrameLayout布局 将原View从ParentView中移除,并用它的LayoutParams将FrameLayout添加到ParentView中替代原View在ParentView...时,由于View尚未添加到任何容器中,并无getParent()返回null,此时需要用动态生成的FrameLayout代替原View作为方法的返回值返回 上代码更容易理解: public Holder...,将加载失败点击重试的点击功能放在Adapter.getView中实现 与Android系统中的Adapter不同的是,我们的Adapter是全局使用的,而失败重试所需执行逻辑每个页面都不一样 因为Holder
,而调用这个方法的结果就是把 textView加入到此ViewGroup里面,比如说: val frameLayout = findViewByIdFrameLayout>(R.id.fl_container.../ViewGroup的地方就可以使用Anko,而Anko的作用也就是简化初始化View + AddView的流程。...比如说我已经用XML写好了页面的布局,然后我们需要根据代码在其中一个FrameLayout中动态添加一些东西。我们就可以拿到这个FrameLayout的引用,然后就可以用anko大展拳脚了。...比如说在布局里面加一个if就可以来操作一个控件的布局与否,而不是在findView之后控制Visibility,可以用Kotlin的闭包来封装一个View的初始化操作什么的,重复的操作就可以封装起来,再比如...当然Anko因为避免了反射,提高了大量的性能。 DSL和XML并不是冲突的,DSL用于解决布局中细碎和动态的部分,而XML用于单页布局,复杂布局。
Wear UI 智能手表相对手机来说,由于使用场景不同,且屏幕较小,所以应用的设计、交互和手机是有些区别的。相对来说,布局会更简洁,更多地使用滑动手势进行操作。...导航栏 WearableNavigationDrawerView 就是用来解决这个问题的,我们先看看它的效果: 从手表顶部向下滑,会出现一个导航栏,显示当前页面的图标和标题。...下面来看看它的用法,我们修改布局文件,使用 WearableDrawerLayout 作为根布局,添加导航栏控件: 设置 menu 文件,它会以列表的形式展示可操作项,布局中这么写: 中设置自己想要的布局了,其他用法都和上面是一样的。
而下面的步奏则是根据 //用户设置的Feature来创建相应的布局主题。...//这也就是为什么我们在代码中设置Theme或者requesetFeature()的时候必须在setContentView之前的原因....id为statusBarBackgroud和id为navigationBarBackground的View,分别表示手机的顶部的状态栏和手机底部的导航栏。...在setContentView中,PhoneWindow的setContentView方法中的下面两种方式都把这个FrameLayout作为了main_activity.xml的根视图: 1. mLayoutInflater.inflate...这里的mContentParent指的是屏幕显示的内容区,而我们设置的activity_main.xml布局实际上是在一个id为content的FrameLayout中的,这个FrameLayout也就是前面一直提到的
这里我们主要针对视频的大小和旋转角度设置TextureView的大小,详细就不多说了(不是懒),挑其中一类讲讲,因为主要也是这个。...这里有一个是TextureView的动态添加,动态添加的好处是你可以在不停止视频的情况下载不同的逻辑播放器中切换视频播放,比如列表全屏。...然后新创建一个GSYVideoPlayer2,只有把这个G2添加到window下FrameLayout。 设置它的播放状态和当前列表这个逻辑播放器一致。...} //设置全屏逻辑播放器的状态,动态及添加播放view gsyVideoPlayer.setUp(mUrl, mCache, mObjects); gsyVideoPlayer.setStateAndUi...接入简单,使用简单,你可以趾高气扬的和产品说,这个so easy了。
领取专属 10元无门槛券
手把手带您无忧上云