You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何禁用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

火山引擎 最新活动