单Activity多fragment适配问题 #3
Description
Activity
没办法,只有 Activity 能修改 DisplayMetrics,这个不是我定的,是 Google 定的,你在 Fragment 里面想修改 density,也必须从它依赖的 Activity 上拿到 DisplayMetrics,然后修改,修改后也会影响这个 Activity 下面的其他 Fragment
不过也有办法,如果你想每个 Fragment 都可以自定义的话,必须每生成一个 Fragment,就切换一次 density,必须一个个生成 Fragment,不能同时生成
假设每个fragment density一样的情况其实仍旧是创建时的调用适配就行,如果两个fragment density不一样的话 显示的时候重新调用适配这样会有问题吗?
两个 Fragment 的 density 不可能不一样,都是一样的,不过你想让每个 Fragment 可以自定义尺寸,或者取消适配,可以通过下面这个方法
density = 1; new Fragment1 density = 2 new Fragment2在 Fragment 显示视图之前切换就可以了,Activity 我也是这样做的,你们以为 Activity 可以单独设置 density,其实是幻觉,我只不过在这个 Activity setContentView 之前,按照它的需求切换了 density,这个 density 是全局的,不存在什么单独设置这一说
明白,Thx
按这种说法density是全局的话,假设A,B两个Activity A density=1 B density=2 A start B 然后 B finish回到A 这时候比如A突然需要动态addview 就需要重新设置一遍density对吧?
对,是这个道理,因为全局的 density 现在是 2,而框架,为了避免这个问题,是在每次 onCreate 的时候主动重新设置 density,不过需要重新自定尺寸的页面毕竟在少数,全局 density 给我们带来的好处是减少大量工作量,带来的坏处是,适配范围不可控,影响范围也越大
Fragment 自定义尺寸,需求很常见吗?我使用 FragmentLifecycleCallbacks 也可以做到和 Activity 一样的让 Fragment 可以自定义尺寸,但是我担心弄太复杂了,而且全局的 density 在频繁切换的时候也有太多不可确定性,做是可以做,但感觉这个需求也不是太常见,这个成本和收益不相符
如上:每次 onCreate 的时候主动重新设置 density
请问。如果 Activity 是 singleTask、SingleInstance 启动模式,会不会有影响?和模式无关,只要 onCreate 中的 setContentView 计算好了这个 Activity 的 density 并且正确设置就行, setContentView 之后布局就已经定型了,哪怕是其他模式启动时,不执行 onCreate 也无所谓了,因为他的布局已经根据之前的 density 设置好了,至于现在的 density 是多少,并不影响之前的布局
除非这个 Activity 的布局在 setContentView 后改变,这时就必须给这个 Activity 重新计算并且设置 density
Reacted by xiaobailong24 and meipengReacted by xiaobailong24Reacted by xiaobailong24 and JunWeiAndroid晓得,很赞
@xiang23 'me.jessyan:autosize:0.8.0' 已经支持了 Fragment 自定义适配参数
Reacted by xiang23@JessYanCoding 感谢大大的付出。
我直接用demo试了一下fragment 在屏幕旋转的时候会出现问题。
demo里正好加的三个fragment都是自定义适配的好复现。我的使用的是nexus S的模拟器 28版本的sdk
我打印了下生命周期发现问题大概是这样
正常情况下

而旋转以后

fragment自顶往下调用了所有create后才开始自下往上依次调用onCreateView 这样导致三个fragment都设置了fragment3的适配参数导致适配出现问题。一种简单解决方法是在onCreateView重新调用一次适配方法,但这样明显不是最优的方式,不知道大大有没有更好的方案
忘了测屏幕旋转了,感谢提醒,对,这就是我上面说的如果同时生成 Fragment 那就挺麻烦的,按理说只有在每个 Fragment 的 onCreateView 中重新调一下适配方法,不过这样步骤就繁琐了,具体原因还不清楚,只有星期一再看下
7d73855 看来最好的办法只有这样了
我使用过程出现了一个问题:主页面acticity+多个fragment,配合fragmentation库,发现无论activity还是fragment页面,顶部与状态栏之间总是有个间隙,另外一台米4(10801920)却没有这个问题,改成 @OverRide
public boolean isBaseOnWidth() {
return false;
}
@OverRide
public float getSizeInDp() {
return 0;
}
问题依然存在。大佬有空看看呗
用的最新1.0.0版本,手机一加三,安卓8.0,分辨率:10801920,适配尺寸width=360dp,height=640dp。@jackyHuangH 按照 规范 重新提一个 issues,截图一定要有


现在这样适配都对到activity,对多fragment不怎么友好..比如cancelAdapter