Android 4.2或更早版本上CoordinatorLayout,ViewPager和requestLayout / onMeasure / onLayout出现问题

时间:2015-10-19 09:29:18

标签: android android-fragments android-viewpager android-coordinatorlayout

我需要一些关于一个非常奇怪的问题的帮助。我似乎是唯一偶然发现它的人。在我的应用程序中,requestLayout()和invalidate()在运行Android 4.0,4.1和4.2的设备上的嵌套片段内都没有任何效果(在模拟器和真实设备上均经过测试)。

当我导航到我必须调用requestLayout()的位置时,活动的布局层次结构包含一个主细节流,看起来大致如此(请注意我将所有片段动态添加到FrameLayout包装器中):

<DrawerLayout>
  <CoordinatorLayout>
    <LinearLayout (horizontal)>
      <fragment in FrameLayout --> master/>
        <ViewPager (using FragmentStatePagerAdapter)>
          <PagerTabStrip/>
          <fragment pages, each being only a single RecyclerView/>
        </ViewPager>
      </fragment in FrameLayout>
      <fragment in FrameLayout --> detail>
        <RelativeLayout>
          <ViewPager (using FragmentStatePagerAdapter)/>
          <a custom footer view that can be expanded to fill the screen/>
        </RelativeLayout>
      </fragment in FrameLayout>
    </LinearLayout>
    <AppBarLayout>
      <Toolbar>
    </AppBarLayout>
  </CoordinatorLayout>
  <NavigationView/>
</DrawerLayout>

现在我遇到的一个问题是,由于CoordinatorLayout的行为,页脚开始隐藏。问题详见here

由于我的页脚可以扩展以填充屏幕,因此我必须实现自定义解决方案:

  1. 为确保页脚不会隐藏,我将工具栏高度添加为细节片段视图的下边距。
  2. 为了防止页脚滚动,我在AppBarLayout上注册一个OnOffsetChangedListener,并将偏移更改传递给详细信息片段,然后将其传递给根视图并在其上调用requestLayout()。
  3. 在onMeasure()中,根视图将偏移量添加到最初测量的高度。
  4. 在Android 4.3及更高版本中,这非常有效。页脚始终固定在屏幕的底部。展开后,视图也会根据应用栏偏移量的增长和缩小固定在顶部。没问题。

    但是在Android 4.3以下,经过一段时间后,requestLayout()根本没有效果!我也尝试了invalidate()和forceLayout()。 onMeasure()和onLayout()都不会被调用,并且条形图会一直滚动,有时会悬停在屏幕底部之上,有时会滚动到屏幕外部。我完全不知道这是怎么可能的,但我观察到它取决于ViewPagers:当最多滑动两次时,页脚会以某种方式分离。

    现在,我添加了一些if子句,以确保我的实现仅针对4.3及更高版本触发。所以在Android 4.0,4.1和4.2上,页脚滚动进出。但这很糟糕,所以请帮忙:我能做些什么来使它适用于那些版本?或者,您是否有其他想法如何将页脚固定在底部并使其看起来更漂亮?

1 个答案:

答案 0 :(得分:0)

我通过将页脚向上移动到协调器并使用BottomSheet来解决此问题。这可以确保它始终在正确的位置。