在下面的片段的提升视图下添加了片段显示?

Added fragment shows under elevated views in fragment below?

所以我在将对话片段添加到 activity 时遇到了问题。该片段是使用

添加的常规片段
supportFragmentManager.beginTransaction().add(...).commit()

问题是片段已添加到 activity,但 activity 的工具栏和浮动操作按钮将显示在片段的顶部。我知道这是因为这两个视图被提升到 4dp 并且可以通过将片段高度更改为 < 4dp 来解决。我的问题是,有没有更好的方法来做到这一点?有没有办法在 activity 之上添加片段?还是必须这样做?

Activity

<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">

<TextView
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="?actionBarSize"
    android:elevation="4dp"
    android:gravity="center"
    android:text="@string/app_name"
    android:textAppearance="@style/Base.TextAppearance.AppCompat.Headline"
    app:layout_constraintTop_toTopOf="parent" />

<FrameLayout
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="0dp"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/toolbar"/>

<android.support.design.widget.FloatingActionButton
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintBottom_toBottomOf="parent"
    android:layout_margin="24dp"/>

对话框片段

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/scrim"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="24dp"
android:background="#40000000">

<FrameLayout
    android:elevation="4dp"
    android:layout_gravity="center"
    android:layout_width="match_parent"
    android:background="@color/white"
    android:layout_height="250dp"/>

当 activity 启动时,尝试使用可见性来隐藏视图,这是最简单的方法,floatingActionButton.setVisibility(View.GONE);

为了隐藏 floatingActionButton,请在您的 fragment onCreateView 中添加以下内容:

//Global Variable
private View view;

@Override
public View onCreateView(@NonNull LayoutInflater layoutInflater, ViewGroup container, Bundle savedInstanceState) {
if (view != null) {
        ViewGroup group = (ViewGroup) view.getParent();
        if (group != null) {
            group.removeView(view);
        }
    } else {
floatingActionButton = view.findViewById(R.id. floatingActionButton);
floatingActionButton.hide();

...

return view;
}

在你的 xml:

<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">

//If this is your toolbar, why are you instantiating a textview and not a toolbar???
<TextView
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="?actionBarSize"
    android:elevation="4dp"
    android:gravity="center"
    android:text="@string/app_name"
    android:textAppearance="@style/Base.TextAppearance.AppCompat.Headline"
    app:layout_constraintTop_toTopOf="parent" />

// get rid off below toolbar so that the container will cover the whole height and width of the screen
<FrameLayout
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="0dp"
    app:layout_constraintBottom_toBottomOf="parent"/>

<android.support.design.widget.FloatingActionButton
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintBottom_toBottomOf="parent"
    android:layout_margin="24dp"/>

所提供的答案与其说是解决方案,不如说是黑客攻击。当用户在片段之间来回导航时隐藏、显示、re-hiding 和 re-displaying 是一种痛苦。更好的解决方案是使用 RelativeLayout(如果一次显示多个片段)或 LinearLayout/FrameLayout 父级,其中包含您的 ConstraintLayout。

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/rl_container"
android:layout_width="match_parent"
android:layout_height="match_parent">

    <android.support.constraint.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

<TextView
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="?actionBarSize"
    android:elevation="4dp"
    android:gravity="center"
    android:text="@string/app_name"
    android:textAppearance="@style/Base.TextAppearance.AppCompat.Headline"
    app:layout_constraintTop_toTopOf="parent" />

<FrameLayout
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="0dp"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/toolbar"/>

<android.support.design.widget.FloatingActionButton
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintBottom_toBottomOf="parent"
    android:layout_margin="24dp"/>

    </android.support.constraint.ConstraintLayout>

</RelativeLayout>

不要忘记包含您的 ID,例如rl_container 作为片段容器的引用。请记住,ConstraintLayout 是一个平面层次结构。因此,将它用作容器总是会遇到 "elevated" (android:elevation="xdp") 或对话框或任何其他不平坦的视图的问题。干杯!