Comments (9)
@LinkZhang getTopFragment方法里是
` SupportFragment getTopFragment(FragmentManager fragmentManager) {
List<Fragment> fragmentList = fragmentManager.getFragments();
if (fragmentList != null) {
for (int i = fragmentList.size() - 1; i >= 0; i--) {
Fragment fragment = fragmentList.get(i);
if (fragment != null && fragment instanceof SupportFragment) {
return (SupportFragment) fragment;
}
}
}
return null;
}
`
应该是你的场景下栈内找不到SupportFragment了;
另外谢谢你提醒,我会把每次开始Fragment事务时hack fix栈的顺序代码,放到popTo后,确保不会出现栈内顺序BUG
:)
from fragmentation.
@LinkZhang 多多反馈哈 有任何问题随时提出 :)
from fragmentation.
@YoKeyword 场景大概是这样连续pop多个fragment(A,B)再add(C),发现C在getfragments()里的位置是2,再add fragment分配的位置是0,1;导致获取的栈顶fragment是C而不是新add的。本以为是异步操作引起的,放在runnable里也没起作用,后来把getTopFragmeng()改成以下代码正常了
int count = fragmentManager.getBackStackEntryCount();
if (count >0) {
String tag = fragmentManager.getBackStackEntryAt(fragmentManager.getBackStackEntryCount() - 1).getName();
Fragment fragment = fragmentManager.findFragmentByTag(tag);
if (fragment != null && fragment instanceof SupportFragment) {
return (SupportFragment)fragment;
}
}
return null;
from fragmentation.
@LinkZhang
from fragmentation.
@LinkZhang 从你的描述,C在2的位置,所以肯定是来没来得及pop A,B的时候,C就进栈了,这样就产生了异常~
如果pop后需要立刻start(C),你应该调用
popTo(Class fragmentClass, boolean includeSelf, Runnable afterTransaction)
这个方法,它可以确保你在出栈后立刻执行下一项Fragment事务时保证正常,比如你接着start(C)
from fragmentation.
@YoKeyword popTo()这个方法好像不能连to也pop,我需要清空所有fragment,所以我增加了一个popAll方法
public void popAll(Runnable runnable){
mActivity.preparePopMultiple();
int count = mFragmentManager.getBackStackEntryCount();
while (count>0){
mFragmentManager.popBackStackImmediate();
count--;
}
mActivity.popFinish();
if (runnable!=null) {
mHandler.post(runnable);
}
}
调用这个方法的确执行的是先pop后add,虽然BackStack已经为空了,但getFragments()并不为空,还是会出现新add的fragment顺序错误的问题,所以getTopFragment()通过顺序来取栈顶fragment会有问题
from fragmentation.
@LinkZhang 我不理解为什么要这么处理 连续pop单个Fragment,我以前好像是测试过,是不安全的,会引起一些异常~ 你现在的状况 BackSack为空 getFragments()不为空 说明出栈已经异常了
popTo(第一个Fragment,true,new Runnable(你的后续事务))
这个方法我一直用的,目前没发现问题
你检查下 代码 用这个方法试试, 发生栈内异常就很危险了,应该从解决栈内异常解决这个问题 :)
from fragmentation.
@YoKeyword 是吗,一直没什么异常,我改成这样应该可以吧
public void popAll(Runnable runnable){
mActivity.preparePopMultiple();
int count = mFragmentManager.getBackStackEntryCount();
if (count>0) {
mFragmentManager.popBackStackImmediate(mFragmentManager.getBackStackEntryAt(0).getName(), FragmentManager.POP_BACK_STACK_INCLUSIVE);
}
mActivity.popFinish();
if (runnable!=null) {
mHandler.post(runnable);
}
}
不过,我刚刚测试了一下,getFragments()的顺序还是不对,getFragments里的顺序真的可以标记fragment的真实顺序?
from fragmentation.
@LinkZhang 异常不是报错,而是一些隐患,后续可能会导致一些不正常的情况
你getFragments的时机稍微延迟点打印下,Fragment相关的一些调试都需要稍微延迟下,或者通过API提供的查看栈视图 方法查看栈内的情况~ 我用popTo(事务)的那个方法执行后,查看栈视图(内部就是getFragments),一切正常
我早上更新了getTopFragment方法,换成了你的方式,以及HackFix的方法,放倒了popFix里
`private void popBackFix(Class<?> fragmentClass, int flag, final FragmentManager fragmentManager) {
mActivity.preparePopMultiple();
fragmentManager.popBackStackImmediate(fragmentClass.getName(), flag);
mActivity.popFinish();
mHandler.post(new Runnable() {
@Override
public void run() {
FragmentTransactionBugFixHack.reorderIndices(fragmentManager);
}
});
}`
from fragmentation.
Related Issues (20)
- viewpager嵌套viewpager,中第二个viewpager中的onLazyInitView和onSupportVisible步骤 HOT 1
- 不维护可能是随着谷歌逐步对fragment的优化,作者觉得越来越鸡肋了吧 HOT 2
- 结合ViewPager的父布局底部会被键盘顶起 HOT 3
- 废弃的原因是什么 HOT 4
- fragment栈的问题 must call loadRootFragment first HOT 1
- EasyFragmentation
- google 官方fragment 导航框架 navigation-fragment+navigation-ui HOT 7
- 消息队列管理为什么size==1才执行 ,如果>1 那么岂不是无法执行了? HOT 2
- viewpager上有输入框,输入框会把底部导航栏顶起来怎么怎么解决 HOT 1
- Fragmentation升级版, 欢迎试用
- 这么好的开源库放弃更新太可惜了,有大佬能和作者接触下接手吗? HOT 5
- 字体大小异常问题
- Fragmentation升级版,欢迎试用 HOT 1
- 如果viewpager在activity第一层级,初始化的时候viewpager中所有fragment的onLazyInitView都会被回调 HOT 2
- 为什么在Handler.post里调用onSupportVisible, 而不是直接调用? HOT 1
- popTo() has not been attached yet HOT 2
- onSupportVisible 在三星note5、s6上 不可用
- JCenter to be dismissed - please migrate to Maven Central HOT 1
- 使用popTo方法时被pop的Fragment不会调用onDestroy方法
- pop 动画在高版本(SDK 31,androidx.fragment 1.3.6)上异常
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from fragmentation.