Android 工具栏设置NavigationOnClickListener中断了ActionbarDrawerToggle功能

Android 工具栏设置NavigationOnClickListener中断了ActionbarDrawerToggle功能,android,android-toolbar,android-navigation,Android,Android Toolbar,Android Navigation,我把动作栏换成了工具栏,我几乎把拼图的每一部分都准备好了。我的问题是,如果我“向上”导航并恢复导航抽屉,抽屉切换按钮将不再工作。我发现如果我将抽屉模式设置为unlocked(解锁),我可以滑动打开抽屉,但不能单击打开抽屉 所以我加载片段A,抽屉行为正常,转到片段B并应用向上图标,点击向上返回到A,抽屉将不再通过单击打开 进入片段B: Toolbar t = mHostingActivity.getToolbar(); mHostingActivity.getDrawerToggl

我把动作栏换成了工具栏,我几乎把拼图的每一部分都准备好了。我的问题是,如果我“向上”导航并恢复导航抽屉,抽屉切换按钮将不再工作。我发现如果我将抽屉模式设置为unlocked(解锁),我可以滑动打开抽屉,但不能单击打开抽屉

所以我加载片段A,抽屉行为正常,转到片段B并应用向上图标,点击向上返回到A,抽屉将不再通过单击打开

进入片段B:

Toolbar t = mHostingActivity.getToolbar();
        mHostingActivity.getDrawerToggle().setDrawerIndicatorEnabled(false);
        mHostingActivity.getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        t.setNavigationIcon(mHostingActivity.getV7DrawerToggleDelegate().getThemeUpIndicator());
        t.setNavigationOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                popBackStackToTop(mHostingActivity);
            }
        });

/**
 * Pop the back stack and hide the Up caret all the way to the top level of the {@link com.loylap.activities.MainActivity}
 *
 * @param activity our hosting activity
 */
public static void popBackStackToTop(MainActivity activity) {
    if (activity != null) {
        FragmentManager fm = activity.getSupportFragmentManager();
        fm.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
        activity.getDrawerLayout().setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED);
        activity.getDrawerToggle().setDrawerIndicatorEnabled(true);
    }
}
导航抽屉的设置与示例一样,可能问题在于设置选项的旧方法?例如,我的活动中仍有以下内容:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    if (mDrawerToggle.onOptionsItemSelected(item)) {
        return true;
    }

    return super.onOptionsItemSelected(item);
}
编辑:

好的,我已经将问题缩小到setNavigationOnClickListener()。如果我没有设置此选项(并通过“后退”按钮向上),抽屉将正常工作。所以现在的问题是,我如何正确地允许用户“向上”,并在我们向上之后恢复单击侦听器?

我认为您不能使用:

     t.setNavigationIcon(mHostingActivity.getV7DrawerToggleDelegate().getThemeUpIndicator());
     t.setNavigationOnClickListener(new View.OnClickListener() ...
因为这会破坏你正常的导航行为

相反,请在OnCreateOptions菜单(菜单菜单,菜单充气机)中尝试以下操作:

然后在OnOptions ItemSelected中

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    case android.R.id.home:  
        popBackStackToTop(mHostingActivity);
        return true;

    default:
        break;
    }
    return false;
}

注意:不要忘记使用SetHasOptions菜单(true);在您的片段onCreateView中。

因此我发现我创建了错误的单击侦听器。我需要的不是setNavigationOnClickListener(),而是:)

一个微妙但重要的变化,现在工具栏与v7 ActionBarDrawerToggle协同工作

/**
 * Create the Up caret for a lower level fragment {@link com.loylap.activities.MainActivity}
 *
 * @param activity our hosting activity
 */
public static void createUpButton(final MainActivity activity)
{
    ActionBarDrawerToggle toggle = activity.getDrawerToggle();
    //Disables onClick toggle listener (onClick)
    toggle.setDrawerIndicatorEnabled(false);
    toggle.setToolbarNavigationClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            popBackStackToTop(activity);
        }
    });

    Toolbar t = activity.getToolbar();
    t.setNavigationIcon(activity.getV7DrawerToggleDelegate().getThemeUpIndicator());
    activity.getDrawerLayout().setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);
}

灵感来自丹尼尔·威尔逊(Daniel Wilson)的解决方案,但你只需做一次就可以了

在我的
NavigationDrawer
setUp()
(或者您可以在初始化
ActionBarDrawerToggle
实例的任何地方执行此操作),我编写以下代码:

mDrawerToggle.setToolbarNavigationClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        if(!mDrawerToggle.isDrawerIndicatorEnabled()) {
            getActivity().onBackPressed();
        }
    }
});

现在,每次按下安卓.id.home且汉堡标志不显示时,都会调用父活动的
onBackPressed()

在我的情况下,这是一个顺序问题,我需要首先设置工具栏,然后设置单击侦听器。按此顺序:

       //works
    setSupportActionBar(myToolbar);

    myToolbar.setNavigationOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            openDrawer(view);
        }
    });
与此相反:

    //doesn't work
    myToolbar.setNavigationOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            openDrawer(view);
        }
    });
    setSupportActionBar(myToolbar);
我们可以使用

ValueAnimator drawerAnimator = ValueAnimator.ofFloat(Constants.HAMBURGER, Constants.BACK);
drawerAnimator.addUpdateListener(drawerAnimationUpdateListener);
drawerAnimator.setDuration(Constants.DRAWER_ANIMATION_DURATION);
drawerAnimator.setInterpolator(new LinearInterpolator());
汉堡图标通过动作0,背面通过动作1

public void updateNavigationDrawer(int action) {
    drawerArrowDrawable = actionBarDrawerToggle.getDrawerArrowDrawable();
    if (action == Constants.BACK) {
        actionBarDrawerToggle.setDrawerIndicatorEnabled(false);
        actionBarDrawerToggle.setHomeAsUpIndicator(drawerArrowDrawable);
        actionBarDrawerToggle.setToolbarNavigationClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //onBackPress();
            }
        });
       drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED););
    } else {
        actionBarDrawerToggle.setDrawerIndicatorEnabled(true);
        drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED);
    }
    if (drawerArrowDrawable.getProgress() != action) {
        if (action == Constants.BACK) {
            drawerAnimator.start();
        } else {
            drawerAnimator.reverse();
        }
    }
}

嗨,大牛,谢谢你的投入,原来就是这样的。有几个这样的问题似乎提到了这样一个事实:如果你使用工具栏,R.id.home将不再被解雇,这是一个耻辱。我现在想,我需要删除对动作栏抽屉切换的任何引用,并在activityHi中使用导航单击侦听器触发抽屉打开,这很奇怪,因为在我的项目中,我使用的是工具栏,当我单击箭头图标时,安卓.R.id.home通常会被触发。但是我可以看到,你已经找到了另一个解决方案,所以也许下次我会受到启发:)我只是想给这个添加一个简短的说明,我注意到onOptionsItemSelected并不是在片段中激发的,但是对于活动来说似乎很好——可以进行标准的android.R.id.home检查。我刚刚把你的解决方案修改成了一个新的解决方案。
public void updateNavigationDrawer(int action) {
    drawerArrowDrawable = actionBarDrawerToggle.getDrawerArrowDrawable();
    if (action == Constants.BACK) {
        actionBarDrawerToggle.setDrawerIndicatorEnabled(false);
        actionBarDrawerToggle.setHomeAsUpIndicator(drawerArrowDrawable);
        actionBarDrawerToggle.setToolbarNavigationClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //onBackPress();
            }
        });
       drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED););
    } else {
        actionBarDrawerToggle.setDrawerIndicatorEnabled(true);
        drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED);
    }
    if (drawerArrowDrawable.getProgress() != action) {
        if (action == Constants.BACK) {
            drawerAnimator.start();
        } else {
            drawerAnimator.reverse();
        }
    }
}