我目前正在更新面向Fragment
的应用(我有一个Activity
,其中FrameLayout
容器作为我Fragment
的所有Fragment
的主机。我想在替换AppCompat
时将汉堡图标设置为后箭头。
基本上,如果这还不够清楚,here就是我想要实现的目标。我不想使用this library (MaterialMenu),我希望尽可能使用官方ActionBarDrawerToggle
库。
由于this solution,我实现了这种效果,但是当Fragment
被替换时,我无法弄清楚如何将ActionBarDrawerToggle
作为后退按钮。
所以我的问题是:Fragement
更换后,后箭头图标是否仍为onBackPressed()
?在哪种情况下,如何覆盖它,使其像 @Override
public boolean onOptionsItemSelected(MenuItem item)
{
switch (item.getItemId())
{
case android.R.id.home:
getActivity().onBackPressed();
return true;
}
return false;
}
一样,而不是打开抽屉?我已经尝试了这个,但它没有用:
{{1}}
提前致谢。
答案 0 :(得分:7)
如果你手动打开它,我认为在抽屉里面跟踪更清洁。这就是我最终做的事情:
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);
}
}
答案 1 :(得分:1)
此库的可绘制菜单有一个可以为状态设置动画的方法:
如果您想从Burger
切换到Arrow
,请拨打以下电话:
mMaterialMenu.animateState(IconState.ARROW);
答案 2 :(得分:1)
好的,所以我找到了办法。我很确定这不是一个好的解决方案,因为我使用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);
}
}
如果有人有更好的解决方案,请随时提出建议。