ViewPager中的嵌套片段的高度和宽度均为零

时间:2014-05-17 00:32:51

标签: android android-fragments fragmentpageradapter android-nested-fragment

我的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);
  }
}

2 个答案:

答案 0 :(得分:1)

我想出来了。如果有其他人遇到此问题,请确保您不在后台线程上操作UI组件或发生奇怪的事情。在我的情况下,我在使用RxJava的后台线程上进行Bitmap操作,但我忘了这一行:

.observeOn(AndroidSchedulers.mainThread());

因此,当我将位图放在订阅服务器的View中时,它位于后台线程上。容易犯错误。

答案 1 :(得分:0)

你的假设是正确的。关于强大的main线程与worker线程的处理,Android非常烦人。

例如,如果您触发一个SwipeRefreshLayout进行网络提取,并且在您执行setRefreshing(false)的背景上调用返回的回调,则可能不会向您显示任何警告但会导致奇怪的一面效果。

如果您在ViewPager内使用子片段,则此片段可能正常工作,但大小减小到(0, 0)或片段根布局的偏移量设置为screenWidth。因此,如果有后台线程访问用户界面,请务必仔细检查。