【问题标题】:Nested Fragments within ViewPager have zero height and widthViewPager 中的嵌套片段的高度和宽度为零
【发布时间】:2014-05-17 00:32:50
【问题描述】:

我有一个Activity,里面有一个Fragment。在这个 Fragment 中,我有一个 ViewPager 来分页 Fragments。这使得分页的 Fragment 成为 Activity 内 Fragment 的子代。基本上是这样的:

    Activity
       |
       |
    Fragment
       |
   (ViewPager)
    |       |
    |       |
Fragment  Fragment

ViewPager 中的 Fragment 经常(看似随机)不会显示。我查看了 Hierarchy Viewer 中的视图层次结构,并注意到当发生这种情况时,子片段(在我的图片底部)在布局中,但子级的根视图 为零高度和零宽度(从那里到叶视图的层次结构树中的每个视图也是如此)。 ViewPager 确实有高度和宽度,但它页面的片段没有。

如果此时我旋转设备,我的孩子 Fragments 就会出现!

我不知道为什么会这样。我与 ViewPager 一起使用的适配器需要 FragmentManager,我通过调用 getChildFragmentManager() 来使用来自 Activity 内部 Fragment 的适配器。我觉得我正在做我应该做的一切,不知道接下来该看哪里。

更新:

有趣的是,如果我将适配器附加到 ViewPager 的代码放在 Runnable 中并将其发布到 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);
  }
}

【问题讨论】:

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


    【解决方案1】:

    我想通了。如果其他人遇到这种情况,请确保您没有在后台线程上操作 UI 组件或发生奇怪的事情。就我而言,我正在使用 RxJava 在后台线程上进行位图操作,但我忘记了这一行:

    .observeOn(AndroidSchedulers.mainThread());
    

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

    【讨论】:

      【解决方案2】:

      你的假设是对的。对于强大的main 线程与worker 线程,Android 处理起来非常烦人。

      例如,如果您触发一个执行网络获取的SwipeRefreshLayout,并且在您刚刚执行setRefreshing(false) 的后台调用返回回调,这可能不会向您显示任何警告,但会导致奇怪的副作用。

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

      【讨论】:

      • 谢谢!你救了我的命!!!我在后台使用 kotlin 协程更新数据。还有一些页面大小(0.0)。将我的代码移至: GlobalScope.async(Dispatchers.Main) { ... } - 问题消失了!!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-01
      • 1970-01-01
      • 2013-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多