2

我有一个工作正常的布局。一个视图在前面,另一个在后面。我正在使用 CoordinatorLayour,因为我使用的是 FAB。前视图是地图,后视图是单击 FAB 按钮时显示数据的视图。

为此,我在 SO 上看到了这些链接:

BringToFront 在协调器布局中不起作用

将视图放置在 android 中 CoordinatorLayout 中的另一个视图下方

在android中的另一个视图上方放置/重叠(z-index)视图

根据答案,我做了一个简单的代码。但前视图坚持在前面。有什么我想念的吗?:

    final RelativeLayout rev = findViewById(R.id.bg_detail);
        final RelativeLayout orange_map = findViewById(R.id.orange_map);
        floatingActionButtonEdit.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                rev.bringToFront();
                rev.getParent().requestLayout();
                rev.invalidate();
            }
        });
<?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:fitsSystemWindows="true""
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/white">

<LinearLayout
    android:id="@+id/linearlayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <include layout="@layout/toolbar_base"/>

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/orange_map"
        android:background="@android:color/holo_orange_light">
        <!--fragment
            android:id="@+id/map"
            android:name="com.google.android.gms.maps.SupportMapFragment"
            android:layout_width="match_parent"
            android:layout_height="match_parent" /-->
    </RelativeLayout>
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/bg_detail">
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:orientation="vertical">
                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:layout_weight="0.6"
                    android:orientation="vertical"
                    android:background="@android:color/holo_red_dark"
                    android:visibility="invisible"
                    android:id="@+id/dummy"/>
                <ScrollView
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:layout_weight="0.4">
                    <RelativeLayout
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:background="@android:color/white"
                        android:paddingBottom="@dimen/activity_vertical_margin"
                        android:paddingLeft="@dimen/activity_horizontal_margin"
                        android:paddingRight="@dimen/activity_horizontal_margin"
                        android:paddingTop="@dimen/activity_vertical_margin">
                        ...
                    </RelativeLayout>
                </ScrollView>
            </LinearLayout>
    </RelativeLayout>
</LinearLayout>
<android.support.design.widget.FloatingActionButton
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/floatingactionbutton_edit"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginBottom="@dimen/activity_vertical_margin"
    android:layout_marginStart="@dimen/activity_horizontal_margin"
    android:layout_marginEnd="@dimen/activity_horizontal_margin"
    android:layout_marginTop="@dimen/activity_vertical_margin"
    android:src="@drawable/ic_assignment_white_24dp"
    app:layout_anchor="@id/dummy"
    app:layout_anchorGravity="bottom|right|end"/>
</android.support.design.widget.CoordinatorLayout>
4

3 回答 3

0

View#bringToFront 的 Android 文档说:

更改视图在树中的 z 顺序,使其位于其他同级视图之上。如果父容器使用与顺序相关的布局方案(例如,LinearLayout),则此排序更改可能会影响布局。在 KITKAT 之前,此方法后应调用视图父级的 requestLayout() 和 invalidate() 以强制父级使用新的子排序重绘。

意思是,你想做:

rev.bringToFront();
rev.getParent().requestLayout();
rev.getParent().invalidate();
于 2017-11-22T13:39:54.983 回答
0

解决了。我只需要将 LinearLayout 替换为 FrameLayout。之后,我将内部 RelativeLayout 的可见性更改为不可见,当我单击一个按钮时,它会显示隐藏的布局。

<?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"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:fitsSystemWindows="true"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/white">
<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
    <include layout="@layout/toolbar_base"/>
    <FrameLayout
        android:id="@+id/linearlayout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:id="@+id/orange_map"
            android:background="@android:color/holo_orange_light">

            <fragment
                android:id="@+id/map"
                android:name="com.google.android.gms.maps.SupportMapFragment"
                android:layout_width="match_parent"
                android:layout_height="match_parent" />
        </RelativeLayout>
        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="@android:color/transparent">
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:orientation="vertical">
                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:layout_weight="0.6"
                    android:orientation="vertical"
                    android:background="@android:color/holo_red_dark"
                    android:visibility="invisible"/>
                <ScrollView
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:layout_weight="0.4"
                    android:background="@android:color/white">
                    <RelativeLayout
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:paddingBottom="@dimen/activity_vertical_margin"
                        android:paddingLeft="@dimen/activity_horizontal_margin"
                        android:paddingRight="@dimen/activity_horizontal_margin"
                        android:paddingTop="@dimen/activity_vertical_margin">

                        ...
                    </RelativeLayout>
                </ScrollView>
            </LinearLayout>
        </RelativeLayout>
    </FrameLayout>
</LinearLayout>
<android.support.design.widget.FloatingActionButton
    android:id="@+id/floatingactionbutton_edit"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:visibility="invisible"
    android:layout_marginBottom="@dimen/activity_vertical_margin"
    android:layout_marginStart="@dimen/activity_horizontal_margin"
    android:layout_marginEnd="@dimen/activity_horizontal_margin"
    android:layout_marginTop="@dimen/activity_vertical_margin"
    android:src="@drawable/ic_assignment_white_24dp"
    app:layout_anchor="@id/dummy"
    app:layout_anchorGravity="bottom|right|end"/>
</android.support.design.widget.CoordinatorLayout>
于 2017-11-22T16:56:28.320 回答
-1

RelativeLayout带有 id的问题orange_map。它覆盖了整个屏幕。如果您不希望在单击 FAB 时显示它,请尝试使用隐藏它

orange_map.setVisibility(View.GONE);

如果您希望它可见,请尝试将其高度更改为wrap_content使用

orange_map.setLayoutParams(new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.WRAP_CONTENT));

在这种情况下,显示了RelativeLayoutid bg_detail

于 2017-11-22T14:50:44.777 回答