当前位置: 代码迷 >> Android >> Android 4.2或更旧版本上的CoordinatorLayout,ViewPager和requestLayout / onMeasure / onLayout问题
  详细解决方案

Android 4.2或更旧版本上的CoordinatorLayout,ViewPager和requestLayout / onMeasure / onLayout问题

热度:77   发布时间:2023-08-04 10:24:09.0

关于一个非常奇怪的问题,我需要一些帮助。 看来我是唯一偶然发现它的人。 在我的应用中,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的行为,页脚开始隐藏。 该问题进行了更详细的描述。

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

  1. 为了确保页脚不会被隐藏,我将工具栏的高度作为底边距添加到局部片段的视图中。
  2. 为了防止页脚滚动,我在AppBarLayout上注册了OnOffsetChangedListener并将偏移量更改传递到详细信息片段,该片段又将其传递到其根视图并在其上调用requestLayout()。
  3. 在onMeasure()内部,根视图将偏移量添加到最初测量的高度。

在Android 4.3及更高版本上,它可以完美运行。 页脚始终固定在屏幕底部。 展开后,视图也会根据应用栏的偏移量通过放大和缩小而固定在顶部。 没问题。

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

现在,我加入了一些if子句,以确保我的实现仅针对4.3及更高版本触发。 因此,在Android 4.0、4.1和4.2上,页脚可以滚动进出。 但这真糟,所以请您提供帮助:如何使它适用于那些版本? 另外,您还有其他想法如何将页脚固定在底部并保持外观美观吗?

我通过将页脚移到协调器并使用解决了这一问题。 这样可以确保它始终在正确的位置。

  相关解决方案