问题记录
记录一下平时工作时遇到的比较奇怪的问题。
- 在使用PopupWindow时,带有navigation bar的手机出现了底部navigation bar将弹出的PopupWindow遮挡住,使用的Android版本在5.0以上。解决方法如下:
|
|
将PopupWindow添加上述属性即可。
- 2017/5/24 今日在工作中遇到了一个Fragment不初始化的问题:
在一个Activity中,有5个自定义的ViewPager,由于在自定义布局中的ViewPager的ID是相同的,因此导致只有第一个ViewPager的Fragment会初始化。
导致以上问题的原因就在于FragmentPagerAdapter中的instantiateItem函数中FragmentManager以container的id加fragment的position为标记。导致第一个ViewPager的position初始化后进了缓存,第二个ViewPager的position1就直接从缓存中获取数据:
|
|
以上container.getId()就是fragment父控件的ID
所以解决的方法有两种
- 重写一个PagerAdapter,自己修改makeFragmentName的规则
- 给每一个Fragment的父控件设置不同的ID
在此次遇到的问题中,由于ViewPager的数量比较少,因此采用了第二种方法,给每个ViewPager在代码中setId,解决了问题。
- ViewPager调用NotifyDataSetChanged不更新页面
在项目中涉及到了对ViewPager的更新,但是在调用NotifyDataSetChanged方法之后,发现无效,经过各方查找,发现问题原因如下:
没有重载getItemPosition()函数
首先来看一下notifyDataSetChanged()的作用:
在数据集发生变化的时候,一般 Activity 会调用 PagerAdapter.notifyDataSetChanged(),以通知 PagerAdapter,而 PagerAdapter 则会通知在自己这里注册过的所有 DataSetObserver。其中之一就是在 ViewPager.setAdapter() 中注册过的 PageObserver。PageObserver 则进而调用 ViewPager.dataSetChanged(),从而导致 ViewPager 开始触发更新其内含 View 的操作。
再来看getItemPosition()函数:
该函数默认直接返回 POSITION_UNCHANGED,从而导致ViewPager.dataSetChanged()被调用时,认为不必触发PagerAdapter.instantiateItem(),因此导致调用了notifyDataSetChanged后什么都没有发生。
所以解决办法就是
|
|