kongzue / DialogX

💬 DialogX dialog box component library, easy to use, more customizable, more scalable, easy to achieve a variety of dialog boxes. DialogX对话框组件库,更加方便易用,可自定义程度更高,扩展性更强,轻松实现各种对话框、菜单和提示效果,更有Material You、iOS、MIUI等主题扩展可选
Apache License 2.0
2.08k stars 217 forks source link

CustomDialog使用id和fragment作为OnBindView的参数,表现不一致 #239

Closed AreYReady closed 2 years ago

AreYReady commented 2 years ago

BUG 反馈

请先确认您已阅读《常见问题》

问题描述:

使用官网demo改造一下,做了个自定义底部弹出框俄罗斯套娃弹出。一个用layoutid,一个用fragment传入OnBindView 用id是一直弹出新的底部框符合预期 用fragment是替换,无动画效果,不符合预期,【且】。请看视频

设备信息:

请在此说明您使用的设备型号、Android 版本等信息以协助我们排查问题

是否在 Demo 中能复现此问题?

是/否/未尝试

问题截图/视频

id:

https://user-images.githubusercontent.com/13625746/188605201-7c1ed18d-4c6e-4ca5-9a7e-af24a1977c0b.mp4

fragment:

https://user-images.githubusercontent.com/13625746/188605640-1998b75a-0487-45d9-9655-47dff3af5e43.mp4

相应代码图:

image
kongzue commented 2 years ago

因为fragment的显示是必须基于一个已存在于资源中的id进行显示的,当一个activity内尝试弹出多个相同id的fragment,这种操作是无法进行的,本质上是FragmentManager限制了这件事,而fragment又无法脱离FragmentManager单独显示,此问题需要上报Google对系统底层进行修改。 建议使用自定义布局实现功能。

AreYReady commented 2 years ago

你说的多个相同id的fragment 是指同一个fragment吗,我这里是为了简单展示才这样写。我换成套娃弹不同的fragment还一样,这里的这个id指的是什么。

kongzue commented 2 years ago

id是指容器布局的id,此问题无解,需要Google修改fragment manager的逻辑,如果你有使用过feagment manager就很清楚我在说什么


发件人: AreYReady @.> 发送时间: Tuesday, September 6, 2022 6:11:45 PM 收件人: kongzue/DialogX @.> 抄送: Kongzue @.>; State change @.> 主题: Re: [kongzue/DialogX] CustomDialog使用id和fragment作为OnBindView的参数,表现不一致 (Issue #239)

你说的多个相同id的fragment 是指同一个fragment吗,我这里是为了简单展示才这样写。我换成套娃弹不同的fragment还一样,这里的这个id指的是什么。

― Reply to this email directly, view it on GitHubhttps://nam12.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgithub.com%2Fkongzue%2FDialogX%2Fissues%2F239%23issuecomment-1237947377&data=05%7C01%7C%7C5a1bd50e3ce94606427f08da8ff03448%7C84df9e7fe9f640afb435aaaaaaaaaaaa%7C1%7C0%7C637980559090736430%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000%7C%7C%7C&sdata=3vsaDwSH8YVL7lbESdCXUUudw4usThdN4yhZVj83qgE%3D&reserved=0, or unsubscribehttps://nam12.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgithub.com%2Fnotifications%2Funsubscribe-auth%2FACNFSH3LL4PBGYVRZTLEHCLV44KGDANCNFSM6AAAAAAQFVGS74&data=05%7C01%7C%7C5a1bd50e3ce94606427f08da8ff03448%7C84df9e7fe9f640afb435aaaaaaaaaaaa%7C1%7C0%7C637980559090736430%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000%7C%7C%7C&sdata=6ddw7jsI0NBc7SqikYG9A9mTs%2BAeUVHcW1dbsgvsJOE%3D&reserved=0. You are receiving this because you modified the open/close state.Message ID: @.***>

AreYReady commented 2 years ago

好的。

kongzue commented 2 years ago

因为我这边框架层是没办法去动态创建资源id的,如果必须使用fragment建议还是使用自定义布局,放一个framelayout,然后手动绑定fragment显示到framelayout里,注意弹出的新对话框里的framelayout的id一定要与之前的不同,因为fragmentmanager是基于activiry的,如果id相同依然会这样显示不出来


发件人: AreYReady @.> 发送时间: Tuesday, September 6, 2022 6:13:57 PM 收件人: kongzue/DialogX @.> 抄送: Kongzue @.>; State change @.> 主题: Re: [kongzue/DialogX] CustomDialog使用id和fragment作为OnBindView的参数,表现不一致 (Issue #239)

好的。

― Reply to this email directly, view it on GitHubhttps://nam12.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgithub.com%2Fkongzue%2FDialogX%2Fissues%2F239%23issuecomment-1237949924&data=05%7C01%7C%7Cd0606edbb78f4b4490c108da8ff0834d%7C84df9e7fe9f640afb435aaaaaaaaaaaa%7C1%7C0%7C637980560424184243%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000%7C%7C%7C&sdata=GAMBI3jARLk%2FFLBoN4jZjhScuVrhUzaTjeKLRYNG5l0%3D&reserved=0, or unsubscribehttps://nam12.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgithub.com%2Fnotifications%2Funsubscribe-auth%2FACNFSH36GPTBVQOTK4B2TRLV44KOLANCNFSM6AAAAAAQFVGS74&data=05%7C01%7C%7Cd0606edbb78f4b4490c108da8ff0834d%7C84df9e7fe9f640afb435aaaaaaaaaaaa%7C1%7C0%7C637980560424184243%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000%7C%7C%7C&sdata=d18p2J4feVLtiv09tRiCUKgN7jRiCAoZcI%2BMzuCWdfk%3D&reserved=0. You are receiving this because you modified the open/close state.Message ID: @.***>

AreYReady commented 2 years ago

这样说我就理解了。我明白你说的是什么了。【ps我刚才机智的尝试了下,第二次弹模式为dialogFragment,不行,有问题,不能搭配。】抱歉啊, 我对源码理解不深,胡乱尝试。确实用id自定义view的话是可以解决我的需求的。

kongzue commented 2 years ago

没事,这种事本质上还是google的历史遗留问题,事实上直接使用自定义布局的话会方便很多,还是google早期没考虑设计完善的view生命周期所导致的问题,我这边也会继续寻找更合适的解决方案


发件人: AreYReady @.> 发送时间: Tuesday, September 6, 2022 6:33:14 PM 收件人: kongzue/DialogX @.> 抄送: Kongzue @.>; State change @.> 主题: Re: [kongzue/DialogX] CustomDialog使用id和fragment作为OnBindView的参数,表现不一致 (Issue #239)

这样说我就理解了。我明白你说的是什么了。【ps我刚才机智的尝试了下,第二次弹模式为dialogFragment,不行,有问题,不能搭配。】抱歉啊, 我对源码理解不深,胡乱尝试。确实用id自定义view的话是可以解决我的需求的。

― Reply to this email directly, view it on GitHubhttps://nam12.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgithub.com%2Fkongzue%2FDialogX%2Fissues%2F239%23issuecomment-1237970419&data=05%7C01%7C%7Cbdbcfc0304d94a9c2bcf08da8ff33496%7C84df9e7fe9f640afb435aaaaaaaaaaaa%7C1%7C0%7C637980571985402265%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000%7C%7C%7C&sdata=IFJW8J6g6AdWo7sUFkv1bf1mVZEZXP532NR7Qjbd0K0%3D&reserved=0, or unsubscribehttps://nam12.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgithub.com%2Fnotifications%2Funsubscribe-auth%2FACNFSHZJK4O77DVQS3XGPVLV44MWVANCNFSM6AAAAAAQFVGS74&data=05%7C01%7C%7Cbdbcfc0304d94a9c2bcf08da8ff33496%7C84df9e7fe9f640afb435aaaaaaaaaaaa%7C1%7C0%7C637980571985402265%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000%7C%7C%7C&sdata=TwM8v%2B3fWJKwcZV%2F3uXnrVCfK0wYi6XxK64pmdIONo8%3D&reserved=0. You are receiving this because you modified the open/close state.Message ID: @.***>

AreYReady commented 2 years ago

这几天在想,如果使用fragment的缺陷是框架无法动态创建资源id,由调用者自己去在布局里放入frameLayou,然后将id作为参数传入onbindView里面。取代id_frame_layout_custom。我简单在demo了改造了下,能显示,但没有相对应的动画,已经其他一些功能,我并不理解其中的缘由。

kongzue commented 2 years ago

我已经在考虑自己实现一套替代FragmentManager的组件了,不过这需要时间去验证可行性


发件人: AreYReady @.> 发送时间: Friday, September 9, 2022 4:41:59 PM 收件人: kongzue/DialogX @.> 抄送: Kongzue @.>; State change @.> 主题: Re: [kongzue/DialogX] CustomDialog使用id和fragment作为OnBindView的参数,表现不一致 (Issue #239)

这几天在想,如果使用fragment的缺陷是框架无法动态创建资源id,由调用者自己去在布局里放入frameLayou,然后将id作为参数传入onbindView里面。取代id_frame_layout_custom。我简单在demo了改造了下,能显示,但没有相对应的动画,已经其他一些功能,我并不理解其中的缘由。

― Reply to this email directly, view it on GitHubhttps://nam12.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgithub.com%2Fkongzue%2FDialogX%2Fissues%2F239%23issuecomment-1241682408&data=05%7C01%7C%7C9aad42834c7243954e5a08da923f294a%7C84df9e7fe9f640afb435aaaaaaaaaaaa%7C1%7C0%7C637983097234518696%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000%7C%7C%7C&sdata=EZn2Kp30b2ZLzV3SRzeHSpToDOeKm%2FJ2jlbnnHajuWE%3D&reserved=0, or unsubscribehttps://nam12.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgithub.com%2Fnotifications%2Funsubscribe-auth%2FACNFSHYI4OCNVNEBSKGGQXDV5LZ5PANCNFSM6AAAAAAQFVGS74&data=05%7C01%7C%7C9aad42834c7243954e5a08da923f294a%7C84df9e7fe9f640afb435aaaaaaaaaaaa%7C1%7C0%7C637983097234518696%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000%7C%7C%7C&sdata=AHRQ%2BCO5Yf%2B4V5d4SgCprIc%2B8GJQoh54UVfHsINv5C8%3D&reserved=0. You are receiving this because you modified the open/close state.Message ID: @.***>

AreYReady commented 2 years ago

叹为观止啊,大佬。你对源码是有多了解啊。要不要方案都是这么高级的。

kongzue commented 2 years ago

很不幸失败了,很多东西都被private掉了,FragmentManagerImpl 也无法自己创建,Google限制太多了

AreYReady commented 2 years ago

了解,胳膊拧不过大腿。如果自我创建做不到,那是否能以参数的形式让调用者传入frameLayout的id,以便 拓展。

kongzue commented 2 years ago

别着急,我在想别的办法,刚刚试验的结果是,我可以自己模拟Fragment的全生命周期过程,但对于内部所使用到的Hosts等元素无法hook,这会导致 Fragment 是无法真的完整使用,模拟这条路应该是不通的,在尝试别的办法

kongzue commented 2 years ago

请更新至 0.0.46.beta15 版本,已经对同一 activity 显示多个 fragment 的问题进行了处理,最终使用的方案为动态创建未使用的 id

AreYReady commented 2 years ago

啥意思,一开始多创建几个id放着,然后同页面按顺序去使用吗。

kongzue commented 2 years ago

不是,搞定动态生成id了


发件人: AreYReady @.> 发送时间: Tuesday, September 13, 2022 3:48:58 PM 收件人: kongzue/DialogX @.> 抄送: Kongzue @.>; State change @.> 主题: Re: [kongzue/DialogX] CustomDialog使用id和fragment作为OnBindView的参数,表现不一致 (Issue #239)

啥意思,一开始多创建几个id放着,然后同页面按顺序去使用吗。

― Reply to this email directly, view it on GitHubhttps://nam12.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgithub.com%2Fkongzue%2FDialogX%2Fissues%2F239%23issuecomment-1245030329&data=05%7C01%7C%7Cd86d9ef696e94f69a59a08da955c6b2f%7C84df9e7fe9f640afb435aaaaaaaaaaaa%7C1%7C0%7C637986521418830169%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000%7C%7C%7C&sdata=s%2FCUIOndE66hbPRFncvOQN2tdRcrPKU0FX75lfkRuFc%3D&reserved=0, or unsubscribehttps://nam12.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgithub.com%2Fnotifications%2Funsubscribe-auth%2FACNFSH2QOJ4XNKWOXGTUYA3V6AWWVANCNFSM6AAAAAAQFVGS74&data=05%7C01%7C%7Cd86d9ef696e94f69a59a08da955c6b2f%7C84df9e7fe9f640afb435aaaaaaaaaaaa%7C1%7C0%7C637986521418830169%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000%7C%7C%7C&sdata=Jk5ancqayf%2B5wei2vLP2TVT5gFipOtfKu%2FY6qeKuMOI%3D&reserved=0. You are receiving this because you modified the open/close state.Message ID: @.***>

shejishi commented 1 year ago

动态生成id会导致使用fragment弹不出来,报错信息:

java.lang.IllegalArgumentException: No view found for id 0xbe3df20a (unknown) for fragment FarmBackpackFragment{e908fb6} (655e4e8a-2500-4d30-920e-93007be62832 id=0xbe3df20a)
    at androidx.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:514)
    at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:261)
    at androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:1890)
    at androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:1808)
    at androidx.fragment.app.FragmentManager.execPendingActions(FragmentManager.java:1751)
    at androidx.fragment.app.FragmentManager$5.run(FragmentManager.java:538)
    at android.os.Handler.handleCallback(Handler.java:739)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:148)
    at android.app.ActivityThread.main(ActivityThread.java:5647)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:745)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:635)
kongzue commented 1 year ago

动态生成id会导致使用fragment弹不出来,报错信息:

java.lang.IllegalArgumentException: No view found for id 0xbe3df20a (unknown) for fragment FarmBackpackFragment{e908fb6} (655e4e8a-2500-4d30-920e-93007be62832 id=0xbe3df20a)
  at androidx.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:514)
  at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:261)
  at androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:1890)
  at androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:1808)
  at androidx.fragment.app.FragmentManager.execPendingActions(FragmentManager.java:1751)
  at androidx.fragment.app.FragmentManager$5.run(FragmentManager.java:538)
  at android.os.Handler.handleCallback(Handler.java:739)
  at android.os.Handler.dispatchMessage(Handler.java:95)
  at android.os.Looper.loop(Looper.java:148)
  at android.app.ActivityThread.main(ActivityThread.java:5647)
  at java.lang.reflect.Method.invoke(Native Method)
  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:745)
  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:635)

请确认你的堆栈信息中存在 DialogX 的错误信息,我这边无法处理非 DialogX 框架的问题。