约束布局-组可见性在动态模块内不起作用

时间:2019-03-01 12:03:20

标签: android android-layout android-constraintlayout android-app-bundle

有人在ConstraintLayout组可见性方面遇到问题吗? 我正在使用ConstraintLayout 1.1.3,并且正在XML布局和Java代码中设置组的可见性。但这不会更改可见性状态。它总是可见的。

这是布局文件

 <?xml version="1.0" encoding="utf-8"?>
 <android.support.constraint.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_width="match_parent"
  android:layout_height="match_parent">

<ImageView
    android:id="@+id/iv_message_icon_activity_dictionary"
    android:layout_width="@dimen/message_icon_width"
    android:layout_height="@dimen/message_icon_height"
    android:layout_marginBottom="@dimen/message_text_view_margin_top"
    android:contentDescription="@string/app_name"
    android:src="@drawable/icon_error"
    app:layout_constraintBottom_toTopOf="@+id/tv_message_activity_dictionary"
    app:layout_constraintEnd_toEndOf="@id/tv_message_activity_dictionary"
    app:layout_constraintStart_toStartOf="@id/tv_message_activity_dictionary" />

<TextView
    android:id="@+id/tv_message_activity_dictionary"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_marginEnd="20dp"
    android:layout_marginLeft="20dp"
    android:layout_marginRight="20dp"
    android:layout_marginStart="20dp"
    android:gravity="center"
    android:textColor="@color/black"
    android:textSize="@dimen/medium_text_size"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent"
    tools:text="@string/msg_no_internet" />

<Button
    android:id="@+id/btn_try_again_activity_dictionary"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginTop="@dimen/try_again_button_margin_top"
    android:background="@drawable/rounded_button"
    android:minHeight="30dp"
    android:minWidth="@dimen/try_again_button_width"
    android:padding="10dp"
    android:text="@string/btn_try_again"
    android:textAllCaps="false"
    android:textColor="@color/white"
    android:textSize="@dimen/text_size_5"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toBottomOf="@id/tv_message_activity_dictionary" />

<android.support.constraint.Group
    android:id="@+id/group_component_activity_dictionary"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:visibility="gone"
    app:constraint_referenced_ids="btn_try_again_activity_dictionary,tv_message_activity_dictionary,iv_message_icon_activity_dictionary" />

</android.support.constraint.ConstraintLayout>

这可能是什么原因?

更新:

我忘了提到我在动态模块中使用此布局。我也在基本模块中使用它进行了测试,它可以按预期运行,但在动态模块中却没有。所以最后我找出了问题的原因。同样,当我调试代码并评估该表达式(group.getVisibility == View.GONE)时,它的确为TRUE。(即使组内的视图仍然可见)

任何建议都值得赞赏。

6 个答案:

答案 0 :(得分:4)

找到了解决此问题的方法,希望这可以为其他人节省时间。奇怪,但此问题的原因是在动态模块内使用 ConstraintLayout-Group。

因此,此修复程序是用Java代码编写的,一旦您获得对该组的引用,然后使用如下所示的int数组设置引用ID,

Group group = findViewById(R.id.group);
group.setReferencedIds(new int[]{R.id.btn_try_again_activity_dictionary, R.id.tv_message_activity_dictionary, R.id.iv_message_icon_activity_dictionary});

此后,它可以按预期工作。因此,无需设置组中单个视图的可见性。

答案 1 :(得分:1)

我在使用ConstraintLayout v1.1.3时遇到了同样的问题。我正在XML中设置该组的可见性,但是它不起作用。

由于ConstraintLayout v2.0.0已处于测试阶段,我从v1.1.3迁移到v2.0.0-beta2(检查latest version),此问题不再发生。现在,我可以从XML或代码更改组的可见性了。

答案 2 :(得分:1)

即使我使用的是2.0.0-beta8,我也遇到同样的问题。 group.visibility = View.GONE/VISIBLE无效,但group.isGone = true/false有效

答案 3 :(得分:0)

答案 4 :(得分:0)

我必须补充一下我的问题是什么 - 我错误地没有将 Group 小部件放在 ConstraintLayout 中,并且无法弄清楚为什么它可以在一种布局中工作而在另一种布局中不起作用。 谢天谢地,我没有花太多时间在上面,但这个错误仍然可能发生。

答案 5 :(得分:0)

不要忘记只有当父视图为 androidx.constraintlayout.widget.Group 时才可以使用 constraintlayout 如果父视图为 LinearLayout 则它不起作用,然后你可以试试this answer 这表示您在 FrameLayoutLinearLayout 中添加所需的视图,然后设置子父视图的可见性。