Я пытаюсь использовать android.view.ActionMode
новое android.support.v7.widget.Toolbar
в дополнение к традиционному android.app.ActionBar
. Я могу отобразить это с помощью:
toolbar.startActionMode(callback);
Проблема в том, что ActionMode
значок отображается над ActionBar
, а не над Toolbar
. Есть ли способ это изменить?
Я попытался установить в своей теме следующее, но вроде ничего не меняет:
<item name="windowActionModeOverlay">true</item>
Ответы:
Прежде всего убедитесь, что вы импортируете правильное пространство имен:
import androidx.appcompat.view.ActionMode; // Or import android.support.v7.view.ActionMode;
и нет
import android.view.ActionMode;
тогда используйте
_actionMode = startSupportActionMode(this);
и нет
_actionMode = startActionMode(this);
источник
windowActionModeOverlay
настройка сработала для меня.AppCompatActivity
иwindowActionModeOverlay
мне было достаточно добавления . Я попытался использовать импорт,android.support.v7.view.ActionMode
но это не сработалоMultiChoiceModeListener
, поэтому я решил использоватьandroid.view.ActionMode
вместо него. Вы знаете, есть ли версия для поддержкиMultiChoiceModeListener
? СпасибоНе запускайте его в своей деятельности, а на панели инструментов. В вашей деятельности:
и вы должны использовать
<item name="windowActionModeOverlay">true</item>
в твоей теме как заявил Андре.
источник
ActionMode.Callback
я хотел реализоватьMultiChoiceModeListener
. Проблема с использованием поддержкиActionMode
заключается в том, что, похоже, не существует поддерживаемой версииMultiChoiceModeListener
.Попробуйте это в своей теме:
<item name="windowActionModeOverlay">true</item>
источник
android:
и поместил его в тему своего приложения.ActionMode
НакладкиActionBar
, но я хочу его над моимToolbar
, которая нижеActionBar
.Я думаю, что люди не совсем ясно дают понять, что строка
<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" />
источник
найдите свой 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>
источник
Это решение, которое я сделал.
В моем методе 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(); }
Меня устраивает.
источник
Я испробовал все вышеперечисленные методы, но все равно не работает. А затем я попробовал следующий метод:
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 библиотеки поддержки. В то же время я также попытался изменить тему данного мероприятия. Конечно, не работает. Итак, если у вас действительно нет лучшего выбора, вы можете попробовать этот.
Совсем недавно я обнаружил, что использовал цветной фрейм для включения нескольких тем в моем приложении, это изменит тему в коде. Когда я попытался изменить стиль в этой структуре, это сработало.
Надеюсь, что это работает.
источник
Если вы видите дерево представления, вы можете написать следующий код:
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)); } } }
источник
Итак, после нескольких дней, проведенных в этой теме, я наконец-то заработал. Подведу итог тому, что я сделал.
AppTheme
: Он сообщает Android, что вы хотите, чтобы ваш режим действий перекрывал панель инструментов<item name="windowActionModeOverlay">true</item>
Вы должны использовать этот импорт для работы с
AppCompatActivity
:import androidx.appcompat.view.ActionMode; // or import android.support.v7.view.ActionMode;
А не так:
You Activity создает ActionMode на панели инструментов автоматически, потому что он установлен как supportActionToolbar. Стиль обрабатывает изображение как наложение.
Спасибо @Kuffs и @Lefty.
источник