Android点击按钮切换CalendarView显隐仅显示空白布局问题求助
问题解决:CalendarView切换可见性后仅显示空白布局
我最近碰到个闹心的问题:点击按钮切换CalendarView的显示和隐藏时,它只露出一片空白的白色背景,日历内容完全看不到。但如果直接在XML里把它的visibility设为visible,就能正常显示,说明布局本身没问题。
相关代码展示
XML布局代码
<android.support.constraint.ConstraintLayout android:id="@+id/header_view" android:elevation="@dimen/height4" app:layout_behavior="@string/appbar_scrolling_view_behavior" android:layout_width="match_parent" android:layout_height="wrap_content"> <CalendarView android:background="@color/white" android:visibility="invisible" app:layout_constraintTop_toBottomOf="@+id/date_view" android:id="@+id/calendarView" android:layout_width="match_parent" android:layout_height="wrap_content" android:clipToPadding="true" android:paddingBottom="0dp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="1.0" app:layout_constraintStart_toStartOf="parent"> </CalendarView> <android.support.constraint.ConstraintLayout android:background="@color/white" android:id="@+id/date_view" android:layout_width="match_parent" android:layout_height="wrap_content"> // some other layouts </android.support.constraint.ConstraintLayout> </android.support.constraint.ConstraintLayout>
Java处理代码
private void setUpCalenderView() { isCalenderVisible = !isCalenderVisible; if (isCalenderVisible){ ((CalendarView) findViewById(R.id.calendarView)).setVisibility(View.VISIBLE); } else{ ((CalendarView) findViewById(R.id.calendarView)).setVisibility(View.INVISIBLE); } }
问题分析与解决方案
这个问题大概率是因为View.INVISIBLE只是隐藏视图但保留了它的布局空间,当切换回VISIBLE时,CalendarView可能没有正确触发重绘或者布局测量,导致内容没渲染出来。试试下面几个办法:
方案1:用View.GONE替代View.INVISIBLE
GONE会完全移除视图的布局空间,切换回VISIBLE时系统会重新测量并绘制视图,这样就能确保内容正常显示:
private void setUpCalenderView() { isCalenderVisible = !isCalenderVisible; CalendarView calendarView = findViewById(R.id.calendarView); if (isCalenderVisible){ calendarView.setVisibility(View.VISIBLE); } else{ calendarView.setVisibility(View.GONE); } }
方案2:强制触发重绘
如果不想用GONE,也可以在设置VISIBLE后强制CalendarView重新布局和绘制:
private void setUpCalenderView() { isCalenderVisible = !isCalenderVisible; CalendarView calendarView = findViewById(R.id.calendarView); if (isCalenderVisible){ calendarView.setVisibility(View.VISIBLE); calendarView.requestLayout(); // 强制重新测量布局 calendarView.invalidate(); // 强制重绘 } else{ calendarView.setVisibility(View.INVISIBLE); } }
方案3:检查布局约束
另外可以确认下CalendarView的约束是否完全正确,比如app:layout_constraintTop_toBottomOf="@+id/date_view"是否生效,有没有其他约束导致它的高度被压缩为0。不过你说直接设VISIBLE能正常显示,这个可能性相对小一些,但也可以排查下。
内容的提问来源于stack exchange,提问作者Ankur_009
相关产品推荐
相关产品推荐

