【问题标题】:Why SwitchPreference is not showing animation when switching from on to off & vice versa?为什么 SwitchPreference 在从打开切换到关闭时不显示动画,反之亦然?
【发布时间】:2016-02-26 13:23:34
【问题描述】:

我为我的应用程序的preferences 创建了一个SwitchPreference

问题是SwitchPreference 在我切换开关时没有显示动画,而是突然切换。

这是preferences.xml 文件的代码:

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
    <SwitchPreference
        android:id="@+id/notification"
        android:key="notification"
        android:title="@string/notification"
        android:defaultValue="true"/>
</PreferenceScreen>

【问题讨论】:

  • 这里也有同样的问题。我的 SwitchPreferences 之一就是这样。这很奇怪,因为 5 个偏好中只有 1 个没有动画。 xml 文件位于 xml-v21 中。
  • 为了对此进行扩展,当多个开关和复选框位于首选项屏幕中时,我看到了类似的情况。最后一个复选框或开关在我的项目中没有动画。它适用于示例项目。两个活动(示例和我的项目)都使用相同的主题和文件。我完全不明白为什么会发生这种情况
  • 是的,我也想知道对我来说是一样的:/
  • 对我来说也一样。它工作正常,所有复选框都在动画。然后我在别处更改了一些东西(嗯,我更改了很多东西),突然其中一个复选框停止动画......我试图恢复更改但没有运气。

标签: android xml android-animation android-preferences


【解决方案1】:

原因

我注意到一些不同的事情可能会导致我的 SwitchPreference 对象的动画丢失:

  1. 如果SwitchPreference 是设置活动中的第一个Preference

  2. 如果我扩展 SwitchPreference 并改用它 (post describing a similar problem)。

修复

为了避免第一个问题,我创建了一个DummyPreference 类,我将其用作PreferenceScreen 中的第一个Preference。下面的例子。

DummyPreference.java

public class DummyPreference extends Preference
{
    public DummyPreference(Context context,AttributeSet attrs)
    {
        super(context,attrs);
    }

    @Override
    public View getView(View convertView,ViewGroup parent)
    {
        View v = new View(getContext());
        v.setVisibility(View.GONE);
        return v;
    }
}

pref_whatever.xml

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
    <com.exaple.DummyPreference/>
    <!-- other preference controls here -->
</PreferenceScreen>

为了避免第二个问题,我不得不求助于在 XML 中使用 android 的普通旧 Preference 类,并将所需的任何额外逻辑移动到包含 Preference 对象的 ActivityFragment 中。

我知道这是一篇旧帖子。我只是希望它可以在将来对其他人有所帮助。

【讨论】:

    【解决方案2】:

    我在 Checkboxes 上遇到了类似的问题,我想可能是同样的问题。问题线似乎在父类 TwoStatePreference 的 setChecked() 函数下。 notifyChanged() 行实际上是在告诉偏好重绘自身,这意味着它会突然显示为选中状态。您可以扩展 SwitchPreference 并仅覆盖该函数并注释掉该行,它应该可以正常工作,只要您在该首选项中没有其他任何东西来重绘自身。

    @Override
    public void setChecked(boolean checked) {
        // Always persist/notify the first time; don't assume the field's default of false.
        final boolean changed = mChecked != checked;
        if (changed || !mCheckedSet) {
            mChecked = checked;
            mCheckedSet = true;
            persistBoolean(checked);
            if (changed) {
                notifyDependencyChange(shouldDisableDependents());
                //notifyChanged();  *******THIS IS REDRAWING THE VIEW IMMEDIATELY
            }
        }
    }
    

    【讨论】:

      【解决方案3】:

      我也遇到了这个问题,我已经尝试了stackoverflow中注意到的所有解决方案,但仍然无法解决问题。当您尝试扩展Preference的子类时,动画会消失,这似乎是一个android错误。请参阅此处查看他们的 bugtracker 条目。

      最后我找到了解决办法,我创建了一个类扩展了Preference,并设置了包含开关组件的布局,并在自定义类中处理点击事件,开关的动画效果很好。

      xml 文件大多像:

      <com.test.MyPreference>
      <!--can define custom_switch_layout.xml base on preference_material.xml-->
      android:layout="@layout/custom_switch_layout"
      android:key="new_switch"
      android:title="pref_switch_title"</com.test.MyPreference>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-07-07
        • 1970-01-01
        • 1970-01-01
        • 2014-02-26
        • 2015-03-01
        • 2016-03-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多