在工具栏上显示ActionMode

问题描述 投票:81回答:7

我想尝试使用android.view.ActionMode和新的android.support.v7.widget.Toolbar,以及传统的android.app.ActionBar。我可以用以下方式显示它:

toolbar.startActionMode(callback);

问题是ActionMode显示在ActionBar上,而不是在Toolbar上。有办法改变吗?

我试图在我的主题中设置以下内容,但它似乎没有改变任何东西:

<item name="windowActionModeOverlay">true</item>
android android-support-library android-toolbar android-actionmode
7个回答
75
投票

由于您使用的是Toolbar,我还假设您正在使用AppCompatActivity并使用ActionBar替换内置的Toolbar和您的自定义setSupportActionBar(toolbar);

首先确保您导入正确的命名空间:

import androidx.appcompat.view.ActionMode;
// Or
import android.support.v7.view.ActionMode;

并不是

import android.view.ActionMode;

然后用

_actionMode = startSupportActionMode(this);

并不是

_actionMode = startActionMode(this);

63
投票

不要在您的活动上启动它,而是在工具栏上启动它。在你的活动中:

Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
toolbar.startActionMode(mActionModeCallback)

你必须使用

<item name="windowActionModeOverlay">true</item>

在你的主题中,安德烈说。


37
投票

在你的主题中尝试这个:

<item name="windowActionModeOverlay">true</item>

8
投票

我认为人们没有说清楚的一点就是这条线

<item name="windowActionModeOverlay">true</item>

被放置在Base主题中,即AppTheme而不是AppTheme.NoActionBar

<resources>

<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
    <item name="windowActionModeOverlay">true</item>
</style>

<style name="transparent" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="android:windowBackground">@android:color/transparent</item>
    <item name="android:windowIsTranslucent">true</item>
</style>


<style name="AppTheme.NoActionBar">
    <item name="windowActionBar">false</item>
    <item name="windowNoTitle">true</item>
</style>

<style name="AppTheme.AppBarOverlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar" />

<style name="AppTheme.PopupOverlay" parent="ThemeOverlay.AppCompat.Light" />


4
投票

找到您的AndroidManifest.xml,然后在您的应用程序或活动主题中添加以下代码

<item name="windowActionModeOverlay">true</item>

所以喜欢:

<style name="WorkTimeListTheme" parent="AppTheme.NoActionBar">
        <item name="windowActionModeOverlay">true</item>
        <item name="actionModeBackground">@color/theme_primary</item>
    </style>

1
投票

这是我的解决方案。

在我的ActionMode.Callback的onCreateActionMode方法中,我添加了这个:

StandaloneActionMode standaloneActionMode = (StandaloneActionMode) actionMode;
Field mContextView;
try {
     mContextView = StandaloneActionMode.class.getDeclaredField("mContextView");
     mContextView.setAccessible(true);
     View contextView = (View) mContextView.get(standaloneActionMode);
     MarginLayoutParams params = (MarginLayoutParams) contextView.getLayoutParams();
     params.topMargin = mToolbar.getTop();
  } catch (NoSuchFieldException e) {
            e.printStackTrace();
  } catch (IllegalAccessException e) {
            e.printStackTrace();
  } catch (IllegalArgumentException e) {
            e.printStackTrace();
  }

这个对我有用。


1
投票

我已经尝试了上面的所有方法,但它仍然无法正常工作。然后,我尝试了以下方法:

    private class ActionModeCallback implements ActionMode.Callback {
    @Override
    public boolean onCreateActionMode(ActionMode actionMode, Menu menu) {
        actionMode.getMenuInflater().inflate(R.menu.note_find_action, menu);
        return true;
    }

    @Override
    public boolean onPrepareActionMode(ActionMode actionMode, Menu menu) {
        ((AppCompatActivity) getActivity()).getSupportActionBar().hide();
        return false;
    }

    @Override
    public boolean onActionItemClicked(ActionMode actionMode, MenuItem menuItem) {
        return false;
    }

    @Override
    public void onDestroyActionMode(ActionMode actionMode) {
        ((AppCompatActivity) getActivity()).getSupportActionBar().show();
    }
}

在这里,我使用了动作模式和startSupportActionMode方法的支持库。与此同时,我也尝试修改给定活动的主题。当然,它不起作用。所以,如果你真的没有更好的选择,你可以试试这个。

就在最近,我发现我使用了彩色框架来启用我的应用程序的多个主题,这将改变代码中的主题。当我尝试修改此框架中的样式时,它可以正常工作。

希望它有效。

© www.soinside.com 2019 - 2024. All rights reserved.