web-dev-qa-db-fra.com

Barre d'outils et barre d'action contextuelle avec AppCompat-v7

Je travaille sur l'utilisation de la barre d'outils nouvellement ajoutée introduite dans Lollipop et dans la bibliothèque AppCompat-v7. J'ai suivi ce guide lors de la configuration de la barre d'outils. J'ai remarqué que lorsque vous appelez quelque chose qui affichera le ActionBar contextuel (comme la mise en surbrillance du texte à copier/coller), il enfoncera la barre d'outils page. Vous pouvez voir ce dont je parle dans l'image en bas de la page:

Donc, essentiellement, je l’établis comme ceci. J'ai la barre d'outils définie dans un fichier XML que j'utilise avec les 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 suit:

    // On Create method of activity:
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

Est-ce que quelqu'un sait comment faire en sorte que la barre d’action contextuelle vienne recouvrir la barre d’outils?

Toolbar and Contextual ActionBar

179
ariets

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é par-dessus la barre d'action au lieu de l'enfoncer. (Si vous n'utilisez pas la dernière AppCompat, vous devez ajouter le préfixe "Android:" à la propriété). En gros, cela signifie à AppCompat que vous avez une barre d’outils située en haut de l’écran et qu’elle doit dessiner le mode Action au-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, la barre d'outils que j'ai définie sous forme de barre d'outils est toujours enfoncée. J'ai essayé avec et sans la bibliothèque de support, mais peu importait.

Malheureusement, je n’ai pas pu résoudre le problème, j’ai donc créé une solution de contournement. Dans mon ActionModeCallback 'onCreateActionMode, je cache la barre d'action:

actionBarToolbar.setVisibility(View.GONE);

et dans onDestroyActionModeJe le montre à nouveau:

actionBarToolbar.setVisibility(View.VISIBLE);

Le masquage/affichage se produit si rapidement que cela ne se remarque pas sur mes appareils de test. Il y a bien sûr un inconvénient: bien que enter-animation fonctionne toujours, l'animation de sortie de la barre d'actions contextuelles est perdue car la barre d'outils apparaît immédiatement au-dessus. Mais jusqu'à ce que nous trouvions une meilleure solution, je suppose que nous sommes coincés avec cela.


(Mon activité consiste en fait à étendre une classe personnalisée BaseActivity qui utilise une méthode appelée getActionBarToolbar(), tirée du code source Google I/O 2014 , ce qui me permet de récupérer facilement la barre d'outils:

BaseActivity activity = (BaseActivity) getActivity();
activity.getActionBarToolbar().setVisibility(View.GONE);

Dommage que l'application d'E/S n'utilise pas la barre d'actions contextuelles.)

317
Jacob Ras

Ne le démarrez pas sur votre activité, mais sur votre barre d’outils. Dans votre activité:

Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
toolbar.startActionMode(mActionModeCallback)

et vous devez utiliser

<item name="windowActionModeOverlay">true</item>
15
Frank

Dans mon cas, <item name="windowActionModeOverlay">true</item>ne n'a pas fonctionné, mais ce travail: <item name="Android:windowActionModeOverlay">true</item>, la Android est la clé.

11
Jenkyn

La solution de Jacob a fonctionné pour moi, mais la barre d’action contextuelle était transparente et la barre d’outils était visible. 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 concernant le style contextuel des barres d’action:

comment personnaliser la barre d’action contextuelle en utilisant appCompat dans la conception des matériaux

8
Pete

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 l'intégralité de l'interface utilisateur en fragments (ft.replace(Android.R.id.content, fragment)).

0
Andreas Wenger

Méthode très utile pour amener la barre d'outils au premier plan toolbar.bringToFront()

0
kunal.c