隐藏在标签栏后面的 View Pager 的片段

Posted

技术标签:

【中文标题】隐藏在标签栏后面的 View Pager 的片段【英文标题】:Fragment from View Pager hiding behind Tab Bar 【发布时间】:2016-01-24 00:40:41 【问题描述】:

我在我的 android 项目中遇到了标签栏和 ViewPager 的问题。该应用程序的作用是它有一个活动,它承载一个选项卡布局,然后有 2 个片段代表每个选项卡。

当 Activity 打开时,它会发布到 API 以获取一些数据,并将数据放入数据适配器中,以用于每个片段中的 Recycler View 和 Card 布局。

回收站视图将包含 3 个项目,但仅显示 2 个项目,因为第一个项目隐藏在工具栏和/或标签栏下,如下面的屏幕截图所示。

下面是我的activity的布局文件

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_
    android:layout_
    xmlns:app="http://schemas.android.com/apk/res-auto"
    tools:context="com.BoardiesITSolution.CritiMonApp.AppsActivity">

    <android.support.design.widget.AppBarLayout
        android:layout_
        android:layout_
        android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">
        <include layout="@layout/toolbar" />
        <android.support.design.widget.TabLayout
            android:id="@+id/tabs"
            android:layout_
            android:layout_
            app:tabMode="fixed"
            app:tabGravity="fill" />
    </android.support.design.widget.AppBarLayout>

    <android.support.v4.view.ViewPager
        android:id="@+id/viewpager"
        android:layout_
        android:layout_ />
        <!--app:layout_behaviour="@string/appbar_scrolling_view_behaviour" />-->
</android.support.design.widget.CoordinatorLayout>

下面是片段的布局

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_
    android:layout_>
    <view
        android:id="@+id/recycler_view"
        class="android.support.v7.widget.RecyclerView"
        android:layout_
        android:layout_
        android:layout_centerInParent="true" />
</LinearLayout>

下面是卡片布局的布局

<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:cardview="http://schemas.android.com/apk/res-auto"
    android:layout_
    android:layout_
    android:layout_margin="8dp">

    <RelativeLayout
        android:layout_
        android:layout_
        android:elevation="5dp">
        <TextView
            android:id="@+id/txtApplicationName"
            android:layout_
            android:layout_
            android:layout_centerVertical="true"
            android:maxLines="3"
            android:padding="8dp"
            android:textColor="#222"
            android:textSize="15dp"
            android:layout_centerInParent="true"/>

    </RelativeLayout>
</android.support.v7.widget.CardView>

下面是上面提到的显示问题的屏幕截图。我已经对一些文本进行了像素化处理,但我的意思应该是,应该有 3 个项目,但第一个项目隐藏在标签栏下方。

【问题讨论】:

在我的例子中,回收站视图出现在选项卡上。以下解决方案对我也有帮助。 【参考方案1】:

编辑:正如下面@smeet 和@hardik 所建议的,添加滚动行为app:layout_behavior="@string/appbar_scrolling_view_behavior" 应该可以解决问题,同时保留滚动行为。 只有当视图是协调器布局的直接子视图时,滚动行为才有效。


旧答案

只需将您的 appbar 布局和 viewpager 包装在一个垂直的 LinearLayout 中

<android.support.design.widget.CoordinatorLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_
    android:layout_
    xmlns:app="http://schemas.android.com/apk/res-auto"
    tools:context="com.BoardiesITSolution.CritiMonApp.AppsActivity">

    <LinearLayout
        android:orientation="vertical"
        android:layout_
        android:layout_>

        //appbar layout

        //viewpager    


    </LinearLayout>

</android.support.design.widget.CoordinatorLayout>

来自文档,CoordinatorLayout is a super-powered FrameLayout。因此,您可以期待典型的“在其他视图之上放置视图”FrameLayout 行为。

【讨论】:

【参考方案2】:

添加:

app:layout_behavior="@string/appbar_scrolling_view_behavior"

ViewPager 中解决了我的问题。

【讨论】:

@this 应该被接受,因为如果我们用线性布局包装 appbar 布局,那么滚动时工具栏将不会隐藏。 很好,这似乎是最简单的方法【参考方案3】:

如果我们将应用栏布局包装成线性布局,那么当您滚动时工具栏不会隐藏,因此如果您想在滚动时隐藏工具栏,那么接受的答案可能对您没有帮助。

Smeet 的做法是正确的,但没有解释!这是带有解释的完整示例。

app namspace 添加到 CoordinatorLayout

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout
xmlns:app="http://schemas.android.com/apk/res-auto"
......
>

只需在您的ViewPager 中添加以下行

app:layout_behavior="@string/appbar_scrolling_view_behavior"

完整的xml如下

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_
    android:layout_
   >


    <android.support.design.widget.AppBarLayout
        android:layout_
        android:layout_
        android:theme="@style/AppTheme.AppBarOverlay">

        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_
            android:layout_
            android:background="?attr/colorPrimary"
            app:layout_scrollFlags="scroll|enterAlways"
            app:popupTheme="@style/AppTheme.PopupOverlay" />

        <android.support.design.widget.TabLayout
            android:id="@+id/tabLayout"
            android:layout_
            android:layout_

            />

    </android.support.design.widget.AppBarLayout>

    <android.support.v4.view.ViewPager
        android:id="@+id/viewPager"
        android:layout_
        app:layout_behavior="@string/appbar_scrolling_view_behavior"
        android:layout_ />


</android.support.design.widget.CoordinatorLayout>

【讨论】:

以上是关于隐藏在标签栏后面的 View Pager 的片段的主要内容,如果未能解决你的问题,请参考以下文章

在tablayout viewpager中运行调整选项卡片段

片段无法加载到 View_pager tabLayout [重复]

为啥视图隐藏在状态栏后面?

如何在xamarin表单ios中隐藏标签栏导航标题

Android 全屏片段不显示导航和状态栏后面的元素

WIX Navigation V2 - 推送到新屏幕时隐藏底部标签栏