在下面的片段的提升视图下添加了片段显示?
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") 或对话框或任何其他不平坦的视图的问题。干杯!
所以我在将对话片段添加到 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") 或对话框或任何其他不平坦的视图的问题。干杯!