Skip to content

单Activity多fragment适配问题 #3

Description

@xiang23

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

Activity

  1. JessYanCoding commented on Aug 21, 2018

    @JessYanCoding
    Owner

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

  2. JessYanCoding commented on Aug 21, 2018

    @JessYanCoding
    Owner

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

  3. xiang23 commented on Aug 21, 2018

    @xiang23
    Author

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

  4. JessYanCoding commented on Aug 21, 2018

    @JessYanCoding
    Owner

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

    density = 1;
    new  Fragment1
     density = 2
    new  Fragment2
    

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

  5. xiang23 commented on Aug 21, 2018

    @xiang23
    Author

    明白,Thx

  6. xiang23 commented on Aug 21, 2018

    @xiang23
    Author

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

  7. JessYanCoding commented on Aug 21, 2018

    @JessYanCoding
    Owner

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

  8. JessYanCoding commented on Aug 21, 2018

    @JessYanCoding
    Owner

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

  9. xiaobailong24 commented on Aug 22, 2018

    @xiaobailong24

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

  10. JessYanCoding commented on Aug 22, 2018

    @JessYanCoding
    Owner

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

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

  11. xiaobailong24 commented on Aug 22, 2018

    @xiaobailong24

    晓得,很赞

  12. JessYanCoding commented on Aug 25, 2018

    @JessYanCoding
    Owner

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

  13. xiang23 commented on Aug 25, 2018

    @xiang23
    Author

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

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

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

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

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

  14. JessYanCoding commented on Aug 26, 2018

    @JessYanCoding
    Owner

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

  15. JessYanCoding commented on Aug 26, 2018

    @JessYanCoding
    Owner

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

  16. Repository owner deleted a comment from MrLeeys on Sep 26, 2018
  17. Repository owner deleted a comment from MrLeeys on Sep 26, 2018
  18. jackyHuangH commented on Oct 18, 2018

    @jackyHuangH

    我使用过程出现了一个问题:主页面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。

  19. JessYanCoding commented on Oct 18, 2018

    @JessYanCoding
    Owner

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions