Je travaille sur l'utilisation de la barre d'outils nouvellement ajoutée qui a été introduite dans Lollipop et la bibliothèque AppCompat-v7. J'ai suivi ce guide sur la configuration de la barre d'outils, j'ai remarqué que lorsque vous appelez quelque chose qui fera apparaître la barre d'action contextuelle (comme la mise en évidence du texte pour copier / coller), cela poussera la barre d'outils vers le bas sur la page. Vous pouvez voir de quoi je parle dans l'image en bas de page:
Donc, essentiellement, je l'ai mis en place comme ça. J'ai la barre d'outils définie dans un fichier xml que j'utilise avec des balises include:
<android.support.v7.widget.Toolbar
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/colorPrimary"/>
Ensuite, je l'instancie à mon avis:
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:id="@+id/root"
tools:context=".MainActivity">
<include
layout="@layout/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<!-- Rest of view -->
</LinearLayout>
Dans le code, je l'ai configuré comme ceci:
// On Create method of activity:
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
Quelqu'un sait-il comment faire pour que la barre d'action contextuelle vienne au-dessus de la barre d'outils?
Réponses:
Mise à jour:
Solution: utilisez la propriété windowActionModeOverlay . Définissez ceci dans votre thème:
<item name="windowActionModeOverlay">true</item>
et le mode d'action sera affiché sur la barre d'action au lieu de le pousser vers le bas. (Si vous n'utilisez pas le dernier AppCompat, vous devez ajouter le préfixe "android:" à la propriété). Cela permet essentiellement à AppCompat de savoir que vous avez une barre d'outils située en haut de l'écran et qu'il doit dessiner le ActionMode dessus.
Ancienne réponse / solution de contournement:
J'ai rencontré le même problème. Quel que soit le thème que j'ai défini, il abaisse toujours la barre d'outils que j'ai définie comme ActionBar. J'ai essayé avec et sans la bibliothèque de support, mais cela n'avait pas d'importance.
Malheureusement, je n'ai pas pu le réparer, j'ai donc créé une solution de contournement. Dans mon
ActionModeCallback
'sonCreateActionMode
je cache la barre d'action:actionBarToolbar.setVisibility(View.GONE);
et dans
onDestroyActionMode
je le montre à nouveau:actionBarToolbar.setVisibility(View.VISIBLE);
Le masquage / affichage se produit si rapidement qu'il n'est pas perceptible sur mes appareils de test. Il y a bien sûr un inconvénient: bien que l'animation d'entrée fonctionne toujours, l'animation de sortie de la barre d'action contextuelle est perdue car la barre d'outils apparaît immédiatement dessus. Mais jusqu'à ce que nous trouvions une meilleure solution, je suppose que nous sommes coincés avec cela.
(Mon activité étend en fait une
BaseActivity
classe personnalisée qui a une méthode appeléegetActionBarToolbar()
, tirée du code source de l'application Google I / O 2014 , afin que je puisse facilement récupérer la barre d'outils:Dommage que l'application d'E / S n'utilise pas la barre d'action contextuelle.)
la source
Ne le lancez pas sur votre activité, mais sur votre barre d'outils. Dans votre activité:
et vous devez utiliser
<item name="windowActionModeOverlay">true</item>
la source
AppCompatActivity.startSupportActionMode(callback)
, pour obtenir la compatibilité avec des attributs commeapp:iconTint
dans l'élément de menu xmls.Juste un petit ajout: pour
pour travailler, il est important d'appeler<item name="windowActionModeOverlay">true</item>
super.onCreate(savedInstanceState)
AVANT d' appelersetContentView(R.layout.your_activity)
votre activité. Cela fait vraiment une différence dans ce cas!la source
Dans mon cas,
<item name="windowActionModeOverlay">true</item>
ne fonctionne pas, mais ce travail:<item name="android:windowActionModeOverlay">true</item>
laandroid
est la clé.la source
<item name="windowActionModeOverlay">true</item>
avec la barre d'outils appcompat, sinon vous utilisez l'android
espace de noms.La solution de Jacob a fonctionné pour moi, mais l'ActionBar contextuelle était transparente et la barre d'outils visible à travers. Cela peut être résolu comme suit:
<style name="AppTheme.Base" parent="Theme.AppCompat.Light"> .... .... <item name="actionModeStyle">@style/CustomActionMode</item> </style> <style name="CustomActionMode" parent="@style/Widget.AppCompat.ActionMode"> <item name="background">@color/primary_material_light</item> </style>
Le thème "AppTheme.Base" doit être celui appliqué à la barre d'outils.
Plus de détails sur le style contextuel d'ActionBar:
comment personnaliser la barre d'actions contextuelles à l'aide de appCompat dans la conception de matériaux
la source
Méthode très utile pour mettre la barre d'outils au premier plan
toolbar.bringToFront()
la source
View.bringToFront()
est une opération très lourde et doit généralement être évitée à tout prix.Autre petit ajout: assurez-vous de définir au moins un écran vide dans l'activité via
setContentView(R.layout.empty_screen)
si vous chargez toute l'interface utilisateur dans fragments (ft.replace(android.R.id.content, fragment)
).la source