Показать ActionMode через панель инструментов

Я пытаюсь использовать android.view.ActionMode с новым android.support.v7.widget.Toolbar, в дополнение к традиционному android.app.ActionBar. Я могу отобразить его с помощью:

toolbar.startActionMode(callback);

Проблема в том, что ActionMode отображается над ActionBar, а не над Toolbar. Есть ли способ изменить это?

Я попытался установить следующее в моей теме, но это ничего не меняет:

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

Ответ 1

Поскольку вы используете 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);

Ответ 2

Не запускайте его в своей деятельности, а на панели инструментов. В вашей деятельности:

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

и вы должны использовать

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

в вашей теме, как указано Андре.

Ответ 3

Попробуйте это в своей теме:

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

Ответ 4

Я думаю, что одна вещь, которую люди не дают понять, что линия

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

находится в базовой теме, т.е. 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" />

Ответ 5

найдите свой 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>

Ответ 6

Это решение, которое я сделал.

В моем onCreateActionMode методе ActionMode.Callback я добавляю следующее:

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();
  }

Это работает для меня.

Ответ 7

Я перепробовал все методы, описанные выше, но он все еще не работает. И тогда я попробовал следующий метод:

    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. В то же время я также пытался изменить тему данной деятельности. Конечно, это не работает. Так что, если у вас действительно нет лучшего выбора, вы можете попробовать этот.

Совсем недавно я обнаружил, что использовал красочную рамку, чтобы включить несколько тем моего приложения, это изменит тему в коде. Когда я попытался изменить стиль в этой структуре, это работает.

Надеюсь, что это работает.