当前位置: 首页 > 知识库问答 >
问题:

工具栏设置NavigationOnClickListener破坏了ActionbarDrawerToggle功能

赵景曜
2023-03-14

我正在把操作栏换成工具栏,我几乎把每一块拼图都放好了。我的问题是,如果我向上导航并恢复抽屉菜单,抽屉切换按钮将不再工作。我想出了如果我将抽屉模式设置为解锁,我可以滑动打开抽屉,但不能点击打开抽屉。

所以我加载片段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()。如果我没有设置这个(并通过后退按钮上升)-抽屉的行为正常。那么现在的问题是,我如何正确地允许用户“向上”,并在我们向上时恢复单击侦听器?

共有3个答案

后凯捷
2023-03-14

灵感来自丹尼尔·威尔逊的解决方案,但你只需要做一次,一切就都准备好了。

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

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

现在每次Android。按下id.home,不显示汉堡包标志,调用父活动的onBackPressed()

仇经武
2023-03-14

在我的例子中,这是一个顺序问题,我需要首先设置工具栏,然后设置点击监听器。按此顺序:

       //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);
姚培
2023-03-14

所以我发现我创建了一个错误的点击监听器。我需要的不是setNavigationOnClickListener(),而是setToolbarNavigationClickListener():)

一个微妙但重要的变化,现在工具栏的行为与v7 ActionBarDrawerTougle合作

/**
 * 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);
}
 类似资料:
  • 我使用悬停库创建一个动画时,用户悬停在一个

  • 我今天早上将Android Studio2.0预览版从4更新到5。如果我继续使用: 这仍将成功编译。但如果我移动到-alpha5,就会出现以下错误: 错误:任务执行失败:应用程序:compileReleaseJavaWithJavac。Java . io . file not found异常:....\ intermediates \ explosed-AAR \ com . Google . A

  • 我有一个非常奇怪的问题。 当我在浏览器中打开下面的脚本并执行它时,一切正常。即使我在命令行中调用脚本,也会得到预期的结果。 但是,如果在后台作业中运行脚本,脚本将在“preg_match”函数中中止,而不会出现任何错误。我在任何地方都没有关于此的错误消息,无论是在日志中还是其他任何地方。我还检查了函数是否存在,它是否存在。 脚本似乎只是在preg_匹配时中止,并且没有显示任何关于可能错误的消息。所

  • 问题内容: 我想将工具栏设置为操作栏,但是由于您的工具栏是布局元素,因此必须位于您的布局中。现在我的布局在我的片段中。 我在布局中添加了工具栏,并在片段中对其进行了调用: 之所以有效,是因为我可以设置标题等等,但是现在我希望它作为操作栏做出反应,因为我实际上想拥有它。setDisplayHomeAsUpEnabled(true) 为此,我必须将工具栏更改为操作栏: 这在我的片段中不起作用… 谁能帮

  • 我正在尝试新的工具栏组件,但导航图标出现了一些问题。我想实现一个用于反向导航的自定义图标: 在我的清单中,我为我的活动设置了一个父级: 我这样声明工具栏: 然后在“活动”中,我将工具栏配置为: 后退图标不是我用setNavigationIcon()设置的!无论我给这个方法的绘图是什么,导航图标总是后面的箭头。 我试图删除清单中的父关联,但唯一的效果是(显然)阻止按钮返回。 相反,如果我想要默认的后

  • 我正在创建一个视图及其相应的应用程序。我的包含一些项目,如果单击这些项目,则会将用户带到 。 在< code>DetailViewActivity上,我实现了一个可折叠的工具栏。现在,每次打开< code>DetailViewActivity时,都会在可折叠工具栏内的< code>ImageView上设置不同的图像(具有不同的尺寸)。 我希望默认打开到一定高度(例如 256dp),但如果图像高度大