Estoy tratando de usar el android.view.ActionMode
con el nuevo android.support.v7.widget.Toolbar
, además del tradicional android.app.ActionBar
. Puedo mostrarlo con:
toolbar.startActionMode(callback);
El problema es que ActionMode
se muestra sobre el ActionBar
y no sobre el Toolbar
. ¿Existe alguna manera de cambiar esto?
Intenté establecer lo siguiente en mi tema, pero no parece cambiar nada:
<item name="windowActionModeOverlay">true</item>
Respuestas:
En primer lugar, asegúrese de importar el espacio de nombres correcto:
import androidx.appcompat.view.ActionMode; // Or import android.support.v7.view.ActionMode;
y no
import android.view.ActionMode;
luego usa
_actionMode = startSupportActionMode(this);
y no
_actionMode = startActionMode(this);
fuente
windowActionModeOverlay
entorno funcionó para mí.AppCompatActivity
y agregarwindowActionModeOverlay
fue suficiente para mí. Traté de usar la importaciónandroid.support.v7.view.ActionMode
pero no funcionóMultiChoiceModeListener
, así que terminé usando en suandroid.view.ActionMode
lugar. ¿Sabes si hay una versión de soporte deMultiChoiceModeListener
? GraciasNo lo inicie en su actividad, sino en su barra de herramientas. En tu actividad:
y tienes que usar
<item name="windowActionModeOverlay">true</item>
en su tema según lo declarado por Andre.
fuente
ActionMode.Callback
, quería implementarMultiChoiceModeListener
. El problema con el uso del soporteActionMode
es que no parece haber una versión de soporte delMultiChoiceModeListener
.Prueba esto en tu tema:
<item name="windowActionModeOverlay">true</item>
fuente
android:
prefijo y lo puse en el tema de mi aplicación. LaActionMode
superposición deActionBar
, pero la quiero sobre miToolbar
, que está debajo deActionBar
.Creo que lo único que la gente no deja en claro es que la línea
<item name="windowActionModeOverlay">true</item>
se coloca en el tema base, es decir, AppTheme y no 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" />
fuente
encuentre su AndroidManifest.xml, luego agregue el código a continuación en su aplicación o tema de actividad
<item name="windowActionModeOverlay">true</item>
asi como:
<style name="WorkTimeListTheme" parent="AppTheme.NoActionBar"> <item name="windowActionModeOverlay">true</item> <item name="actionModeBackground">@color/theme_primary</item> </style>
fuente
Esta es la solución que hice.
En mi método onCreateActionMode de ActionMode.Callback , agrego esto:
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(); }
Esto funciona para mi.
fuente
He intentado todos los métodos anteriores, pero todavía no funciona. Y luego, probé el siguiente método:
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(); } }
Aquí, utilicé el modo de acción y el método startSupportActionMode de la biblioteca de soporte. Al mismo tiempo, también he intentado modificar el tema de una actividad determinada. Seguramente no funciona. Entonces, si realmente no tiene una mejor opción, puede probar esta.
Recientemente, descubrí que usé el marco de colores para habilitar múltiples temas de mi aplicación, esto cambiará el tema en el código. Cuando intenté modificar el estilo en este marco, funciona.
Espero que funcione.
fuente
Si ve el árbol de vista, puede escribir el siguiente código:
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)); } } }
fuente
Entonces, después de días pasando por este hilo, finalmente lo hice funcionar. Me gustaría resumir lo que hice.
AppTheme
: Le dice a Android que desea que su modo de acción se superponga a la barra de herramientas<item name="windowActionModeOverlay">true</item>
Tienes que usar estas importaciones para trabajar con
AppCompatActivity
:import androidx.appcompat.view.ActionMode; // or import android.support.v7.view.ActionMode;
Y no así:
Tu actividad crea el ActionMode en la barra de herramientas automáticamente, porque está configurado como supportActionToolbar. El estilo maneja la reproducción como superposición.
Gracias a @Kuffs y @Lefty.
fuente