我目前正在将一个面向Fragment
的应用程序(我有一个Activity
,FrameLayout
容器作为我所有Fragment
的主机)更新为Material Design。当替换Fragment
时,我想将汉堡图标设置为后箭头。
基本上,如果这还不够清楚的话,这里就是我想要实现的。我不想使用这个库(MaterialMenu),我想尽可能使用官方的AppCompat
库。
由于此解决方案,我实现了此效果,但我不知道如何在更换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);
}
}
这个库的可绘制菜单有一个可以动画化状态的方法:
如果你想从Burger
切换到Arrow
,你可以打这个电话:
mMaterialMenu.animateState(IconState.ARROW);
好的,所以我找到了一种方法。我确信这不是一个好的解决方案,因为我使用ActionBarDrawerToggle
的目的与创建它的目的不同。
但它是有效的,所以以下是我所做的。我只是创建了一个自定义的ActionBarDrawerToggle
,在其中我覆盖了onOptionsItemSelected(...)
方法:
class MyDrawerToggle extends ActionBarDrawerToggle
{
// ... Default constructors matching super go here
@Override
public boolean onOptionsItemSelected(MenuItem item)
{
// If the back stack isn't empty, ie if I'm not in a Fragment
// accessible from the NavigationDrawer, I simulate the onBackPressed behaviour
if (getFragmentManager().getBackStackEntryCount() != 0)
{
onBackPressed();
return true;
}
return super.onOptionsItemSelected(item);
}
}
如果有人有更好的解决方案,请随时提出。