如何禁用Android PreferenceScreen中的设置项显示/隐藏动画?
解决PreferenceScreen设置项隐藏时的动画问题
我之前也碰到过类似的场景,当在onResume阶段修改Preference的可见性时,因为界面已经完成初始绘制,所以会触发系统默认的布局动画,导致出现先显示再消失的情况。这里有几个可行的解决方案:
1. 在初始化阶段设置可见性(推荐)
最根本的方法是在PreferenceScreen还没开始绘制的时候就设置好可见性,这样就不会有任何动画触发。你可以把设置逻辑移到onCreatePreferences方法中:
@Override public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { setPreferencesFromResource(R.xml.preferences, rootKey); // 找到管理员设置项 Preference adminScreen = findPreference("你的_admin_screen_key"); if (adminScreen != null) { // 直接在这里设置可见性,此时界面还未绘制 adminScreen.setVisible(user.isAdmin()); } }
注意:要确保user对象在这个阶段已经可以获取到,如果你的用户权限信息需要在后续生命周期才能拿到,再考虑下面的方法。
2. 临时禁用布局动画后再设置可见性
如果必须在onResume或更晚的阶段修改可见性,可以临时关闭PreferenceScreen的布局动画,设置完成后再恢复:
@Override public void onResume() { super.onResume(); PreferenceScreen preferenceScreen = getPreferenceScreen(); if (preferenceScreen != null) { // 保存原有的动画状态 boolean originalAnimateState = preferenceScreen.isAnimateLayoutChanges(); // 临时禁用布局动画 preferenceScreen.setAnimateLayoutChanges(false); // 设置管理员项的可见性 Preference adminScreen = findPreference("你的_admin_screen_key"); if (adminScreen != null) { adminScreen.setVisible(user.isAdmin()); } // 恢复原有的动画设置(如果其他场景需要保留动画) preferenceScreen.setAnimateLayoutChanges(originalAnimateState); } }
这个方法的核心是通过setAnimateLayoutChanges(false)阻止本次布局更新触发动画,设置完成后再恢复原有状态,不会影响其他操作的动画效果。
3. 禁用整个Preference列表的Item动画
如果你的页面不需要任何Preference项的动画效果,可以直接禁用内部RecyclerView的ItemAnimator:
@Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); // 获取PreferenceFragmentCompat内部的RecyclerView RecyclerView recyclerView = view.findViewById(androidx.preference.R.id.recycler_view); if (recyclerView != null) { // 完全禁用Item动画 recyclerView.setItemAnimator(null); } }
这个方法会禁用所有Preference项的添加、删除动画,适合不需要任何动画的场景。
内容的提问来源于stack exchange,提问作者Mathias




