我的Activity
内有一个Fragment
。在这个片段中,我有一个ViewPager
页面片段。这使得分页片段片段中的片段是子片段中的Activity。基本上是这样的:
Activity
|
|
Fragment
|
(ViewPager)
| |
| |
Fragment Fragment
每隔一段时间,看似随意,ViewPager中的碎片将无法显示。我在层次结构查看器中查看了View层次结构,注意到当发生这种情况时,子片段(在我的图片底部)在布局中,但子视图的根视图为零高度和零宽度(从层次结构树中的每个视图到叶视图一样)。 ViewPager
确实有高度和宽度,但它的页面片段没有。
如果我此时旋转设备,我的孩子片段会出现!
我不知道为什么会发生这种情况。我与ViewPager一起使用的适配器需要FragmentManager
,并且我通过调用getChildFragmentManager()使用活动内部片段中的那个。我觉得我在做我应该做的所有事情,不知道在这一点上看下一步。
更新:
有趣的是,如果我将附加适配器的代码放入Runnable中的ViewPager并将其发布到Handler,则问题是100%可重现的。即。
class MyFragment extends Fragment {
@Override
public void onActivityCreated(Bundle b) {
super.onActivityCreated(b);
runPager = new Runnable() {
@Override
public void run() {
viewPager.setAdapter(adapter);
}
};
handler.post(runPager);
}
}
答案 0 :(得分:1)
我想出来了。如果有其他人遇到此问题,请确保您不在后台线程上操作UI组件或发生奇怪的事情。在我的情况下,我在使用RxJava的后台线程上进行Bitmap操作,但我忘了这一行:
.observeOn(AndroidSchedulers.mainThread());
因此,当我将位图放在订阅服务器的View中时,它位于后台线程上。容易犯错误。
答案 1 :(得分:0)
你的假设是正确的。关于强大的main
线程与worker
线程的处理,Android非常烦人。
例如,如果您触发一个SwipeRefreshLayout
进行网络提取,并且在您执行setRefreshing(false)
的背景上调用返回的回调,则可能不会向您显示任何警告但会导致奇怪的一面效果。
如果您在ViewPager
内使用子片段,则此片段可能正常工作,但大小减小到(0, 0)
或片段根布局的偏移量设置为screenWidth。因此,如果有后台线程访问用户界面,请务必仔细检查。