app的底部菜单栏是非常常见的,微信/qq/支付宝/糯米等都有这样的底部菜单栏,在我们日常的开发过程中也是会经常用到的,下面就是一种实现方式,供大家参考。...Activity中使用了,这里我们采用Activity+Fragment的方式实现布局的切换。..." > 然后创建Fragment,有几个菜单项就创建几个Fragment,这里我使用了三个菜单项,创建的fragment依次是...color> #4CAF50 到这里整个底部菜单栏就完成来,看起来是一大堆的代码,其实很好理解,就是使用一个自定义的布局和...Fragment结合来实现的,自定义布局我们都要理解,Fragment使用方式我们更要熟悉。
BottomNavigationBar和其他控件的配合是完全解耦的,日常使用分为BottomNavigationBar+ViewPager 、BottomNavigationBar+FrameLayput...1 使用 BottomNavigationBar+ViewPager 直接上代码 ViewPager android:id="@+...findViewById(R.id.bottom_navigation_bar); String[] mTitles = new String[]{"首页", "发现", "信息", "我的...下,为整个空控件的背景色;在 BACKGROUND_STYLE_RIPPLE 下为图标和文本被激活或选中的颜色;默认颜色为Color.WHITE 4.自定义Item颜色Individual BottomNavigationItem...,可以设置为0dp,默认为8dp 6.自定义选项图标BottomNavigationItem Icon Customisations 可以设置选项,选中和未选中使用不同的图标 //setInactiveIcon
BottomNavigationBar和其他控件的配合是完全解耦的,日常使用分为BottomNavigationBar+ViewPager 、BottomNavigationBar+FrameLayput...1 使用 BottomNavigationBar+ViewPager 直接上代码 ViewPager android:id="@+id...findViewById(R.id.bottom_navigation_bar); String[] mTitles = new String[]{"首页", "发现", "信息", "我的...下,为整个空控件的背景色;在 BACKGROUND_STYLE_RIPPLE 下为图标和文本被激活或选中的颜色;默认颜色为Color.WHITE 4.自定义Item颜色Individual BottomNavigationItem...,可以设置为0dp,默认为8dp 6.自定义选项图标BottomNavigationItem Icon Customisations 可以设置选项,选中和未选中使用不同的图标 //setInactiveIcon
好了,,下面我就来实现上图的效果,不过在开始之前,首先你必须已经了解Fragment的用法了,如果你对Fragment还比较陌生的话,建议先去阅读我前面的一篇文章Android开发之漫漫长途 XII——...--关于底层布局我这里使用了Github上的开源项目--> BottomNavigation.BottomNavigationView...其实上面的代码存在性能问题,尤其是在底部导航这种场景中,Fragment之间的来回切换,这里使用的replace方法。关于这个方法带来的问题以及如何进行优化,将在下一节详细说明。...Fragment性能问题分析与解决 Fragment性能问题分析 我们上面是使用replace来切换页面,那么在每次切换的时候,Fragment都会重新实例化,重新加载一边数据,这样非常消耗性能和用户的数据流量...,我们在来回切换的操作中,Fragment只实例一次,少了销毁又重新创建等带来的性能消耗,另我们想要在Fragment中更新数据时,我们可以在自定义Fragment中重写其onHiddenChanged
那么来看看本文中实现的效果是怎么样的。如果不满意,我想也就不浪费你的时间了。 ? ---- 正文 从上面的一些APP主页面,在之前这种页面是通过什么来做的呢?...② Activity + Fragment + RadioGroup(RadioButton) + ViewPager。 相信你在很多的博客上或者自己的项目上看过或者使用过。...它就不报错了,这句话的意思是未使用导航的许可。因为我现在还没有使用这个nav_graph.xml所以要加上这一句话告诉AS,让它放心。等我们真正去使用时,是没有影响的,去不去掉都行。 3....但是这时候又有一个问题,那就是我的这个NavHost初始显示哪一个Fragment,这一点Google的人也想到了,可以在导航图中指明。 打开nav_graph.xml。...而且使用ViewPager的话就是相当于你把BottomNavigationView替换RadioButton或者TabLayout来使用,这种方式也有很多,我就过多的说明了,上高水长,后会有期~
Harmony提供了很多种方式可以实现底部导航栏,真实项目使用的话,大家可以直接使用系统提供的方式即可。...WechatMainFrame整体的界面组合使用RelativeContainer进行组合,将BottomNavigation固定于屏幕的底部,内容区域底部在BottomNavigation之上,顶部和屏幕顶部对其...@Link装饰器不能在@Entry装饰的自定义组件中使用。@Link子组件从父组件初始化@State的语法为Comp({ aLink: this.aState })。...当我们在BottomNavigation中.onClick(() => { this.currentItemIndex = index })在点击之后,会更改@Link currentItemIndex...由于我自己也是在边学边实现功能逻辑,既要写文章,还要实现代码功能,所以更新大体上控制在2~3天更新一篇,文章中尽可能会将我觉得比较重要的知识点拎出来说明。
我们这是一个视频播放页+详情页,考虑到简单快捷,就想到了一个 ViewPager2 就可以实现,简单又快捷,为自己点赞。一想到如此easy,瞬时笑出了猪叫。...就在我以为又可以摸鱼一个ViewPager2就可以搞定之时。突然,产品同学发了新指示,下意识预感不妙。 产品:得加一个第一次使用时的提示啊,要不然用户都不知道页面可以下滑呢?...效果我发你了,你看看: 下图为我实现好的简单样式,大意体会即可。...需要注意的点 就如我上面最开始分析时所述,如果详情页是可滑动的,那么就必须处理一下滑动冲突,相应的方式也很简单,使用内部拦截法,让滑动的View优先获得事件即可,当处于滑动View顶部时,再将事件还给父...后续 当然用ViewPager2去写仍然有种大材小用的感觉,毕竟只有两个item,所以,比较好的方式依然是使用自定义的滑动ViewGroup实现,所以我会在下篇博客来以一个自定义的方式来解决此问题。
Harmony提供了很多种方式可以实现底部导航栏,真实项目使用的话,大家可以直接使用系统提供的方式即可。...这里我采用的方式是自己用最基础的代码实现,这样也能联系到一些想要学习的功能,开箱即用是好的,但是也很容易让我们错过很多关键知识。...WechatMainFrame整体的界面组合使用RelativeContainer进行组合,将BottomNavigation固定于屏幕的底部,内容区域底部在BottomNavigation之上,顶部和屏幕顶部对其...@Link装饰器不能在@Entry装饰的自定义组件中使用。@Link子组件从父组件初始化@State的语法为Comp({ aLink: this.aState })。...当我们在BottomNavigation中.onClick(() => { this.currentItemIndex = index })在点击之后,会更改@Link currentItemIndex
最近我研究了一下Flutter,但是在使用Navigator的时候遇到了一个很头痛的问题,就是当我们去来回切换导航按钮时,Flutter会重新build,从而导致控件重新Build,从而会失去浏览历史。...这个体验肯定是不好的,后来看到了这个文章,终于解决了这个问题。 原文点这里 正文 今天我们将看看Flutter的Navigation。 但不仅仅是任何无聊的Navigation。?...这样我们在切换标签时不会丢失Navigation历史记录。 如下图: ? multiple-navigators-BottomNavigationBar-animation.gif 如何实现此功能?...是一个自定义控件,使用BottomNavigationBar绘制具有正确颜色的三个选项卡。...我不确定这是否是一个模拟器问题,它在真实设备上看起来不错。
因为在每一个图标获取焦点放大的时候会与旁边的图标有重叠部分,ViewPager每一页view都是一个FrameLayout,在绘制view的时候是按照一定的顺序绘制的,就会遇到焦点view放大后显示的效果是被旁边的...CellView: 如上图所示,每一个正方形的view我在这里叫做CellView,它也是一个自定义的view,自定义主要是为了实现: 1、获取焦点时放大和丢掉焦点时缩小效果,这里是应用了属性动画,ViewPropertyAnimator...,在开发遥控器应用时一个很大的问题就是焦点在移动时焦点错乱,基本上应用UI bug至少有一半时焦点bug,这个应用我为了防止焦点错乱定义了CellView的边界属性,上面的xml文件中isXXEdge就是...,这样在焦点移动到边界时可以进行Page之间的切换和其他处理,防止焦点在进入每一个page时出现错乱。...总结:以上就是Metro风格Launcher实现,我用了三篇博客来讲解这个应用,所有效果的实现都是自己摸索的,应该还有更好的实现方法,大家可以多多交流提出自己的看法,也可以关注我的微信号coder_online
其他需要注意的是,NavigationView的位置应与主内容app_bar_main同级,且在主内容之后。 关于DrawerLayout更多使用可以查看:DrawerLayout使用详解。...android:layout_height="match_parent" android:orientation="vertical"> viewpager.widget.ViewPager...:layout_height="0dp" android:layout_weight="1" /> bottomnavigation.BottomNavigationView...包含的一个个子页面Fragment,来看代码的实现 /** * 初始化Fragment */ private fun initFragments() {...bottom_navigation.menu.getItem(position).isChecked = true //设置checked为true,但是不能触发ItemSelected事件,所以滑动时也要设置一下标题
TabItem 在高版本的design库里已经有了TabItem,TabItem是作为TabLayout的子View而配合使用的,点进去发现其实代码很简单,就是个自定义View。 ?...所以当我们的需求能够明确知道Tab的个数时,可以在xml里直接添加TabItem。但是但是,心细的你不知道有没有发现问题,我在上面的代码中,tab明明设置的小写,但是运行出来确是大写: ?...事先申明我可没在代码里重新设置文本,就是这么操蛋。好在天无绝人之路,找到了一个属性叫app:tabTextAppearance,这是Tablayout的属性。...官方推荐我们使用setupWithViewPager()方法,来完成这种Tablayout+Viewpager+Fragment组合的数据绑定,上面的代码实在看不出上面问题,但是我的标题呢?...当然这个需求本身还是很简单的,假如不用Tablayout也无非就是写个布局,切换viewpager的时候对应的状态改变。但这里我就非要用Tablayout,通过这个例子来说明我们要讲的问题。
使用 viewPager 时,如何解决 和 子页面 长按滑动 冲突问题。...我的问题原型: 这个问题,我相信遇到的人会比较少,我是在 一个 viewPager 中,其中 一个 fragment 中实现了长按滑动图片的功能,而发现它们两者的 onTouchEvent事件冲突...尝试过的解决方法: 1----- 遇到这问题,首先是百度,百度到的方法有,自定义 viewPager,在里面重写 onTouchEvent 和 onInterceptTouchEvent...第二个页面的 fragment 中实现阻断,这时候,你可能会尝试 在 fragment 中new 一个 MainActivity 的对象,然后想方设法 获取它 里面的 viewPager,或者是 引入与...然后使用 自定义 viewPager 里面的 函数。 很不幸,我上述谈到的方法,我都试过了, all failed。
但是某些时候在此页面会出现滑动冲突的小问题,不太利于用户体验,通过反复的把玩测试,找到了必现的操作,作为一个资深的抖迷和一个非资深的 Android 开发的我,产生了钻牛角尖的想法—想看看问题是怎么产生的...问题现象 首页右滑可进入“个人中心”页面,然后在底部的 RecylerView 上先左右滑动,但是不触发它们父布局 ViewPager 的切换,然后手指不抬起,进行上下滑动,此时 RecylerView...我通过综合分析发现,抖音用的是自定义 LinearLayout 的方式来布局 header + Viewpager + RecyclerView 的,进而通过拦截 LinearLayout 的 disptachTouchEvent...出现问题时,用户的手先触发左右滑动,这时候由于 RecyclerView 父布局 ViewPager 中的一些临界判断没被触发,所以没拦截事件,事件还是到了 RecyclerView 中,此时如果再次上下滑动...对文章有何见解,或者有何技术问题,欢迎在评论区一起留言讨论!
目录介绍 01.先来看一下需求 02.有几种实现方式 2.1 使用ViewPager 2.2 使用RecyclerView 03.用ViewPager实现 3.1 自定义ViewPager 3.2 ViewPager...具体的滑动效果,可以直接参考抖音…… 02.有几种实现方式 2.1 使用ViewPager 使用ViewPager实现竖直方法上下切换视频分析 1.最近项目需求中有用到需要在ViewPager中播放视频...2.但是没有复用是个最致命的问题。在onLayout方法中,所有子View会实例化并一字排开在布局上。当Item数量很大时,将会是很大的性能浪费。 3.其次是可见性判断的问题。...3.4 修改滑动速度 使用viewPager进行滑动时,如果通过手指滑动来进行的话,可以根据手指滑动的距离来实现,但是如果通过setCurrentItem函数来实现的话,则会发现直接闪过去的,会出现一下刷屏...LayoutManager注意点 网上有人已经写了一篇自定义LayoutManager实现抖音的效果的博客,我自己也很仔细看了这篇文章。
这是自定义View系列的第二篇博客,我们继续来学习关于自定义View的知识。 今天我们来实现一下广告条案例。 我们要实现的是这样的一个效果。 ?...ViewPager在运行之后总共会初始化两个页面,最多初始化三个,随着页面的增多,ViewPager会自动销毁前面的页面进而提供给后面的页面使用,这是ViewPage的内容优化,我们可以来验证一下,我在初始化和销毁的方法中都打印了日志...,而我们的数据又没有这么多,那么在滑动页面的时候肯定会产生索引越界的问题,所以,为了避免这样的问题产生,我们就必须把有页面位置的地方全部取模处理,让其保持在我们的有限数据范围内,这样就能够实现我们的需求了...乍一看,好像是没什么问题了,但是,这个程序是有bug的,只是这样我们没有测试出来,我再操作一遍。 ? 发现问题了没有,我在最开始进入程序的时候,右滑是不是滑不动?...整个案例也就结束了,这只是ViewPager使用的一小部分,这个程序还可以加上很多的功能,比如自动播放,然后点击跳转等等,由于篇幅有限,我就不一一实现了,感兴趣的可以自己尝试着写一写。
并命名其为“Fragment最佳实践”,作为想到单独使用Fragment的用户来说,这个说法并不夸大,它解决了许多用户在使用Fragment时产生的这样那样可见或不可见的问题。...我们在布局文件中可以这样使用 。...你必须实现一个PagerAdapter来生成这些显示的页面。ViewPager经常和Fragment一起使用。...在Fragment可见时,即ViewPager中滑动到当前页面时,因为已经预加载过了,之前生命周期已经走到onResume() ,所以现在只会回调:setUserVisibleHint()。...ViewPager的网络请求的优化实现 我们在使用ViewPager+Fragment显示数据的时候,我们通常会把网络请求的操作放在onCreateView->onResume之间的生命周期内。
3.并用反射解决ViewPager与BottomNavigationView侧滑联动时的一个小问题。...最终实现效果: 在谷歌官方发布BottomNavigationView控件之前我们可以自己组合控件实现,比如LinearLayout + TextView(使用android:drawableTop...属性+selector状态切换)、RadioGroup + RadioButton等等组合控件的方法自定义实现复杂效果。...在3个menu item及以下时默认关闭,而到了4个及以上时就懵逼了,因为我们是要做ViewPager的侧滑。...禁止滑动时,为ViewPager添加setOnTouchListener接口,在onTouch下直接消费掉点击事件。
前言: 各位小伙伴们请原谅我隔了这么久才开始写这一系列的第二篇博客,没办法忙新产品发布,好了废话不说了,先回顾一下:在我的上一篇博客 Android Metro风格的Launcher开发系列第一篇写了如何配置...Launcher主体框架实现: Launcher主体框架我选用的是大家所熟悉的ViewPager控件,因为ViewPager可以很容易做pager之间的切换动画,动画是可以自定义的,这样就轻松搞定滑出屏幕的各种效果...2.Page之间切换效果实现: 每一屏page之间的切换是通过实现ViewPager.PageTransformer接口来实现的,具体这个接口的讲解我这里就不介绍了,大家可以参考google官方文档:http...().getInteger(R.integerviewpager_margin)); 总结: 以上就是Launcher主体框架使用ViewPager实现左右滑动和缩放效果讲解,写的不好的地方还请大家指出并批评指正...下一篇博客我将会讲解屏幕中每一格CellView实现,有焦点放大效果,实现每一个Focus的CellView悬浮效果和在xml文件中灵活配置关联链接等。
三.实现效果: 哎,没有时间弄一幅动图,那我就口述一下吧,很多Android开发者会遇到的问题,例如,你的整个布局在一个线性布局(Linearlayout)中,简单的(vertical)竖行排列...四.具体实现 我们就拿viewpager+fragment,最常见的scrollview嵌套viewpager的例子,首先看我自定义的viewpager package com.xxx.xxx.views...viewpager的pager页位置时重置viewpager的高度。...好了如果你按照这个逻辑去做已经很接近实现了,但要说明一个问题,很重要的一个问题,在低版本的SDK下,似乎没什么问题,但是在高版本SDK下,就有了问题。...这个问题纠结了我一天多,因为我在Android4.3的手机,完全实现了,但是在队友Android6.0的手机下就出现了问题。
领取专属 10元无门槛券
手把手带您无忧上云