在允许用户通过社交网络登录的 Android 应用程序中,我FAB
使用以下代码显示和隐藏 a:
public abstract class LoginFragment extends Fragment {
private FloatingActionButton mFab;
private Animation mShowFab;
private Animation mHideFab;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mShowFab = AnimationUtils.makeInAnimation(getContext(), false);
mShowFab.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
mFab.setVisibility(View.VISIBLE);
}
@Override
public void onAnimationEnd(Animation animation) {
}
@Override
public void onAnimationRepeat(Animation animation) {
}
});
mHideFab = AnimationUtils.makeOutAnimation(getContext(), true);
mHideFab.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
}
@Override
public void onAnimationEnd(Animation animation) {
mFab.setVisibility(View.INVISIBLE);
}
@Override
public void onAnimationRepeat(Animation animation) {
}
});
}
private void showFab(boolean show) {
boolean visible = mFab.isShown();
if (show && !visible) {
mFab.startAnimation(mShowFab);
} else if (!show && visible) {
mFab.startAnimation(mHideFab);
}
}
showFab
当我调用上述方法足够慢时,这很好用。
在开始任何动画之前,我会检查当前的FloatingActionButton
可见性,以便动画只播放一次- 即使我showFab(true)
连续调用几次。
我的问题:
当LoginFragment
我的应用程序中显示 a 时,我首先向 a 发送请求以ServiceIntent
从 SQLite 获取用户数据并调用以下方法将我的 UI 设置为“等待”状态:
private void setBusy(boolean busy) {
mProgressBar.setVisibility(busy ? View.VISIBLE : View.INVISIBLE);
showFab(!busy);
}
几乎立即来自 SQLite 的响应回来了 - 通过 aLocalBroadcastManager
我再次调用上述方法:setBusy(false)
.
然后发生错误并且FAB
不可见。
如果我用无FAB
动画代码替换该方法,一切正常:
private void showFab(boolean show) {
mFab.setVisibility(show ? View.VISIBLE : View.INVISIBLE);
}
但是对于动画 - 似乎会出现赛车情况。
作为一种解决方法,我尝试取消这两个动画 - 但这无济于事:
private void showFab(boolean show) {
mShowFab.cancel();
mShowFab.reset();
mHideFab.cancel();
mHideFab.reset();
boolean visible = mFab.isShown();
if (show && !visible) {
mFab.startAnimation(mShowFab);
} else if (!show && visible) {
mFab.startAnimation(mHideFab);
}
}
请建议在这里可以做什么。
我已经在调试器中多次通过我的应用程序。( setBusy
and showFab
) 在显示 Fragment 时仅被调用两次,但两次调用都发生得非常快 - 并且FAB
未显示 -
第一次运行:
第二次运行:
更新:
不幸的是,制作该方法synchronized
也无济于事 -FAB
保持隐藏:
private synchronized void showFab(boolean show) {
mShowFab.cancel();
mShowFab.reset();
mHideFab.cancel();
mHideFab.reset();
boolean visible = mFab.isShown();
if (show && !visible) {
mFab.startAnimation(mShowFab);
} else if (!show && visible) {
mFab.startAnimation(mHideFab);
}
}