视图未在布局中心

时间:2016-09-13 04:38:50

标签: android android-layout

我有一个简单的布局,如下所示:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        android:layout_centerHorizontal="true"
        android:text: "NOT CENTRALIZED!" />

    <android.support.v7.widget.RecyclerView
        android:id="@+id/recyclerView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:visibility="gone" />   
</RelativeLayout>

上面的布局属于一个在ViewPager中加载的Fragment(属于一个Activity,在这里称为ActivityA.java)。

ActivityA.java 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_width="match_parent"
android:layout_height="match_parent">

<android.support.design.widget.AppBarLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:stateListAnimator="@animator/elevated_appbar"
    app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">

        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            app:layout_scrollFlags="scroll|enterAlways"
            app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />

        <android.support.design.widget.TabLayout
            android:id="@+id/tabLayout"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            app:tabIndicatorColor="@android:color/white"
            app:tabMode="fixed" />
</android.support.design.widget.AppBarLayout>

<android.support.v4.view.ViewPager
    android:id="@+id/viewPager"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layout_behavior="@string/appbar_scrolling_view_behavior" />
</android.support.design.widget.CoordinatorLayout>

请注意,我使用 CoordinatorLayout 而我的 ViewPager 包含 app:layout_behavior="@string/appbar_scrolling_view_behavior"属性。

令我困惑的小事是:为什么我的TextView没有集中在布局上,因为我宣布android:layout_centerVertical="true"android:layout_centerVertical="true"为它?

奇怪的是,当我删除 android.support.v4.view.ViewPager 上的app:layout_scrollFlags="scroll|enterAlways"属性时,内容会显示在屏幕中间,但是...... android.support.v7.widget.Toolbar 停止折叠和扩展功能。

Demonstrating the issue - image 1

修改

在布局预览中,我们可以看到android.support.v4.view.ViewPager不在导航栏上方(但需要app:layout_behavior="@string/appbar_scrolling_view_behavior"才能将此视图放在android.support.design.widget.AppBarLayout下方。删除此属性后,android.support.v4.view.ViewPager会在导航栏上移,但会与android.support.design.widget.AppBarLayout重叠。

看看:

使用app:layout_behavior="@string/appbar_scrolling_view_behavior"

Demonstrating the issue - image 2

没有app:layout_behavior="@string/appbar_scrolling_view_behavior"

Demonstrating the issue - image 3

编辑2

所以,我决定做一个测试,在well referenced project上重现这个问题,它展示了一些材质特征,结果是......

Demonstrating the issue - cheesesquare project

......同样的问题!

如果有人想自己复制,只需将fragment_cheese_list.xml更改为:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">

<android.support.v7.widget.RecyclerView
    android:id="@+id/recyclerview"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:visibility="gone" />

<android.support.v7.widget.AppCompatTextView
    android:id="@+id/alertMessage"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerVertical="true"
    android:layout_centerHorizontal="true"
    android:text="ALSO, NOT CENTRALIZED..." />
</RelativeLayout>

2 个答案:

答案 0 :(得分:2)

尝试将app:layout_behavior="@string/appbar_scrolling_view_behavior"添加到Fragment的布局xml文件中。

<强> EDIT1
实际上它表现得如此。 当您的Viewpager加上:app:layout_behavior="@string/appbar_scrolling_view_behavior"

Android根据ViewPager的高度向下移动AppBarLayout(可能会为其添加边距)。滚动查看时,会重新调整此边距。因为那是scrolling_view_behavior

enter image description here

没有:app:layout_behavior="@string/appbar_scrolling_view_behavior"

您的ViewPager独立于AppBarLAyout因此,在这种情况下,TextView出现在中心位置的原因没有保证金。
enter image description here


因此,实际上,您的TextView始终位于ViewPager的中心。它的ViewPager会发生变化。要更改该行为,您可能需要实现自己的布局行为。 This是android如何做到的。

答案 1 :(得分:0)

我发现的最简单且不干扰的解决方法是在onOffsetChanged上为容器设置底部填充。看起来像

        appBarLayout.addOnOffsetChangedListener(new AppBarLayout.OnOffsetChangedListener() {
        @Override
        public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) {
            container.setPadding(0, 0, 0, appBarLayout.getTotalScrollRange() + verticalOffset);
        ...