You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android开发:Group控件调用getVisibility方法报错求助

解决ConstraintLayout Group无法调用getVisibility()的问题

问题描述

实现可展开CardView时,复制教程代码后出现编译错误:Cannot resolve method 'getVisibility' in 'Group'

相关Java代码

CardView cardView;
ImageView arrow;
Group hiddenGroup;

cardView = findViewById(R.id.base_cardview);
arrow = findViewById(R.id.show);
hiddenGroup = findViewById(R.id.card_group);

arrow.setOnClickListener(view -> {
    if (hiddenGroup.getVisibility() == View.VISIBLE) {
        TransitionManager.beginDelayedTransition(cardView, new AutoTransition());
        hiddenGroup.setVisibility(View.GONE);
        arrow.setImageResource(android.R.drawable.arrow_down_float);
    } else {
        TransitionManager.beginDelayedTransition(cardView, new AutoTransition());
        hiddenGroup.setVisibility(View.VISIBLE);
        arrow.setImageResource(android.R.drawable.arrow_up_float);
    }
});

对应XML布局代码

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    tools:context="com.example.bookplace.FAQActivity">

    <include
        android:id="@+id/include_action_bar"
        layout="@layout/toolbar"></include>

    <androidx.constraintlayout.widget.ConstraintLayout
        android:id="@+id/base_cardview"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/include_action_bar">

        <androidx.constraintlayout.widget.Guideline
            android:id="@+id/guideline1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            app:layout_constraintGuide_begin="16dp" />

        <androidx.constraintlayout.widget.Guideline
            android:id="@+id/guideline2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            app:layout_constraintGuide_end="16dp" />

        <androidx.constraintlayout.widget.Guideline
            android:id="@+id/guideline3"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            app:layout_constraintGuide_begin="16dp" />

        <androidx.constraintlayout.widget.Guideline
            android:id="@+id/guideline4"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            app:layout_constraintGuide_end="16dp" />

        <ImageView
            android:id="@+id/imageView2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            app:layout_constraintBottom_toTopOf="@+id/guideline4"
            app:layout_constraintStart_toStartOf="@+id/guideline1"
            app:layout_constraintTop_toTopOf="@+id/guideline3"
            app:layout_constraintVertical_bias="0.0"
            app:srcCompat="@android:drawable/ic_menu_info_details"
            app:tint="@color/teal_200" />

        <TextView
            android:id="@+id/textView14"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginStart="8dp"
            android:text="Why should you drink water?"
            android:textColor="#00255E"
            android:textSize="14sp"
            app:layout_constraintBottom_toBottomOf="@+id/imageView2"
            app:layout_constraintStart_toEndOf="@+id/imageView2"
            app:layout_constraintTop_toTopOf="@+id/imageView2"
            app:layout_constraintVertical_bias="0.5" />

        <ImageView
            android:id="@+id/show"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginEnd="4dp"
            android:padding="4dp"
            app:layout_constraintBottom_toBottomOf="@+id/textView14"
            app:layout_constraintEnd_toStartOf="@+id/guideline2"
            app:layout_constraintHorizontal_bias="1.0"
            app:layout_constraintStart_toEndOf="@+id/textView14"
            app:layout_constraintTop_toTopOf="@+id/textView14"
            app:srcCompat="@android:drawable/arrow_down_float"
            app:tint="@color/teal_200" />

        <View
            android:id="@+id/view3"
            android:layout_width="0dp"
            android:layout_height="1dp"
            android:layout_marginTop="16dp"
            android:background="#CECECE"
            app:layout_constraintEnd_toStartOf="@+id/guideline2"
            app:layout_constraintStart_toStartOf="@+id/guideline1"
            app:layout_constraintTop_toBottomOf="@+id/textView14" />

        <TextView
            android:id="@+id/textView15"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="16dp"
            android:text="It's no magic bullet, but the benefits of water are many."
            android:textColor="#838383"
            android:textSize="12sp"
            app:layout_constraintStart_toStartOf="@+id/guideline1"
            app:layout_constraintTop_toBottomOf="@+id/view3" />

        <ImageView
            android:id="@+id/imageView9"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            app:layout_constraintBottom_toBottomOf="@+id/textView16"
            app:layout_constraintStart_toStartOf="@+id/guideline1"
            app:layout_constraintTop_toTopOf="@+id/textView16"
            app:srcCompat="@android:drawable/presence_invisible"
            app:tint="@color/teal_200" />

        <TextView
            android:id="@+id/textView16"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginStart="8dp"
            android:layout_marginTop="12dp"
            android:text="Maintain the Balance of Body Fluids."
            android:textColor="#838383"
            android:textSize="12sp"
            app:layout_constraintStart_toEndOf="@+id/imageView9"
            app:layout_constraintTop_toBottomOf="@+id/textView15" />

        <ImageView
            android:id="@+id/imageView10"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            app:layout_constraintBottom_toBottomOf="@+id/textView17"
            app:layout_constraintStart_toStartOf="@+id/guideline1"
            app:layout_constraintTop_toTopOf="@+id/textView17"
            app:srcCompat="@android:drawable/presence_invisible"
            app:tint="@color/teal_200" />

        <TextView
            android:id="@+id/textView17"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginStart="8dp"
            android:layout_marginTop="12dp"
            android:text="Energize Muscles"
            android:textColor="#838383"
            android:textSize="12sp"
            app:layout_constraintStart_toEndOf="@+id/imageView10"
            app:layout_constraintTop_toBottomOf="@+id/textView16" />

        <ImageView
            android:id="@+id/imageView11"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            app:layout_constraintBottom_toBottomOf="@+id/textView18"
            app:layout_constraintStart_toStartOf="@+id/guideline1"
            app:layout_constraintTop_toTopOf="@+id/textView18"
            app:srcCompat="@android:drawable/presence_invisible"
            app:tint="@color/teal_200" />

        <TextView
            android:id="@+id/textView18"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginStart="8dp"
            android:layout_marginTop="12dp"
            android:text="Keep Skin Looking Good"
            android:textColor="#838383"
            android:textSize="12sp"
            app:layout_constraintStart_toEndOf="@+id/imageView11"
            app:layout_constraintTop_toBottomOf="@+id/textView17" />


        <TextView
            android:id="@+id/textView19"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_marginTop="12dp"
            android:text="If you think you need to be drinking more, here are some tips to increase your fluid intake and reap the benefits of water:"
            android:textColor="#838383"
            android:textSize="12sp"
            app:layout_constraintEnd_toStartOf="@+id/guideline2"
            app:layout_constraintStart_toStartOf="@+id/guideline1"
            app:layout_constraintTop_toBottomOf="@+id/textView18" />

        <View
            android:id="@+id/view4"
            android:layout_width="0dp"
            android:layout_height="1dp"
            android:layout_marginTop="16dp"
            android:background="#CECECE"
            app:layout_constraintEnd_toStartOf="@+id/guideline2"
            app:layout_constraintStart_toStartOf="@+id/guideline1"
            app:layout_constraintTop_toBottomOf="@+id/textView19" />

        <ImageView
            android:id="@+id/imageView12"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            app:layout_constraintStart_toStartOf="@+id/guideline1"
            app:layout_constraintTop_toTopOf="@+id/textView20"
            app:srcCompat="@android:drawable/presence_invisible"
            app:tint="@color/teal_200" />

        <TextView
            android:id="@+id/textView20"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_marginStart="8dp"
            android:layout_marginTop="12dp"
            android:text="Have a beverage with every snack or meal, Eat more fruits and vegetables, and Keep a bottle of water with you.
"
            android:textColor="#838383"
            android:textSize="12sp"
            app:layout_constraintBottom_toTopOf="@+id/guideline4"
            app:layout_constraintEnd_toStartOf="@+id/guideline2"
            app:layout_constraintStart_toEndOf="@+id/imageView12"
            app:layout_constraintTop_toBottomOf="@+id/view4" />

        <androidx.constraintlayout.widget.Group
            android:id="@+id/card_group"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:visibility="visible"
            app:constraint_referenced_ids="textView15,view3,imageView9,textView16,imageView10,textView17,imageView11,textView18,textView19,view4,imageView12,textView20" />

        <androidx.constraintlayout.widget.Group
            android:id="@+id/group2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            app:constraint_referenced_ids="textView20,view4,textView16,textView17,textView19,imageView9,imageView10,imageView12,imageView11,textView15,textView18"
            tools:visibility="gone" />

    </androidx.constraintlayout.widget.ConstraintLayout>
</RelativeLayout>

解决方案

报错原因

androidx.constraintlayout.widget.Group 仅提供setVisibility()方法来批量控制引用控件的可见性,但没有暴露getVisibility()方法,无法直接获取其当前的可见状态。

解决办法1:手动维护状态变量

在代码中添加一个布尔变量记录Group的展开/折叠状态,初始值和XML中设置的android:visibility保持一致:

CardView cardView;
ImageView arrow;
Group hiddenGroup;
private boolean isGroupExpanded = true; // 初始为展开状态,对应XML中的visible

cardView = findViewById(R.id.base_cardview);
arrow = findViewById(R.id.show);
hiddenGroup = findViewById(R.id.card_group);

arrow.setOnClickListener(view -> {
    TransitionManager.beginDelayedTransition(cardView, new AutoTransition());
    if (isGroupExpanded) {
        hiddenGroup.setVisibility(View.GONE);
        arrow.setImageResource(android.R.drawable.arrow_down_float);
    } else {
        hiddenGroup.setVisibility(View.VISIBLE);
        arrow.setImageResource(android.R.drawable.arrow_up_float);
    }
    isGroupExpanded = !isGroupExpanded; // 切换状态
});

解决办法2:通过Group引用的控件判断可见性

因为Group的可见性会同步到所有引用的控件,所以可以获取其中一个控件的可见状态来代替Group的状态:

CardView cardView;
ImageView arrow;
Group hiddenGroup;
TextView referencedView; // 取Group引用的第一个控件

cardView = findViewById(R.id.base_cardview);
arrow = findViewById(R.id.show);
hiddenGroup = findViewById(R.id.card_group);
referencedView = findViewById(R.id.textView15); // 对应Group中constraint_referenced_ids的第一个控件

arrow.setOnClickListener(view -> {
    TransitionManager.beginDelayedTransition(cardView, new AutoTransition());
    if (referencedView.getVisibility() == View.VISIBLE) {
        hiddenGroup.setVisibility(View.GONE);
        arrow.setImageResource(android.R.drawable.arrow_down_float);
    } else {
        hiddenGroup.setVisibility(View.VISIBLE);
        arrow.setImageResource(android.R.drawable.arrow_up_float);
    }
});

内容的提问来源于stack exchange,提问作者Learner

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 16:35:23