我目前正在更新一个面向Fragment
的应用程序(我有一个Activity
带有一个FrameLayout
容器作为我所有 的宿主Fragment
s) 到 Material Design。我想在替换 Fragment
时将汉堡图标动画化为后退箭头。
基本上,如果这还不够清楚,here是我想要实现的。我不想使用 this library (MaterialMenu) ,我想尽可能地使用官方 AppCompat
库。
感谢this solution,我实现了这个效果,但我不知道如何在替换 Fragment
时将 ActionBarDrawerToggle
作为后退按钮。
所以我的问题是:在 Fragement
被替换后,后退箭头图标是否仍应为 ActionBarDrawerToggle
?在这种情况下,我该如何重写它,使其像 onBackPressed()
一样而不是打开抽屉?我已经尝试过了,但它不起作用:
@Override
public boolean onOptionsItemSelected(MenuItem item)
{
switch (item.getItemId())
{
case android.R.id.home:
getActivity().onBackPressed();
return true;
}
return false;
}
提前致谢。
最佳答案
我认为无论您是否手动打开抽屉开关,在抽屉开关内部进行追踪都会更清晰一些。这就是我最终做的:
public class ManualActionBarDrawerToggle extends ActionBarDrawerToggle {
private static final float MENU_POSITION = 0f;
private static final float ARROW_POSITION = 1.0f;
private final int animationLength;
private final DrawerLayout drawerLayout;
private final Activity activity;
private State currentState;
private enum State { UP_ARROW, MENU }
public ManualActionBarDrawerToggle(Activity activity, DrawerLayout drawerLayout, int openDrawerContentDescriptionResource, int closeDrawerContentDescriptionResource) {
super(activity, drawerLayout, openDrawerContentDescriptionResource, closeDrawerContentDescriptionResource);
animationLength = activity.getResources().getInteger(android.R.integer.config_shortAnimTime);
this.drawerLayout = drawerLayout;
this.activity = activity;
currentState = State.MENU;
}
public void animateToBackArrow() {
ValueAnimator anim = ValueAnimator.ofFloat(MENU_POSITION, ARROW_POSITION);
anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator valueAnimator) {
float slideOffset = (Float) valueAnimator.getAnimatedValue();
onDrawerSlide(drawerLayout, slideOffset);
}
});
anim.setInterpolator(new DecelerateInterpolator());
anim.setDuration(animationLength);
anim.start();
currentState = State.UP_ARROW;
}
public void animateToMenu() {
ValueAnimator anim = ValueAnimator.ofFloat(ARROW_POSITION, MENU_POSITION);
anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator valueAnimator) {
float slideOffset = (Float) valueAnimator.getAnimatedValue();
onDrawerSlide(drawerLayout, slideOffset);
}
});
anim.setInterpolator(new DecelerateInterpolator());
anim.setDuration(animationLength);
anim.start();
currentState = State.MENU;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case (android.R.id.home):
if (currentState == State.UP_ARROW) {
activity.onBackPressed();
return true;
}
}
return super.onOptionsItemSelected(item);
}
}
关于Android 5.0 - 以编程方式将 AppCompat v7 21 主页图标从汉堡动画化为后退箭头,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26744299/