当我将 ImageView 的可见性设置为线性布局消失时,它的一个孩子仍然存在,另一个在 android 中消失了
Posted
技术标签:
【中文标题】当我将 ImageView 的可见性设置为线性布局消失时,它的一个孩子仍然存在,另一个在 android 中消失了【英文标题】:When i set visibility of ImageView as GONE the LinearLayout, one of child of it remains, the other gone in android 【发布时间】:2020-12-31 14:21:36 【问题描述】:我将ListView
项目创建为Constraint Layout
。它有一个ImageView
被约束到父级(顶部和开始)和一个LinearLayout
被约束到这个ImageView
(从顶部到顶部,从开始到结束,从底部到底部)。在 Java 部分,我做了一些逻辑,在某些情况下ImageView
已消失,而在其他情况下它将是可见的。这部分没有任何问题。布局是这样的:
还有这样的代码:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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"
android:paddingHorizontal="@dimen/activity_horizontal_margin"
android:paddingVertical="@dimen/activity_vertical_margin">
<ImageView
android:id="@+id/image"
android:layout_
android:layout_
android:contentDescription="@string/list_image_cd"
android:src="@drawable/app_logo"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<LinearLayout
android:id="@+id/texts"
android:layout_
android:layout_
android:layout_marginStart="24dp"
android:layout_marginLeft="24dp"
android:orientation="vertical"
app:layout_constraintStart_toEndOf="@id/image"
app:layout_constraintTop_toTopOf="@id/image"
app:layout_constraintBottom_toBottomOf="@id/image">
<TextView
android:id="@+id/miwok_word"
android:layout_
android:layout_
tools:text="miwok" />
<TextView
android:id="@+id/english_word"
android:layout_
android:layout_
tools:text="english" />
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
我可以通过将布局更改为LinearLayout
来解决此问题。但是在Constraint Layout
中,当ImageView
消失时,textview
中的一个消失了,另一个仍然存在。我读过类似的 ConstraintLayout, when constraint dependent view is gone, the layout view behave weirdly 。但是在我的情况下,如果这是线性布局的子视图,为什么其中一个文本视图仍然存在(为什么所有线性布局都没有消失?)。
应用程序中的布局(我将英文文本更改为短语,但没有看到 miwok):
【问题讨论】:
现在我发现了错误。去除线性布局的顶部和底部约束后,它起作用了。我认为当 ImageView 消失时,LinearLayout 有点超出,所以在布局中看不到上面的 textview。但我仍然无法清楚地了解 【参考方案1】:因为 LinearLayout 的顶部和底部约束设置为 ImageView,所以它将在 ImageView 上垂直居中。请参阅解决此问题的documentation。 “垂直居中”是指LinearLayout和ImageView的垂直中心在同一个y位置。
现在,当 ImageView 设置为 GONE
时,ImageView 被缩减为一个虚拟点。由于它被限制在父级的开始和顶部,“已消失”视图现在将是屏幕原点 (0,0) 处的一个点。 LinearLayout 仍然像以前一样被限制在 ImageView 的顶部和底部,因此它仍然以 ImageView 为中心。但是,由于 ImageView 现在是原点的一个点,并且它的中心已经移动,所以 LinearLayout 必须向上移动以保持在 ImageView的中心>。结果,顶部的 TextView 离开了屏幕顶部,再也看不到了。
您将如何解决此问题取决于您要执行的操作。
【讨论】:
【参考方案2】:当你的 LinearLayout 顶部和底部约束被赋予 imageview 时,当它消失时,它的高度变得更小,因为顶部 textview 不可见。
@Cheticamp 在他的回答中提供更多信息。
你可以像下面这样改变你的约束,它会按照你的意愿工作。将 Imageview 顶部和底部约束更改为 LinearLayout 顶部和底部。
<?xml version="1.0" encoding="utf-8"?><?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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:padding="10dp">
<ImageView
android:id="@+id/image"
android:layout_
android:layout_
android:src="@mipmap/ic_launcher"
app:layout_constraintBottom_toBottomOf="@+id/texts"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="@+id/texts" />
<LinearLayout
android:id="@+id/texts"
android:layout_
android:layout_
android:layout_marginStart="24dp"
android:layout_marginLeft="24dp"
android:orientation="vertical"
app:layout_constraintStart_toEndOf="@+id/image"
app:layout_constraintTop_toTopOf="parent">
<TextView
android:id="@+id/miwok_word"
android:layout_
android:layout_
tools:text="miwok" />
<TextView
android:id="@+id/english_word"
android:layout_
android:layout_
tools:text="english" />
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
【讨论】:
以上是关于当我将 ImageView 的可见性设置为线性布局消失时,它的一个孩子仍然存在,另一个在 android 中消失了的主要内容,如果未能解决你的问题,请参考以下文章