当我将 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。 “垂直居中”是指LinearLayoutImageView的垂直中心在同一个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 中消失了的主要内容,如果未能解决你的问题,请参考以下文章

当我调用可见性时,Android 动画不起作用

Imageview 在线性布局中不可见

imageview 上的波纹效果

设置可见性时 XML 列表视图重叠元素

如何设置滚动视图内并包含两个 TextView 的线性布局的可见性消失?

ImageView 未在滚动视图内的线性布局中显示