【问题标题】:Problems with CoordinatorLayout, ViewPager and requestLayout / onMeasure / onLayout on Android 4.2 or olderAndroid 4.2 或更早版本上的 CoordinatorLayout、ViewPager 和 requestLayout / onMeasure / onLayout 问题
【发布时间】:2015-10-19 09:29:17
【问题描述】:

我需要一些关于一个非常奇怪的问题的帮助。看来我是唯一一个偶然发现它的人。在我的应用中,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() 内部,根视图将偏移量添加到最初测量的高度。

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

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

目前,我添加了一些 if 子句以确保我的实现仅在 4.3 及更高版本中触发。因此,在 Android 4.0、4.1 和 4.2 上,页脚滚动进出。但这很糟糕,所以请帮忙:我该怎么做才能使它适用于这些版本?或者,您还有其他想法如何将页脚固定到底部并使其看起来不错?

【问题讨论】:

  • 您已获得“风滚草”徽章:'(

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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2012-11-22
    • 1970-01-01
    • 2016-06-18
    • 2014-12-05
    • 2019-02-21
    • 1970-01-01
    • 1970-01-01
    • 2012-09-13
    相关资源
    最近更新 更多