首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Android开发笔记(一百三十九)可定制可滑动的标签栏

所以,像弹出对话框这种事务,必须控制只有ViewPager才能做;除此之外,倘若Fragment要执行分线程操作、后台服务等等额外工作,好比织毛衣缝被子什么的,那原配最好也不要做了,一律由ViewPager...builder.create().show(); } } } 但是实际运行时发现偶尔会闪退,日志报错java.lang.NullPointerException,原因是构建对话框时发现mContext为空...既然如此,那就补充mContext是否为空的判断好了,只有mContext非空时才显示对话框,修改后的Fragment代码如下所示: public class TabFirstFragment extends...平常用户点开某个标签页,该标签页的setUserVisibleHint便被调用;可是第一次打开标签主页面时,默认显示第一个标签页,此时标签页的生命周期为onAttach->setUserVisibleHint...修改后的Fragment代码如下所示,现在标签页面的对话框可以正常工作了吧: public class TabFirstFragment extends Fragment { protected View

1.7K20

自定义无限循环ViewPager(一)――ViewPager初始化源码解析

ViewPager内部定义了一个Decor接口,而且该接口中没有定义任何的内容,唯一的作用就是如果自定义控件实现了Decor接口,那么该控件就属于ViewPager的DecorView。...更新mItems中的其余对象 mItems的长度为 2 * mOffscreenPageLimit+ 1,每次获取到当前curItem后,需要根据mOffscreenPageLimit的值,将当前View...mItems.get(itemIndex) : null; } else { //如果左边对象为空,或者不为空但是不属于预加载的页面范围...现在看第一次执行打印的log就可以了。...初始化默认当前页面为0,缓存数量为1,即左右两边各缓存一个页面,所以starpos=0,endpos=1; 因为缓存数组为空,所以创建第一个页面对象,添加到数组中去,且在数组中对应的位置索引curIndex

2.6K31
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    ViewPager懒加载的实现,理解setUserVisibleHint,而不只是会用就好

    但我们有时候的需求是需要当滑动到相应页面后再去更新数据,比如网络请求这种,可能你会说,那直接在onResumel里请求数据不就行了,但是ViewPager预加载机制在你处于前一个页面时,已经加载好了下一个页面...当然你也可以将所有页面全部缓存,但这样所消耗的内存不言而喻,而且如果数据过多,第一次进去的时候的速度不可估量。所以这次我们使用懒加载来实现我们的需求。...为什么第一次进来不执行 F1可见呢?...之后就已经调用,但是当时还没有初始化完成,我们的子碎片还没有缓存好,所以我们在fragment基类里面定义了一个变量,只有当 onActivityCreated 碎片一定与相关的活动创建完毕的时候再更改变量的值为true...,避免空指针的问题,所以第一次进来时没有执行到我们的方法。

    89620

    【Android】再来一篇Fragment的懒加载(只加载一次哦)

    使用前需知 2017-7-14更新: 目前有人使用后出现了诸如首次打开显示空白界面,但点击有反应;或来回切换又变空白界面的问题。...上面的截图里有注释解析了,稍微认真点看看 log 的内容哈,看看是不是你需要的需求。...之前写过一篇 Fragment懒加载和ViewPager的坑,里面分析了 Fragment 结合 ViewPager 使用时会碰到的一些情况,以及为什么要用懒加载,如何用,感兴趣的也可以再回去看看。...这就需要有个 Fragment 可见与不可见时触发的回调方法,并且该方法还得保证是在 view 创建完后才触发的,这样才能支持对 ui 进行操作。..., * 然后在该方法内将状态设置为下载状态,接着去执行下载的任务 * 最后在 onFragmentVisibleChange() 里根据数据下载状态来控制下载进度ui控件的显示与隐藏

    1.6K70

    【Android】Fragment懒加载和ViewPager的坑

    本来Fragment的 onResume()表示的是当前Fragment处于可见且可交互状态,但由于ViewPager的缓存机制,它已经失去了意义,也就是说我们只是打开了“福利”这个Fragment,但其实...日志图3 题主这次仍旧是从DayDataFragment 跳转到 MeiziDataFragment, 但跟上上面的日志图片不同,这里只打印了两条日志,也就是说即使有三个Fragment被实例化了,但只有显示的那个...另外,因为ViewPager缓存机制,所以题主进行了view的复用,防止onCreateView()重复的创建view,其实也就是将view设置为成员变量,创建view时先判断是否为null。...abstract class ViewPagerFragment extends Fragment { /** * rootView是否初始化标志,防止回调函数在rootView为空的时候触发...else { // setRefresh(false); } } } } 项目Github 地址 ---- PS 以上就是这次的内容了

    2K20

    Android技巧一:启动屏+功能引导页

    前言 很长一段时间没写博客了,再不写点东西真说不过去,把工作上的一些有价值的东西整理出来分享,在当下还有点时效性,不然迟早会烂在肚子里的。...先说逻辑 先判断是否第一次启动app,如果是,则进入功能使用导航(最简单的做法就是,左右滑动切换查看,滑动到最后一页点击按钮进入首页)。 如果不是,则显示启动屏,2秒之后进入首页。...app,则正常显示启动屏 setContentView(R.layout.activity_splash); new Handler().postDelayed(new Runnable...MainActivity.class); startActivity(intent); finish(); } } 代码解析:使用SharedPreference来保存app启动状态,如果为true...,方便取出与当前位置对应 } currentIndex = 0; dots[currentIndex].setEnabled(true); // 设置为白色

    1.5K20

    ViewPager无限滑动

    整体来说,ViewPager可以实现无限滚动,但方式比较绕。 ViewPager的使用 首先来简单概括下ViewPager的使用。 1.编写PagerAdapter。...有意思的是,在onCreate中setAdapter之后,第一次viewPager.setCurrentItem(adapter.getStartPageIndex())并不会引起ANR,应该是onCreate...在正常使用ViewPager,没有任何无限滑动的逻辑的情况下: 假设第一次setAdapter的时候,getCount返回1,此时ViewPager只有一个page,不可以左右滑动。...View——看到1个还是2个和——notifyDataSetChanged时ViewPager的正在显示的page有关,但是无法滑动到除position为1的其它页码。...为ViewPager提供继承自SimpleOnPageChangeListener的类的对象: viewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener

    2.2K70

    TabLayout+ViewPager+Fragment实现切页展示「建议收藏」

    ,也看了各个论坛很多份博客,但是发现都没有完全把这种方法的坑填完,因此写下这篇博客,一方面是对知识的总结,另一方面也能让其他开发者们少走一些弯路,博客内容主要分为四个章节: TabLayout+ViewPager...ViewPager还有一个比较重要的函数是: viewPager.setOffscreenPageLimit(int limit); 这个方法默认值为1,Google在开发ViewPager时,考虑到如果滑动的时候才创建...= false; //不可见 boolean mIsFirstLoad = true; //第一次加载 当然在onCreateView中确保了View已经准备好时,将mPrepare置为true,在setUserVisibleHint...中确保了当前可见时,mIsVisible置为true,第一次加载完毕后则将mIsFirstLoad置为false,避免重复加载。...但是这样的做法,最大的缺点就是容易造成第一次启动时非常缓慢!如果第一次启动时间满足要求的话,就使用这种简单地办法吧。

    3.3K10

    Android项目实战(三):实现第一次进入软件的引导页

    最近做的APP接近尾声了,就是些优化工作了, 我们都知道现在的APP都会有引导页,就是安装之后第一次打开才显示的引导页面(介绍这个软件的几张可以切换的图) 自己做了一下,结合之前学过的 慕课网_ViewPager...切换动画(3.0版本以上有效果) 思路很简单,APP的主界面还是作为主Activity,只要新添加一个类来判断是不是第一次打开APP 设主activity 名字为:MainActivity.java  ...判断是不是第一次打开APP且实现引导页面的类 LoginActivity ,另外还需要一个类 这是安卓开发_慕课网_ViewPager切换动画(3.0版本以上有效果)中用到的 ZoomOutPageTransformer.java...preferences.getBoolean("firststart", true)) { 47 editor = preferences.edit(); 48 //将登录标志位设置为false...) findViewById(R.id.id_viewpager); 52 //为ViewPage切换添加动画效果(3.0以上版本才可以有效果) 53 mviewpager.setPageTransformer

    1.2K50

    解决ViewPager+多Fragment切换出现空白页面的问题

    项目的主页框架是采用Activity+Fragment的架构,由于项目需求,在第一个Fragment中又采用的是TabLayout+ViewPager+Fragment的结构,假设我这里有5个子Fragment...第一种:将ViewPager的预加载个数设置为你的所有Fragment的数量,就是说有几个Fragment就设为几。...其实我之前采用这种布局方式的时候都是设为最大数量的,所以一直没有遇到过这个问题,由于这个项目中不同的账号看到的页面都是不同的,Fragment的数量是不固定的,所以这里就随手写了个1,因为ViewPager...第三种:这种方式是在网上看到的,我没有实际操作过,这种要比上面两种复杂一点,这里说一下思路:在onCreateView()中判断Fragment中是否已经添加了contentView,第一次加载时,可以将...view保存下来,之后再加载时判断保存的view是否为空,如果为空,则return新加载的view,如果不为空,先将保存的view从父view中移除,然后再return该view。

    1.8K30

    Android开发笔记(一百零一)滑出式菜单

    具体到LinearLayout的编码实现,对应的便是LinearLayout.LayoutParams的leftMargin参数,若该参数为正数,则视图页面拉出了一段空白;若该参数为负数,则视图页面隐藏了一段内容...,调用setBehindContentView方法设置菜单布局,注意两个初始布局都是空的; 4、从自己写的Fragment类分别构造出实际的内容布局和菜单布局,然后调用FragmentManager的...表现在界面上,就是点击菜单布局后回到ViewPager页面,会看到ViewPager的头两页变空白了,查看日志发现头两页不会执行onCreateView方法。...我们首次进入Activity页面,ViewPager的头两个页面已经执行了onCreateView;接着点击菜单项,SlidingMenu把整个内容页面的Fragment替换掉,但这时对于ViewPager...的子页面来说,仅仅是做了detach操作,并没有做remove或destroy操作,也就是说,ViewPager子页面根本就没被回收;所以点击菜单重新回到替换后的ViewPager时,系统发现头两页没有回收

    1.2K70

    Android谈谈封装那些事--BaseActivity和BaseFragment(二)

    版权声明:本文为博主原创文章,转载请标明出处。...即便是我们在使用viewpager作为容器的时候设置预加载setOffscreenPageLimit()这个方法,其实你会发现根本不会起作用。 至于viewpager这个预加载方法为什么不行?...网上有的说可以将viewpager的源码复制下来粘到自己的类里面将这个默认值改为0,这个目前还没试过,即使可以感觉也有些别扭,更何况我们使用场景也不一定需要viewpager呢 3.Fragment懒加载...预加载初始化数据和组件等轻量操作 切换tab到第一次可见时执行网络请求 四种状态:第一次可见状态、可见状态、第一次不可见状态、不可见状态 销毁时处理解注册、销毁广播等问题 3.BaseFragment封装...private void onFirstUserInvisible() { } protected abstract void onUserInvisible(); 4.最后解注册销毁等工作

    2.2K20

    ViewPager快速实现引导页

    在很多APP第一次启动时都会出现引导页,在一些APP里面还会包括一些左右滑动翻页和页面轮播切换的情况。...ViewPager的主要方法有以下几个: setAdapter(PagerAdapter adapter) :为ViewPager设置适配器,ViewPager有三种适配器,包括PagerAdapter...addOnPageChangeListener(OnPageChangeListener listener) :为ViewPager添加页面切换时的监听。...positionOffset:当前页面滑动比例,如果页面向右翻动,这个值不断变大,最后在趋近1的情况后突变为0。如果页面向左翻动,这个值不断变小,最后变为0。...继续使用WidgetSample工程的advancedviewsample模块,在src/main/res/layout/目录下创建viewpager_layout.xml文件,在其中填充如下代码片段:

    1.4K70

    ViewPager源码分析

    | 导语 ViewPager是一个很常用的Android组件,其提供的接口和功能基本已经可以满足项目的大部分需要,但如果需要定制一些不一样的行为,比如实现一个类似iOS多任务那样的卡片列表控件,熟悉和修改...1.jpg 再来看看move事件,主要工作是判断手指左右滑动的距离,超过一定阙值后就把mIsBeingDragged设为true,说明ViewPager要消费这个事件,最终拖动逻辑在onTouchEvent...1.jpg        move事件主要做两件事,第一件事是当mIsBeingDragged为false时,重新检测一下当前是否符合左右滑动的条件(mIsBeingDragged为false时为啥会回调...搜索ViewPager的addView方法,虽然覆写了,但ViewPager内部没有任何调用,真是神奇。...1.jpg 可以看到,第一次创建Fragment后的状态就是Fragment.CREATED,这里的container在我们的例子里指的就是ViewPager,container.addView

    1.8K40

    关于ViewPager高度自适应(随着pager页的高度改变Viewpager的高度)

    一.背景: 第一次写博客还是技术性博客,为了回答CSDN上一位网友的问题,决定写一篇博客既帮助别人又帮助自己,经常看鸿洋大神,郭大神的博客,两位大神真是业界良心,不仅仅技术厉害,博客也写的让人一目了然...所以第一次写这种技术性博客,不知道看到的人是否能看懂得到一些启发,如果有什么不足的地方希望大家多多指正。...二.概述: 好了,开始转入正题,关于ViewPager大家应该都很熟悉,大多数APP中必然会用到的控件(说的有点绝对,但看过的APP貌似都离不开它)。...解决了冲突问题,但你会遇到这样一个棘手的问题:所有viewpager中的fragment都是那个最大的高度,如果你的fragment中view的高度很小的话,或者view的高度过大的话,会导致自身或者其他...的高度的方法,从代码中可以看出在调用resetHeight()方法中传入实参current后,viewpager的高度会变成你传入实参对应下标的fragment的高度,那么在哪里调用这个方法呢?

    4.7K30

    Android入门教程 | Fragment 基础概念

    可复用,页面布局可以使用多个Fragment,不同的控件和内容可以分布在不同的Fragment上。 使用Fragment,可以少用一些Activity。...onPause() 系统会将此方法作为用户离开片段的第一个信号(但并不总是意味着此片段会被销毁)进行调用。通常,应在此方法内确认在当前用户会话结束后仍然有效的任何更改(因为用户可能不会返回)。...可以通过两种方式为片段提供 ID: 为 android:id 属性提供唯一 ID。 为 android:tag 属性提供唯一字符串。...在该回调中我们可以将 context 转化为 Activity 保存下来,从而避免后期频繁调用getAtivity() 获取 Activity 的局面,避免了在某些情况下 getAtivity() 为空的异常...ViewPager对Fragment生命周期的影响 ViewPager+Fragment 是比较常见的组合了,一般搭配ViewPager的FragmentPagerAdapter 或 FragmentStatePagerAdapter

    3.5K40

    Android自动轮播的三种方式

    mHandler.sendEmptyMessageDelayed(0, 3000); }; }; mHandler.sendEmptyMessageDelayed(0, 3000);// 延时3秒后发消息...true; } }   方法二:在设置adapter的getposotion方法里返回整数的最大值,写个runable一直然后pager的当前条目++,然后递归调用post,在外面也post,在外边是第一次调用...加载的view对象 return view; // 返回的对象 } }   第三种是用handler发延迟消息,和第二种差不多,第二种是延迟post(runnable),基于2,设置完最大数后可能一直滚动...然后用handler发消息,消息是一直让当前条目++,然后用延迟发消息,在外面也发,这个是第一次发。如果想停下来,定义个变量,在destory里再置为false就行。...滑动到下一页 viewPager.setCurrentItem(viewPager.getCurrentItem()+1); if(isRunning){ handler.sendEmptyMessageDelayed

    44410
    领券