Staram się korzystać android.view.ActionMode
z nowego android.support.v7.widget.Toolbar
, oprócz tradycyjnego android.app.ActionBar
. Mogę to wyświetlić za pomocą:
toolbar.startActionMode(callback);
Problem polega na tym, że ActionMode
jest wyświetlany nad ActionBar
, a nie nad Toolbar
. Czy jest sposób, aby to zmienić?
Próbowałem ustawić następujący motyw w moim motywie, ale wydaje się, że nic to nie zmienia:
<item name="windowActionModeOverlay">true</item>
Odpowiedzi:
Przede wszystkim upewnij się, że importujesz poprawną przestrzeń nazw:
import androidx.appcompat.view.ActionMode; // Or import android.support.v7.view.ActionMode;
i nie
import android.view.ActionMode;
następnie użyj
_actionMode = startSupportActionMode(this);
i nie
_actionMode = startActionMode(this);
źródło
windowActionModeOverlay
ustawienie działało dla mnie.AppCompatActivity
iwindowActionModeOverlay
wystarczyło mi dodanie . Próbowałem użyć importu,android.support.v7.view.ActionMode
ale to nie działałoMultiChoiceModeListener
, więcandroid.view.ActionMode
zamiast tego użyłem . Czy wiesz, czy istnieje wersja obsługującaMultiChoiceModeListener
? DziękiNie uruchamiaj go na swojej aktywności, ale na pasku narzędzi. W Twojej działalności:
i musisz użyć
<item name="windowActionModeOverlay">true</item>
w twoim motywie, jak stwierdził Andre.
źródło
ActionMode.Callback
, chciałem wdrożyćMultiChoiceModeListener
. Problem z korzystaniem z pomocy technicznejActionMode
polega na tym, że nie ma wersji obsługującejMultiChoiceModeListener
.Spróbuj tego w swoim motywie:
<item name="windowActionModeOverlay">true</item>
źródło
android:
prefiksem i bez niego i umieściłem go w motywie aplikacji.ActionMode
PrzykrywaActionBar
, ale chcę ją nad moimToolbar
, który jest poniżejActionBar
.Myślę, że jedyną rzeczą, której ludzie nie wyjaśniają, jest linia
<item name="windowActionModeOverlay">true</item>
jest umieszczony w motywie podstawowym, tj. AppTheme, a nie 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" />
źródło
znajdź swój AndroidManifest.xml, a następnie dodaj poniższy kod w swojej aplikacji lub motywie działania
<item name="windowActionModeOverlay">true</item>
tak jak:
<style name="WorkTimeListTheme" parent="AppTheme.NoActionBar"> <item name="windowActionModeOverlay">true</item> <item name="actionModeBackground">@color/theme_primary</item> </style>
źródło
To jest rozwiązanie, które stworzyłem.
W mojej metodzie onCreateActionMode klasy ActionMode.Callback dodaję to:
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(); }
Mi to pasuje.
źródło
Wypróbowałem wszystkie powyższe metody, ale nadal nie działają. A potem wypróbowałem poniższą metodę:
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(); } }
Tutaj użyłem trybu akcji i metody startSupportActionMode biblioteki wsparcia. Jednocześnie starałem się również zmodyfikować temat danej czynności. Na pewno to nie działa. Więc jeśli naprawdę nie masz lepszego wyboru, możesz spróbować tego.
Niedawno odkryłem, że użyłem kolorowej ramki, aby włączyć wiele motywów mojej aplikacji, co zmieni motyw w kodzie. Kiedy próbowałem zmodyfikować styl w tych ramach, to działa.
Mam nadzieję, że to działa.
źródło
Jeśli zobaczysz drzewo widoków, możesz napisać poniższy kod:
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)); } } }
źródło
Tak więc, po wielu dniach spędzonych przez ten wątek, w końcu udało mi się to. Chciałbym podsumować to, co zrobiłem.
AppTheme
: Mówi androidowi, że chcesz, aby twój tryb akcji nakładał się na pasek narzędzi<item name="windowActionModeOverlay">true</item>
Musisz użyć tych importów, aby pracować z
AppCompatActivity
:import androidx.appcompat.view.ActionMode; // or import android.support.v7.view.ActionMode;
A nie tak:
You Activity automatycznie tworzy ActionMode na pasku narzędzi, ponieważ jest ustawiony jako supportActionToolbar. Styl traktuje dsiplaying jako nakładkę.
Dzięki @Kuffs i @Lefty.
źródło