Aus*_*ney 5 android android-animation android-4.4-kitkat android-transitions
我在Android上使用新的KitKat Transitions API.我Scene使用两个布局创建了两个对象.我从里面动画Scene 1到Scene 2里面Fragment.Scene当用户按下后退按钮时,我想自动返回到上一个.
使用时是否有某种内置的后备机制Transitions,或者我必须自己滚动?
它很容易调用TransitionManager.go(scene1),但我真的不想onBackPressed()在我的所有具有Scene动画的片段中实现一个监听器.
我最终推出了自己的解决方案。
让你Activity实现这个
public interface SceneBackstackHandler {
public void addBackstackListener(BackstackListener listener);
public void removeBackstackListener(BackstackListener listener);
public void removeAllBackstackListeners();
public interface BackstackListener {
public boolean onBackPressed();
}
}
Run Code Online (Sandbox Code Playgroud)
活动
private final Object mBackstackListenerLock = new Object();
private List<BackstackListener> mBackstackListeners = new ArrayList<>();
@Override
public void onBackPressed() {
synchronized (mBackstackListenerLock) {
for (BackstackListener mBackstackListener : mBackstackListeners) {
if (mBackstackListener.onBackPressed()) {
// handled by fragment
return;
}
}
super.onBackPressed();
}
}
@Override
protected void onPause() {
super.onPause();
removeAllBackstackListeners();
}
@Override
public void addBackstackListener(BackstackListener listener) {
synchronized (mBackstackListenerLock) {
mBackstackListeners.add(listener);
}
}
@Override
public void removeBackstackListener(BackstackListener listener) {
synchronized (mBackstackListenerLock) {
mBackstackListeners.remove(listener);
}
}
@Override
public void removeAllBackstackListeners() {
synchronized (mBackstackListenerLock) {
mBackstackListeners.clear();
}
}
Run Code Online (Sandbox Code Playgroud)
子片段:
public class MySceneFragment extends Fragment
implements SceneBackstackHandler.BackstackListener {
private Scene mCurrentScene;
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
mBackstackHandler = (SceneBackstackHandler) activity;
mBackstackHandler.addBackstackListener(this);
}
@Override
public void onDetach() {
super.onDetach();
mBackstackHandler.removeBackstackListener(this);
}
@Override
public boolean onBackPressed() {
if (mCurrentScene != null && mCurrentScene.equals(mMyScene)) {
removeMyScene();
return true;
}
return false;
}
private void changeScene(Scene scene) {
TransitionManager.go(scene);
mCurrentScene = scene;
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1054 次 |
| 最近记录: |