【发布时间】:2015-10-22 11:14:33
【问题描述】:
在允许用户通过社交网络登录的 Android 应用中,我使用以下代码显示和隐藏 FAB:
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 时,我首先向ServiceIntent 发送请求以从SQLite 获取用户数据并调用以下方法将我的UI 设置为“等待”状态:
private void setBusy(boolean busy) {
mProgressBar.setVisibility(busy ? View.VISIBLE : View.INVISIBLE);
showFab(!busy);
}
SQLite 的响应几乎立即返回 - 通过LocalBroadcastManager 我再次调用上述方法: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(和 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);
}
}
【问题讨论】:
标签: android animation android-animation floating-action-button animationutils