janthsueh / fragmentation Goto Github PK
View Code? Open in Web Editor NEWThis project forked from yokeyword/fragmentation
A powerful library that manage Fragment for Android
License: Apache License 2.0
This project forked from yokeyword/fragmentation
A powerful library that manage Fragment for Android
License: Apache License 2.0
这是咋回事啊兄弟们
Following information can help us to resolve the issue faster.
In addition, we do not accept issues unrelated to Fragmentation.
如题!
最近在升级项目的 targetSdkVersion 到了 31,androidx.fragment 到了 1.3.6。
发现当 pop 横向返回的时候,动画问题很大,请帮忙确认一下?万分感激。
很高兴大佬接手这项目。
我遇到了下面的问题:
A Activity页面有ViewPager+4个fragment
B Activity页面只有一个按钮
先打开A再打开B页面,点击按钮,通过类似EventBus这一类总线告知A页面,切换Viewpager的位置,然后点击返回A页面,发现切换后新的fragment页面是没有调用到supportVisible函数的,onLazyLoad更没有。
在多此尝试后,发现这是跟fragment是否在offscreenPageLimit缓存范围内有关的,如果在缓存范围外,切换Viewpager后可以调用到supportVisible函数,在缓存范围内就不能调用到。
目前我是自己重写setUserVisibleHint等来实现切换监听的,不知道我这样使用fragmentation对不对
多处需要跳转到同一个地方,想在跳转的代码里获取当前fragment或者ParentFragment实例来start(),请问如何获取呢。
version : api 'me.xuexuan:fragmentationx:1.0.6'
log:
java.lang.IllegalStateException
Cannot show Fragment attached to a different FragmentManager. Fragment MFragment{9761232 (fd8ecaff-bafb-44d8-8431-d8f1f625a1ae) id=0x7f0901b8 com.xxx.MFragment} is already attached to a FragmentManager
1 androidx.fragment.app.BackStackRecord.show(BackStackRecord.java:210)
2 me.yokeyword.fragmentation.TransactionDelegate.doShowHideFragment(TransactionDelegate.java:453)
3 me.yokeyword.fragmentation.TransactionDelegate.access$500(TransactionDelegate.java:32)
4 me.yokeyword.fragmentation.TransactionDelegate$5.run(TransactionDelegate.java:144)
5 me.yokeyword.fragmentation.queue.ActionQueue.handleAction(ActionQueue.java:53)
6 me.yokeyword.fragmentation.queue.ActionQueue.enqueueAction(ActionQueue.java:45)
7 me.yokeyword.fragmentation.queue.ActionQueue.access$000(ActionQueue.java:17)
8 me.yokeyword.fragmentation.queue.ActionQueue$1.run(ActionQueue.java:37)
9 android.os.Handler.handleCallback(Handler.java:900)
10 android.os.Handler.dispatchMessage(Handler.java:103)
11 android.os.Looper.loop(Looper.java:219)
12 android.app.ActivityThread.main(ActivityThread.java:8349)
13 java.lang.reflect.Method.invoke(Native Method)
14 com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:513)
15 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1055)
APP分布(结构):
MainFragment
|----Fragment1
----|----(child)(Fragment1+Fragment2+Fragment3)
|----Fragment2
----|----(child)Fragment
|----Fragment3
----|----Fragment
--------|----(child) Fragment1 + Fragment2
----|----Fragment
点击回退键,上一个Fragment卡半屏幕。
https://github.com/AdrianAndroid/Fragmentation/blob/learn/WechatIMG15.jpeg
Following information can help us to resolve the issue faster.
In addition, we do not accept issues unrelated to Fragmentation.
Following information can help us to resolve the issue faster.
In addition, we do not accept issues unrelated to Fragmentation.
我看到Fragmentation
中是通过getUserVisibleHint
判断是否可见的,但是ViewPager1
最新版和ViewPager2
是通过setMaxLifecycle
控制fragment可见性的。
目前我测试了下,ViewPager2
中放置了Fragment
,一打开会把ViewPager
上所有的supportVisible()
都调用了,而不是滑倒那一页才调用。旧版的ViewPager
使用getUserVisibleHint判断方式,则不会有这个问题,滑动到那一页才会调用其supportVisible()
。
不知道有没有大佬有没有高招兼容下。
Following information can help us to resolve the issue faster.
In addition, we do not accept issues unrelated to Fragmentation.
android 10
java.lang.IllegalAccessError: Field 'androidx.fragment.app.FragmentManager.mStateSaved' is inaccessible to class 'androidx.fragment.app.FragmentationMagician'
在demo的wechat模块中,连续启动多个CyclerFragment后,然后侧滑返回,会直接回到初始的fragment,而不是一级一级逐步返回
建议使用OnBackPressedDispatcher实现该功能。startXXforResult建议使用registerForActivityResult。都是androidX提供的。
Following information can help us to resolve the issue faster.
想问下为什么 pop函数里面(包括popTo)都有一个先remove再 popBackStack的逻辑,这里只做popBackStack 应该就有remove的效果,一直没看明白是为什么,求大佬解惑
In addition, we do not accept issues unrelated to Fragmentation.
api 'me.xuexuan:fragmentation:1.0.6'
api 'me.xuexuan:fragmentation-swipeback:1.0.6'
无法下载
作者大大以及各位小伙伴,我的项目中,首页底部用了Tab,用loadMultipleRootFragment加载多个同级根Fragment。
其中一个Fragment是购物车,当用户没有登录的时候,我点击这个购物车的tab,需要先跳到登录页,登录完成后再进入这个购物车的Fragment。
AccountHelper.getInstance().doLoginIfNeed(MainFragment.this, new AccountHelper.OnLoginHandler() {
@OverRide
public void next(SupportFragment currentFragment) {
showHideFragment(mFragments.get(position));
}
});
但是登录完成,登录页finish掉,执行 showHideFragment(mFragments.get(position));进入购物车fragment的时候,页面卡主了,打印发现购物车fragment的onSupportVisible()这个方法没有执行。
请问这个问题咋解决呢,有遇到的小伙伴看到了也麻烦告诉我一下,非常感谢。
是这样的,我想实现全屏能滑动关闭页面,然后设置了setEdgeLevel(SwipeBackLayout.EdgeLevel.MAX);
(ps:原作者好像说不推荐设置MAX,但是今日头条,YouTube这些都是全屏可以关闭的)
这样生效了,但是也产生了新的问题:就是我左手大拇指下滑时,总是被误判为开始拖动关闭;右手大拇指上滑时,也会被误判为拖动关闭。
找了很久,我也始终没有找到设置灵敏度的接口,所以希望看能不能加一个这样的接口呢?
java.lang.ClassCastException: android.view.View cannot be cast to android.view.ViewGroup
线上报的错,问题应该是出在这一段代码里。然后出问题的Activity是一个简单的页面,没有额外添加View。设备也很统一,90%都是三星的手机
Library version
"fragmentationx" : 'me.yokeyword:fragmentationx:1.0.2',
"fragmentationx-swipeback" : 'me.yokeyword:fragmentationx-swipeback:1.0.2',
Support-v4 version
Logs
In addition, we do not accept issues unrelated to Fragmentation.
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.mall/com.example.mall.MainActivity}: java.lang.ClassCastException: com.example.mall.MainActivity cannot be cast to me.yokeyword.fragmentation.SupportActivity
**In addition, we do not accept issues unrelated to Fragmentation.**
当嵌套层级深时,出现AccessibilityManager或者InputMethodManager报内存泄漏,希望能解决这个问题
Following information can help us to resolve the issue faster.
In addition, we do not accept issues unrelated to Fragmentation.
java.lang.NullPointerException:
at android.view.ViewGroup.removeViewInternal (ViewGroup.java:5300)
at android.view.ViewGroup.removeViewAt (ViewGroup.java:5263)
at androidx.fragment.app.FragmentManager.moveFragmentToExpectedState (FragmentManager.java:1446)
at androidx.fragment.app.FragmentManager.moveToState (FragmentManager.java:1497)
at androidx.fragment.app.BackStackRecord.executeOps (BackStackRecord.java:447)
at androidx.fragment.app.FragmentManager.executeOps (FragmentManager.java:2169)
at androidx.fragment.app.FragmentManager.executeOpsTogether (FragmentManager.java:1992)
at androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute (FragmentManager.java:1947)
at androidx.fragment.app.FragmentManager.execPendingActions (FragmentManager.java:1849)
at androidx.fragment.app.FragmentManager.popBackStackImmediate (FragmentManager.java:641)
at androidx.fragment.app.FragmentManager.popBackStackImmediate (FragmentManager.java:596)
at me.yokeyword.fragmentation.TransactionDelegate.safePopTo (TransactionDelegate.java:503)
at me.yokeyword.fragmentation.TransactionDelegate.access$800 (TransactionDelegate.java:34)
at me.yokeyword.fragmentation.TransactionDelegate$5.run (TransactionDelegate.java:232)
at me.yokeyword.fragmentation.queue.ActionQueue.handleAction (ActionQueue.java:58)
at me.yokeyword.fragmentation.queue.ActionQueue.enqueueAction (ActionQueue.java:46)
at me.yokeyword.fragmentation.queue.ActionQueue.access$000 (ActionQueue.java:17)
at me.yokeyword.fragmentation.queue.ActionQueue$1.run (ActionQueue.java:37)
at android.os.Handler.handleCallback (Handler.java:790)
at android.os.Handler.dispatchMessage (Handler.java:99)
at android.os.Looper.loop (Looper.java:164)
at android.app.ActivityThread.main (ActivityThread.java:6548)
at java.lang.reflect.Method.invoke (Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:438)
at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:857)
作者大大以及各位小伙伴,我的项目中,首页底部用了Tab,用loadMultipleRootFragment加载多个同级根Fragment。
其中一个Fragment是购物车,当用户没有登录的时候,我点击这个购物车的tab,需要先跳到登录页,登录完成后再进入这个购物车的Fragment。
AccountHelper.getInstance().doLoginIfNeed(MainFragment.this, new AccountHelper.OnLoginHandler() {
@OverRide
public void next(SupportFragment currentFragment) {
showHideFragment(mFragments.get(position));
}
});
但是登录完成,登录页finish掉,执行 showHideFragment(mFragments.get(position));进入购物车fragment的时候,页面卡主了,打印发现onSupportVisible这个方法没有执行。
请问这个问题咋解决呢,有遇到的小伙伴看到了也麻烦告诉我一下,非常感谢。
我看了一下原作者的代码
private void enqueueDispatchVisible() {
taskDispatchSupportVisible = new Runnable() {
@Override
public void run() {
taskDispatchSupportVisible = null;
dispatchSupportVisible(true);
}
};
getHandler().post(taskDispatchSupportVisible);
}
这里是直接post了一条任务
你的这个方法是这样的
private void enqueueDispatchVisible() {
mIdleDispatchSupportVisible = new MessageQueue.IdleHandler() {
@Override
public boolean queueIdle() {
dispatchSupportVisible(true);
mIdleDispatchSupportVisible = null;
return false;
}
};
Looper.myQueue().addIdleHandler(mIdleDispatchSupportVisible);
}
是用空闲任务去调用dispatchSupportVisible,但是有时候不走回调导致我的fragment生命周期的onSupportVisible不执行,请问我要怎么处理
version : 1.0.6
描述:fragment内再嵌套孩子fragment(只占部分界面,无法作为兄弟节点start),这种情况如何打开孩子fragment?
Activity.popTo(H5Fragment.class, true, null, 0);
Following information can help us to resolve the issue faster.
In addition, we do not accept issues unrelated to Fragmentation.
java.lang.IllegalAccessError
Field 'androidx.fragment.app.FragmentManager.mStateSaved' is inaccessible to class 'androidx.fragment.app.FragmentationMagician'
2 androidx.fragment.app.FragmentationMagician.void popBackStackAllowingStateLoss(androidx.fragment.app.FragmentManager,java.lang.String,int)(FragmentationMagician.java:2)
3 me.yokeyword.fragmentation.TransactionDelegate.void safePopTo(java.lang.String,androidx.fragment.app.FragmentManager,int,java.util.List)(TransactionDelegate.java:98)
4 me.yokeyword.fragmentation.TransactionDelegate.void mockPopToAnim(androidx.fragment.app.Fragment,java.lang.String,androidx.fragment.app.FragmentManager,int,java.util.List,int)(TransactionDelegate.java:108)
5 me.yokeyword.fragmentation.TransactionDelegate.void doPopTo(java.lang.String,boolean,androidx.fragment.app.FragmentManager,int)(TransactionDelegate.java:91)
6 me.yokeyword.fragmentation.TransactionDelegate.void access$1200(me.yokeyword.fragmentation.TransactionDelegate,java.lang.String,boolean,androidx.fragment.app.FragmentManager,int)(TransactionDelegate.java:5)
7 me.yokeyword.fragmentation.TransactionDelegate$11.void run()(TransactionDelegate.java:1)
8 me.yokeyword.fragmentation.queue.ActionQueue.void handleAction()(ActionQueue.java:10)
9 me.yokeyword.fragmentation.queue.ActionQueue.void access$200(me.yokeyword.fragmentation.queue.ActionQueue)(ActionQueue.java:1)
10 me.yokeyword.fragmentation.queue.ActionQueue$2.void run()(ActionQueue.java:2)
11 android.os.Handler.handleCallback(Handler.java:739)
12 android.os.Handler.dispatchMessage(Handler.java:95)
13 android.os.Looper.loop(Looper.java:148)
14 android.app.ActivityThread.main(ActivityThread.java:5619)
15 java.lang.reflect.Method.invoke(Native Method)
nothing
java.lang.NullPointerException: Attempt to invoke virtual method 'int me.yokeyword.fragmentation.anim.FragmentAnimator.getEnter()' on a null object reference
请问下,我通过继承的方式,但是运行项目就回报错找不到类文件,请问该怎么修改
Following information can help us to resolve the issue faster.
In addition, we do not accept issues unrelated to Fragmentation.
Dear @JantHsueh,
I faced the issue "The onLazyInit callback is often not called" on all our devices. (Samsung S10 plus, Nokia 5.1, ...).
I force rollback 1.0.5 version to hotfix this issue.
Please help me fix this issue.
Thanks
appCompatVersion = "1.6.1" popTo 闪退
Process: me.xuexuan.fragmentation, PID: 4763
java.lang.IllegalStateException: Fragment LoginFragment{85d6ad} (9084c050-559f-46f8-86c7-bf46f7ff1022) has not been attached yet.
at androidx.fragment.app.Fragment.getChildFragmentManager(Fragment.java:1075)
at me.yokeyword.fragmentation.helper.internal.VisibleDelegate.dispatchChildOnFragmentShownWhenNotResumed(VisibleDelegate.java:139)
at me.yokeyword.fragmentation.helper.internal.VisibleDelegate.onFragmentShownWhenNotResumed(VisibleDelegate.java:135)
at me.yokeyword.fragmentation.helper.internal.VisibleDelegate.onHiddenChanged(VisibleDelegate.java:119)
at me.yokeyword.fragmentation.SupportFragmentDelegate.onHiddenChanged(SupportFragmentDelegate.java:236)
at me.yokeyword.sample.demo_flow.base.MySupportFragment.onHiddenChanged(MySupportFragment.java:98)
at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:374)
at androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:2180)
at androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:2100)
at androidx.fragment.app.FragmentManager.popBackStackImmediate(FragmentManager.java:781)
at androidx.fragment.app.FragmentManager.popBackStackImmediate(FragmentManager.java:719)
at me.yokeyword.fragmentation.TransactionDelegate.safePopTo(TransactionDelegate.java:503)
at me.yokeyword.fragmentation.TransactionDelegate.mockPopToAnim(TransactionDelegate.java:456)
at me.yokeyword.fragmentation.TransactionDelegate.doPopTo(TransactionDelegate.java:434)
at me.yokeyword.fragmentation.TransactionDelegate.access$1100(TransactionDelegate.java:34)
at me.yokeyword.fragmentation.TransactionDelegate$10.run(TransactionDelegate.java:329)
at me.yokeyword.fragmentation.queue.ActionQueue.handleAction(ActionQueue.java:58)
at me.yokeyword.fragmentation.queue.ActionQueue.enqueueAction(ActionQueue.java:46)
at me.yokeyword.fragmentation.queue.ActionQueue.access$000(ActionQueue.java:17)
at me.yokeyword.fragmentation.queue.ActionQueue$1.run(ActionQueue.java:37)
at android.os.Handler.handleCallback(Handler.java:942)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loopOnce(Looper.java:201)
at android.os.Looper.loop(Looper.java:288)
at android.app.ActivityThread.main(ActivityThread.java:7959)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:942)
使用 appCompatVersion = "1.1.0" 正常。
private boolean isThrottleBACK(Action action) {
if (action.action == Action.ACTION_BACK) {
Action head = mQueue.peek();
if (head != null && head.action == Action.ACTION_POP) {
return true;
}
}
return false;
}
大佬,这种问题请您能不能告诉下怎么定位?
我是修改的以前同事的项目,他用的YoKeyword的fragment开源库,fragment的adapter是在线资源,我换了在线资源,fragment就显示不出来,fragment的onSupportVisible有被回调。
我的微信:1054765344,
Following information can help us to resolve the issue faster.
In addition, we do not accept issues unrelated to Fragmentation.
使用replaceFragment方法,多次快速切换的时候报错,如下:
java.lang.IllegalStateException: Fragment no longer exists for key f0: unique id 7ff9f5f2-0a41-4fc4-a9d5-1519e3c56f6d
at androidx.fragment.app.FragmentManagerImpl.getFragment(FragmentManagerImpl.java:365)
at androidx.fragment.app.FragmentStatePagerAdapter.restoreState(FragmentStatePagerAdapter.java:309)
at androidx.viewpager.widget.ViewPager.onRestoreInstanceState(ViewPager.java:1461)
at android.view.View.dispatchRestoreInstanceState(View.java:15805)
at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:3274)
at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:3282)
at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:3282)
at android.view.View.restoreHierarchyState(View.java:15783)
at androidx.fragment.app.Fragment.restoreViewState(Fragment.java:548)
at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManagerImpl.java:907)
at androidx.fragment.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManagerImpl.java:1238)
at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManagerImpl.java:1303)
at androidx.fragment.app.BackStackRecord.executeOps(BackStackRecord.java:439)
at androidx.fragment.app.FragmentManagerImpl.executeOps(FragmentManagerImpl.java:2079)
at androidx.fragment.app.FragmentManagerImpl.executeOpsTogether(FragmentManagerImpl.java:1869)
at androidx.fragment.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManagerImpl.java:1824)
at androidx.fragment.app.FragmentManagerImpl.execPendingActions(FragmentManagerImpl.java:1727)
at androidx.fragment.app.FragmentManagerImpl$2.run(FragmentManagerImpl.java:150)
at android.os.Handler.handleCallback(Handler.java:761)
at android.os.Handler.dispatchMessage(Handler.java:98)
at android.os.Looper.loop(Looper.java:156)
at android.app.ActivityThread.main(ActivityThread.java:6623)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:942)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:832)
**我用这个库半年了,看到作者停止维护,就想拉下来,自己维护,在原作者issues中看到你在接任维护,我想把sdk升级到29,发现报错了,FragmentManagerImpl这个类非public,原作者写的FragmentationMagician无法访问FragmentManagerImpl,于是乎去找答案,没找到,自己折腾了一上午,终于搞定了,就是把AndroidX中FragmentManagerImpl源代码完全复制一份,新建一个一模一样的包名,效果如下图所示.最后能正常跑起来,暂时没发现什么bug..大佬既然有心维护,能不能建个群一起交流讨论,这个库真心挺好用的. 上个issure中的setMaxLifeCycle,是新api,getUserVisibleHint确实已经废弃了,那么FragmentManagerImpl可以自己复制,是不是可以想想办法,应用到setMaxLifeCycle呢?
**
需要弹出多个Fragment时,调用popTo崩溃,提示Fragment ... has not been attached yet.
不知道是否是这个原因:YoKeyword#1265
Following information can help us to resolve the issue faster.
In addition, we do not accept issues unrelated to Fragmentation.
Caused by java.lang.NullPointerException
Attempt to invoke virtual method 'int me.yokeyword.fragmentation.anim.FragmentAnimator.getEnter()' on a null object reference me.yokeyword.fragmentation.helper.internal.AnimatorHelper.initEnterAnim
me.yokeyword.fragmentation.helper.internal.AnimatorHelper.initEnterAnim (AnimatorHelper.java:63)
me.yokeyword.fragmentation.helper.internal.AnimatorHelper.notifyChanged (AnimatorHelper.java:29)
me.yokeyword.fragmentation.helper.internal.AnimatorHelper. (AnimatorHelper.java:24)
me.yokeyword.fragmentation.SupportFragmentDelegate.onCreate (SupportFragmentDelegate.java:119)
me.yokeyword.fragmentation.SupportFragment.onCreate (SupportFragment.java:49)
I have no problem with the demo project. It just happened on my project.
The backstack has many stacks.
I don't understand why you use Looper.myQueue().addIdleHandler
instead of getHandler().post
I have tried to keep your version 1.0.6, only using getHandler ().post
--> This issue is resolved
Originally posted by @HuuNguyen312 in #11 (comment)
代码里除了用Fragmentation框架,还有个模块,单独用了一个activity,想问下有没有办法从这个单独的activity跳转到Fragmentation框架里的某个fragment。
Following information can help us to resolve the issue faster.
In addition, we do not accept issues unrelated to Fragmentation.
public boolean isSupportVisible() {
return mCurrentVisible;
}
调了半天才发现这个方法一直返回的是错误的值,fuck,support版本都是正常的,--
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.