web-dev-qa-db-fra.com

Afficher ActionMode sur la barre d'outils

J'essaie d'utiliser le Android.view.ActionMode avec le nouveau Android.support.v7.widget.Toolbar, en plus du traditionnel Android.app.ActionBar. Je suis capable de l'afficher avec:

toolbar.startActionMode(callback);

Le problème est que la ActionMode est affichée sur la ActionBar et non sur la Toolbar. Y a-t-il un moyen de changer cela?

J'ai essayé de définir ce qui suit dans mon thème, mais cela ne semble rien changer:

<item name="windowActionModeOverlay">true</item>
76
Gaëtan

Puisque vous utilisez la Toolbar, je suppose aussi que vous utilisez le AppCompatActivity et ont remplacé le construit en ActionBar par votre Toolbar personnalisé en utilisant setSupportActionBar(toolbar);

Tout d’abord, assurez-vous d’importer le bon espace de noms.

import Android.support.v7.view.ActionMode;

et pas

import Android.view.ActionMode;

puis utiliser

_actionMode = startSupportActionMode(this);

et pas

_actionMode = startActionMode(this);
70
Kuffs

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>

dans votre thème comme indiqué par André.

59
Frank

Essayez ceci dans votre thème:

<item name="windowActionModeOverlay">true</item>
35
André Restivo

trouvez votre AndroidManifest.xml, ajoutez ensuite le code ci-dessous dans votre application ou votre thème d'activité

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

tellement comme:

<style name="WorkTimeListTheme" parent="AppTheme.NoActionBar">
        <item name="windowActionModeOverlay">true</item>
        <item name="actionModeBackground">@color/theme_primary</item>
    </style>
2
zhangjin

C'est la solution que j'ai faite.

Dans mon onCreateActionMode méthode de ActionMode.Callback , j'ajoute ceci:

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();
  }

Ça marche pour moi.

1
Avery

Je pense que la seule chose que les gens ne disent pas clairement est que la ligne

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

est placé dans le thème de base, c'est-à-dire AppTheme et non pas 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" />

1
Lefty9910

J'ai essayé toutes les méthodes ci-dessus, mais cela ne fonctionne toujours pas. Et puis, j'ai essayé la méthode ci-dessous:

    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();
    }
}

Ici, j'ai utilisé le mode action et la méthode startSupportActionMode de la bibliothèque de support. Dans le même temps, j'ai également essayé de modifier le thème d'une activité donnée. Cela ne fonctionne sûrement pas. Donc, si vous n'avez vraiment pas de meilleur choix, vous pouvez essayer celui-ci.

Récemment, j'ai découvert que j'avais utilisé le cadre coloré pour activer plusieurs thèmes de mon application, cela changerait le thème en code. Lorsque j'ai essayé de modifier le style dans ce cadre, cela fonctionne.

Esperons que ça marche.

0
Shouheng Wang