我花了超过10个小时试图让开关的动画工作。
我尝试了很多事情,我不记得有几次尝试,但我会解释那些我记得的事情。
应该有效的代码(我认为):
我使用widgetLayout参数:
<CheckBoxPreference
android:defaultValue="false"
android:key="asd"
android:title="@string/asd"
android:widgetLayout="@layout/switchcompat_for_settings">
switchcompat_for_settings:
<android.support.v7.widget.SwitchCompat
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/checkbox"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@null"
android:clickable="false"
android:focusable="false"
android:gravity="center"
/>
没有动画。
使用此代码扩展SwitchCompat(最佳尝试??): https://gist.github.com/antifriz/ad4412b72d50f63ec977
从false变为true,是动画,从true变为false,没有动画。
非理想行为(但如果无法阻止,则可以接受):如果值为true,则在加载活动时播放动画。
使用以下代码进行扩展:
Extending Preference classes in Android Lollipop = losing animation
根本没有动画。
@Override
public boolean isShown() {
return getVisibility() == VISIBLE;
}
使用SwitchPreference:
在Lollipop之前它有旧视图,所以不太理想,因为在Lollipop之前和之后我需要不同的xml。 如果我只有一个SwitchPreference,我仍然没有动画。通过几个连续的SwitchPreferences我得到一个除了一个之外的动画(我还检查了一个带有设置模板和同样问题的新项目)。
另外,除了一个以外,我不喜欢任何Preference中的动画而不是动画。
添加第二个开关:
在 switchcompat_for_settings 中,我添加第二个SwitchCompat并将 id = @ android:id / checkbox 设置为不可见。我扩展了CheckboxPreference以覆盖onBindView,在调用super.onBindView
之后,我找到了额外的SwitchCompat并将setChecked
调用到适当的值。
在 onPreferenceClick 中,我调用了额外开关的setChecked。
没有动画就切换。我的理解是问题是onBindView被称为很多次(当创建首选项时,以及每次我切换它时),它取消了动画。
我试图添加一个布尔值,只有在从onClick调用但没有成功之后才调用onBindView中的setChecked。也许这是要走的路,我做错了。
只剩下想法(不愿意这样做): 手动将开关添加到活动根视图,放置在具有此首选项的每个活动(几个)的正确位置和句柄中。