Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

单Activity多fragment适配问题 #3

Closed
xiang23 opened this issue Aug 21, 2018 · 17 comments
Closed

单Activity多fragment适配问题 #3

xiang23 opened this issue Aug 21, 2018 · 17 comments

Comments

@xiang23
Copy link

xiang23 commented Aug 21, 2018

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

@JessYanCoding
Copy link
Owner

JessYanCoding commented Aug 21, 2018

没办法,只有 Activity 能修改 DisplayMetrics,这个不是我定的,是 Google 定的,你在 Fragment 里面想修改 density,也必须从它依赖的 Activity 上拿到 DisplayMetrics,然后修改,修改后也会影响这个 Activity 下面的其他 Fragment

@JessYanCoding
Copy link
Owner

不过也有办法,如果你想每个 Fragment 都可以自定义的话,必须每生成一个 Fragment,就切换一次 density,必须一个个生成 Fragment,不能同时生成

@xiang23
Copy link
Author

xiang23 commented Aug 21, 2018

假设每个fragment density一样的情况其实仍旧是创建时的调用适配就行,如果两个fragment density不一样的话 显示的时候重新调用适配这样会有问题吗?

@JessYanCoding
Copy link
Owner

JessYanCoding commented Aug 21, 2018

两个 Fragment 的 density 不可能不一样,都是一样的,不过你想让每个 Fragment 可以自定义尺寸,或者取消适配,可以通过下面这个方法

density = 1;
new  Fragment1
 density = 2
new  Fragment2

在 Fragment 显示视图之前切换就可以了,Activity 我也是这样做的,你们以为 Activity 可以单独设置 density,其实是幻觉,我只不过在这个 Activity setContentView 之前,按照它的需求切换了 density,这个 density 是全局的,不存在什么单独设置这一说

@xiang23
Copy link
Author

xiang23 commented Aug 21, 2018

明白,Thx

@xiang23 xiang23 closed this as completed Aug 21, 2018
@xiang23
Copy link
Author

xiang23 commented Aug 21, 2018

按这种说法density是全局的话,假设A,B两个Activity A density=1 B density=2 A start B 然后 B finish回到A 这时候比如A突然需要动态addview 就需要重新设置一遍density对吧?

@JessYanCoding
Copy link
Owner

对,是这个道理,因为全局的 density 现在是 2,而框架,为了避免这个问题,是在每次 onCreate 的时候主动重新设置 density,不过需要重新自定尺寸的页面毕竟在少数,全局 density 给我们带来的好处是减少大量工作量,带来的坏处是,适配范围不可控,影响范围也越大

@JessYanCoding
Copy link
Owner

Fragment 自定义尺寸,需求很常见吗?我使用 FragmentLifecycleCallbacks 也可以做到和 Activity 一样的让 Fragment 可以自定义尺寸,但是我担心弄太复杂了,而且全局的 density 在频繁切换的时候也有太多不可确定性,做是可以做,但感觉这个需求也不是太常见,这个成本和收益不相符

@xiaobailong24
Copy link

如上:每次 onCreate 的时候主动重新设置 density
请问。如果 Activity 是 singleTask、SingleInstance 启动模式,会不会有影响?

@JessYanCoding
Copy link
Owner

JessYanCoding commented Aug 22, 2018

和模式无关,只要 onCreate 中的 setContentView 计算好了这个 Activity 的 density 并且正确设置就行, setContentView 之后布局就已经定型了,哪怕是其他模式启动时,不执行 onCreate 也无所谓了,因为他的布局已经根据之前的 density 设置好了,至于现在的 density 是多少,并不影响之前的布局

除非这个 Activity 的布局在 setContentView 后改变,这时就必须给这个 Activity 重新计算并且设置 density

@xiaobailong24
Copy link

晓得,很赞

@JessYanCoding
Copy link
Owner

@xiang23 'me.jessyan:autosize:0.8.0' 已经支持了 Fragment 自定义适配参数

@xiang23
Copy link
Author

xiang23 commented Aug 25, 2018

@JessYanCoding 感谢大大的付出。
我直接用demo试了一下fragment 在屏幕旋转的时候会出现问题。
demo里正好加的三个fragment都是自定义适配的好复现。

我的使用的是nexus S的模拟器 28版本的sdk

我打印了下生命周期发现问题大概是这样
正常情况下
image
而旋转以后
image
fragment自顶往下调用了所有create后才开始自下往上依次调用onCreateView 这样导致三个fragment都设置了fragment3的适配参数导致适配出现问题。

效果图
正常图1:
image
旋转后转回来:
image

一种简单解决方法是在onCreateView重新调用一次适配方法,但这样明显不是最优的方式,不知道大大有没有更好的方案

@JessYanCoding
Copy link
Owner

JessYanCoding commented Aug 26, 2018

忘了测屏幕旋转了,感谢提醒,对,这就是我上面说的如果同时生成 Fragment 那就挺麻烦的,按理说只有在每个 Fragment 的 onCreateView 中重新调一下适配方法,不过这样步骤就繁琐了,具体原因还不清楚,只有星期一再看下

@JessYanCoding
Copy link
Owner

7d73855 看来最好的办法只有这样了

Repository owner deleted a comment from MrLeeys Sep 26, 2018
Repository owner deleted a comment from MrLeeys Sep 26, 2018
@jackyHuangH
Copy link

我使用过程出现了一个问题:主页面acticity+多个fragment,配合fragmentation库,发现无论activity还是fragment页面,顶部与状态栏之间总是有个间隙,另外一台米4(10801920)却没有这个问题,改成 @OverRide
public boolean isBaseOnWidth() {
return false;
}
@OverRide
public float getSizeInDp() {
return 0;
}
问题依然存在。大佬有空看看呗
用的最新1.0.0版本,手机一加三,安卓8.0,分辨率:1080
1920,适配尺寸width=360dp,height=640dp。

@JessYanCoding
Copy link
Owner

JessYanCoding commented Oct 18, 2018

@jackyHuangH 按照 规范 重新提一个 issues,截图一定要有

@billdizl billdizl mentioned this issue Mar 28, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants