Отображение режима действия над панелью инструментов

87

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

toolbar.startActionMode(callback);

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

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

<item name="windowActionModeOverlay">true</item>
Гаэтан
источник
1
Я думаю, что ActionMode является частью ActionBar, и вы не можете изменить его положение
SpyZip
Это очень плохо. Спасибо за ответ
Гаэтан
1
Вы установили панель инструментов как панель действий?
Никола Деспотоски
1
все еще есть та же проблема, есть ли обновления по этому поводу? У меня такая же ситуация, одна панель инструментов как классическая панель действий и одна панель инструментов ниже, как заголовок и меню параметров для содержимого, показанного ниже. столкнулся с этой проблемой и не смог переместить режим действия вниз.
cV2,

Ответы:

82

Поскольку вы используете 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);
Kuffs
источник
35
Это плюс windowActionModeOverlayнастройка сработала для меня.
Jimeux
4
Я сейчас использую, AppCompatActivityи windowActionModeOverlay мне было достаточно добавления . Я попытался использовать импорт, android.support.v7.view.ActionModeно это не сработало MultiChoiceModeListener, поэтому я решил использовать android.view.ActionModeвместо него. Вы знаете, есть ли версия для поддержки MultiChoiceModeListener? Спасибо
Axel
Есть ли поддерживаемая версия MultiChoiceModeListener?
galaxigirl 05
@galaxigirl, похоже, что нет. Вы должны обрабатывать события щелчка в своем адаптере и держателе представления
peterchaula
67

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

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

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

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

в твоей теме как заявил Андре.

Фрэнк
источник
1
Это сработало для меня, потому что у меня были особые требования. Вместо реализации ActionMode.Callbackя хотел реализовать MultiChoiceModeListener. Проблема с использованием поддержки ActionModeзаключается в том, что, похоже, не существует поддерживаемой версии MultiChoiceModeListener.
jwir3
43

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

<item name="windowActionModeOverlay">true</item>
Андре Рестиво
источник
Как указано в моем вопросе, я уже пробовал это безуспешно. Но спасибо!
Gaëtan
Извините, я не знал, что вы уже пробовали это. Вы уверены, что это не работает? Меня устраивает.
Андре Рестиво
У меня была такая же проблема, и это ее решает. Благодарность!
Марта Родригес
2
Я попробовал с префиксом и без него android:и поместил его в тему своего приложения. ActionModeНакладки ActionBar, но я хочу его над моим Toolbar, которая ниже ActionBar.
Gaëtan
@ Gaëtan Ты получил на это ответ? У меня такая же проблема, и я расширяю Activity, а не AppCompatActivity, поскольку мое приложение поддерживает API 21 и выше.
SjDev
15

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

<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" />

Левша
источник
Это было единственное изменение, в котором я нуждался. Благодарность!
PNDA
5

найдите свой AndroidManifest.xml, затем добавьте ниже код в свое приложение или тему Activity

<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

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

В моем методе 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();
  }

Меня устраивает.

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

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

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

Джефф Вонг
источник
Это единственное, что у меня сработало. Большое спасибо.
Рахит
0

Если вы видите дерево представления, вы можете написать следующий код:

 ViewGroup decorView = (ViewGroup) getWindow().getDecorView();
    traverseView(decorView);
 /**
 * traverse find actionmodebar
 * @param root  view
 */
public void traverseView(View root) {
    if (root==null){
        return;
    }
    if (root instanceof ActionBarContextView){
        root.setVisibility(View.GONE);
        return;
    }
    if ((root instanceof ViewGroup)) { // If view is ViewGroup, apply this method on it's child views
        ViewGroup viewGroup = (ViewGroup) root;
        for (int i = 0; i < viewGroup.getChildCount(); ++i) {
            traverseView(viewGroup.getChildAt(i));
        }
    }
}
user2416658
источник
0

Итак, после нескольких дней, проведенных в этой теме, я наконец-то заработал. Подведу итог тому, что я сделал.

Примечание. Это решение, Toolbarв котором вместо значения по умолчанию ActionBarв AppCompatActivity.

  1. Я добавил эту строку в свой AppTheme: Он сообщает Android, что вы хотите, чтобы ваш режим действий перекрывал панель инструментов
<item name="windowActionModeOverlay">true</item>
  1. Используйте правильный импорт:

Вы должны использовать этот импорт для работы с AppCompatActivity:

import androidx.appcompat.view.ActionMode;
// or
import android.support.v7.view.ActionMode;
  1. Запустите ActionMode в своей деятельности следующим образом:
actionMode = startSupportActionMode(callback);

А не так:

actionMode = startActionMode(callback);

You Activity создает ActionMode на панели инструментов автоматически, потому что он установлен как supportActionToolbar. Стиль обрабатывает изображение как наложение.

Спасибо @Kuffs и @Lefty.

Леон Латч
источник