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
相关产品推荐
相关产品推荐

