如何隐藏SpaceNavigationView的CentreButton并保留其占位空间?
我是Android编程新手,SpaceNavigationView的相关文档较为匮乏。我想要隐藏其中名为“sos”的CentreButton,同时保留该按钮所占的空间,使其他菜单项维持原有位置不变。
当前实现代码:
if (settingsProfils.sos == 1) { space.setSpaceBackgroundColor(ContextCompat.getColor(getActivity().getApplicationContext(), R.color.gris)); space.setCentreButtonIcon(R.drawable.sos); space.setActiveCentreButtonIconColor(getResources().getColor(R.color.white)); space.setInActiveCentreButtonIconColor(getResources().getColor(R.color.white)); space.setCentreButtonColor(ContextCompat.getColor(getActivity().getApplicationContext(), R.color.coral_pink)); space.setFont(type); space.hideCenterButton(1); } else { space.setSpaceBackgroundColor(ContextCompat.getColor(getActivity().getApplicationContext(), R.color.gris)); space.setCentreButtonIcon(R.drawable.sos); space.setActiveCentreButtonIconColor(getResources().getColor(R.color.white)); space.setInActiveCentreButtonIconColor(getResources().getColor(R.color.white)); space.setCentreButtonColor(ContextCompat.getColor(getActivity().getApplicationContext(), R.color.gris)); space.hideCenterButton(0); }
隐藏前的菜单效果:
隐藏后的效果:
目前隐藏按钮后其他菜单项发生移位,我需要保留按钮的占位空间。
解决方案
hideCenterButton()方法内部会将中心按钮的可见性设为View.GONE,这会触发布局重计算并移除该按钮的占位,导致其他菜单项移位。要保留占位空间,需将按钮可见性设为View.INVISIBLE(仅隐藏视图,布局空间保留)。
由于SpaceNavigationView未提供公开方法获取中心按钮实例,我们可以通过反射获取私有成员mCenterButton,再设置可见性:
// 提取公共配置逻辑,减少代码冗余 space.setSpaceBackgroundColor(ContextCompat.getColor(getActivity(), R.color.gris)); space.setFont(type); space.setActiveCentreButtonIconColor(getResources().getColor(R.color.white)); space.setInActiveCentreButtonIconColor(getResources().getColor(R.color.white)); try { // 反射获取SpaceNavigationView的私有中心按钮实例 Field centerButtonField = SpaceNavigationView.class.getDeclaredField("mCenterButton"); centerButtonField.setAccessible(true); View centerButton = (View) centerButtonField.get(space); if (settingsProfils.sos == 1) { // 显示中心按钮 centerButton.setVisibility(View.VISIBLE); space.setCentreButtonIcon(R.drawable.sos); space.setCentreButtonColor(ContextCompat.getColor(getActivity(), R.color.coral_pink)); } else { // 隐藏按钮但保留占位 centerButton.setVisibility(View.INVISIBLE); // 将按钮颜色设为背景色,避免视觉残留 space.setCentreButtonColor(ContextCompat.getColor(getActivity(), R.color.gris)); // 可选:清空图标,防止隐藏后仍显示图标 space.setCentreButtonIcon(null); } } catch (NoSuchFieldException | IllegalAccessException e) { e.printStackTrace(); }
注意事项:
- 反射依赖库的内部字段名
mCenterButton,若后续SpaceNavigationView版本更新修改了该字段名,需同步调整代码。 View.INVISIBLE会保留按钮的布局位置,其他菜单项不会发生移位。- 提取公共配置代码,避免重复设置相同属性。
内容的提问来源于stack exchange,提问作者Hajar Hosni
相关产品推荐
相关产品推荐

