Відображення ActionMode на панелі інструментів


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

Це дуже погано. Дякую за відповідь
Gaëtan

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

35
Це плюс windowActionModeOverlayнастройка спрацювала для мене.
Jimeux

4
В даний час я використовую AppCompatActivityі додавання windowActionModeOverlay мені було достатньо. Я намагався скористатися імпортом, android.support.v7.view.ActionModeале це не спрацювало MultiChoiceModeListener, тому я android.view.ActionModeзамість цього використав . Чи знаєте ви, чи існує версія підтримки MultiChoiceModeListener? Дякую
Аксель

Чи існує версія підтримки MultiChoiceModeListener?
galaxigirl

@galaxigirl, здається, не існує. Ви повинні обробляти клікові події у своєму адаптері та перегляді holderr
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, далі додайте код нижче у вашому додатку чи темі Діяльність

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

0

Отже, через кілька днів, коли я пройшов цю тему, я нарешті запустив її. Я хотів би резюмувати те, що я зробив.

Примітка: Це рішення, яке використовує a 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. Стиль обробляє dsiplaying як накладання.

Завдяки @Kuffs та @Lefty.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.