【问题标题】:How to make ActionMode aligned with custom Toolbar如何使 ActionMode 与自定义工具栏对齐
【发布时间】:2015-02-18 15:59:55
【问题描述】:

我有一个带有新支持工具栏和导航抽屉的活动。工具栏与内容相关,例如物品清单。可以选择多个项目 - 然后显示 ActionMode(上下文操作栏)。但是系统 ActionMode 的位置、大小和布局顺序与 Toolbar 不对应,这将是适当的。

问题是:如何调整系统 ActionMode 以对应(对齐)我的工具栏?或者有没有其他推荐的替代方案?在下面查看我的案例

肖像

NavDrawer 可能隐藏在侧面(1-绿色) - 这对于工具栏和操作模式都可以。 工具栏及其内容都与抽屉打开的导航抽屉重叠(2-黄色)。但是,当 ActionMode 处于活动状态时,它始终显示在 NavDrawer(3-red)上方,但我希望它看起来像(2-yellow),因为 ActionMode 与隐藏的内容相关。

这个问题类似于这个问题: How to make the Contextual ActionMode Bar overlay the appcompat-v7 Toolbar but not the navigation drawer?

平板电脑/横向

在横向中,NavDrawer 适合工具栏和内容(左)。 ActionMode 始终覆盖 NavDrawer 和 Toolbar 并具有全屏宽度(右红色)。我再次希望 ActionMode 与 Toolbar 处于相同位置(左黄色)。

【问题讨论】:

  • 也许你必须完成ActionMode。看看这个问题:stackoverflow.com/questions/21288278/…
  • 感谢提示,但这似乎只是解决方法。不完全是我想要实现的。仅在纵向情况下有用,在平板电脑/横向场景中没有帮助
  • 我用反射解决了它。这是一个例子stackoverflow.com/questions/26483778/…
  • 我通过像 Google 对 Gmail 和 Keep 所做的那样来“解决”这个问题:只要 DrawerLayout 调用 onDrawerSlide(),我就会关闭 ActionMode。抽屉完全关闭后,您可以重新启动 ActionMode。
  • 我知道这不是一个正确的解决方案,但我遇到了同样的问题,我通过在 actionModeCallbacks 中通过drawer.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED); 临时禁用抽屉来管理它,然后在我完成我的东西后重新启用抽屉通过调用drawer.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED); 使用操作模式

标签: android navigation-drawer android-toolbar android-actionmode


【解决方案1】:

我通过使用另一个Toolbar (actionModeToolbar) 解决了这个问题,我可以将它放在布局中的任何位置并根据需要显示或隐藏它。

我在这里找到了一些如何使用Toolbar 的有用提示: https://gist.github.com/gabrielemariotti/ae63392e1c70bc33af8b

这是我使用Toolbar 和旧版ActionMode.Callback 创建ActionMode 的方法。为了部分兼容,我使用了类似于系统ActionMode 的方法。 注意,ActionMode.Callback 不再需要,因为系统ActionMode 没有被使用,代码可以重构。

class ToolbarActionMode {

    Toolbar actionModeToolbar;
    ActionMode.Callback callback;       

    void startActionMode() {
        actionModeToolbar.setNavigationOnClickListener(new View.OnClickListener() {
            @Override public void onClick(View v) {
                toolbarActionMode.finishActionMode();
            }
        });
        actionModeToolbar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() {
            @Override public boolean onMenuItemClick(MenuItem menuItem) {
                return callback.onActionItemClicked(null, menuItem);
            }
        });
        // will create menu using inflateMenu(R.menu.menu_res)
        callback.onCreateActionMode(null, null);
        invalidate();
        actionModeToolbar.setVisibility(View.VISIBLE);
    }

    void finishActionMode() {
        callback.onDestroyActionMode(null);
        actionModeToolbar.setVisibility(View.GONE);        
    }

    void invalidate() {
        // will update title + menu
        callback.onPrepareActionMode(null, actionModeToolbar.getMenu());
    }

    void setTitle(CharSequence title) {
        actionModeToolbar.setTitle(title);
    }

    void inflateMenu(int menuRes) {
        actionModeToolbar.inflateMenu(menuRes);
    }
}

【讨论】:

  • 我正在查看您在示例中描述的相同问题。这仍然是您当前使用的解决方案还是您找到了新的解决方案?
  • 基本上我们还是使用自定义工具栏来模拟动作模式。代码可能变了,但思路还是一样的。
猜你喜欢
  • 2015-09-30
  • 1970-01-01
  • 2014-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-20
  • 2015-05-02
  • 1970-01-01
相关资源
最近更新 更多