Visualizza ActionMode sulla barra degli strumenti


88

Sto cercando di utilizzare il android.view.ActionModecon il nuovo android.support.v7.widget.Toolbar, oltre al tradizionale android.app.ActionBar. Sono in grado di visualizzarlo con:

toolbar.startActionMode(callback);

Il problema è che ActionModeviene visualizzato sopra ActionBare non sopra Toolbar. C'è un modo di cambiarlo?

Ho provato a impostare quanto segue nel mio tema, ma non sembra cambiare nulla:

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

1
Penso che ActionMode faccia parte di ActionBar e non sia possibile modificarne la posizione
SpyZip

È un peccato. Grazie per la risposta
Gaëtan

1
Hai impostato la barra degli strumenti come barra delle azioni?
Nikola Despotoski

1
hanno ancora lo stesso problema, eventuali aggiornamenti su questo? ho ottenuto la stessa situazione, una barra degli strumenti come barra delle azioni classica e una barra degli strumenti sotto, come intestazione e menu delle opzioni per i contenuti mostrati di seguito. affrontare questo problema e non essere in grado di spostare la modalità di azione verso il basso.
cV2

Risposte:


83

Dal momento che stai usando Toolbar, presumo anche tu stia usando AppCompatActivitye abbia sostituito il built-in ActionBarcon il tuo Toolbarutilizzo personalizzatosetSupportActionBar(toolbar);

Prima di tutto assicurati di importare lo spazio dei nomi corretto:

import androidx.appcompat.view.ActionMode;
// Or
import android.support.v7.view.ActionMode;

e non

import android.view.ActionMode;

quindi utilizzare

_actionMode = startSupportActionMode(this);

e non

_actionMode = startActionMode(this);

35
Questo più l' windowActionModeOverlayimpostazione ha funzionato per me.
Jimeux

4
Attualmente sto utilizzando AppCompatActivitye l'aggiunta è windowActionModeOverlay stata sufficiente per me. Ho provato a usare l'importazione android.support.v7.view.ActionModema non ha funzionato MultiChoiceModeListener, quindi ho finito per usare android.view.ActionModeinvece. Sai se esiste una versione di supporto di MultiChoiceModeListener? Grazie
Axel

Esiste una versione di supporto di MultiChoiceModeListener?
galaxigirl

@galaxigirl, sembra che non ci sia. Devi gestire gli eventi di clic nel tuo adattatore e visualizzare holderr
peterchaula

68

Non avviarlo sulla tua attività, ma sulla barra degli strumenti. Nella tua attività:

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

e devi usare

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

nel tuo tema come affermato da Andre.


1
Questo ha funzionato per me, perché avevo anche un'esigenza speciale. Invece di implementare ActionMode.Callback, volevo implementare MultiChoiceModeListener. Il problema con l'utilizzo del supporto ActionModeè che non sembra esserci una versione di supporto di MultiChoiceModeListener.
jwir3

44

Prova questo nel tuo tema:

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

Come affermato nella mia domanda, l'ho già provato senza successo. Ma grazie!
Gaëtan

Mi spiace, non sapevo che ci avessi già provato. Sei sicuro che non funzioni? Per me funziona.
André Restivo

Ho avuto lo stesso problema e questo lo risolve. Grazie!
Marta Rodriguez

2
Ho provato con e senza il android:prefisso e l'ho inserito nel tema dell'applicazione. La ActionModesovrapposizione di ActionBar, ma la voglio sopra la mia Toolbar, che è sotto la ActionBar.
Gaëtan

@ Gaëtan Hai ricevuto una risposta per questo? Sto riscontrando lo stesso problema e sto estendendo Activity e non AppCompatActivity poiché la mia app supporta API 21 e versioni successive.
SjDev

15

Penso che l'unica cosa che le persone non stiano chiarendo è che la linea

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

si trova nel tema di base, ovvero AppTheme e non 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" />


Questo era l'unico cambiamento di cui avevo bisogno. Grazie!
PNDA

5

trova il tuo AndroidManifest.xml, quindi aggiungi sotto il codice nella tua applicazione o tema Attività

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

così come:

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

1

Questa è la soluzione che ho fatto.

Nel mio metodo onCreateActionMode di ActionMode.Callback , aggiungo questo:

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

Per me funziona.


1

Ho provato tutti i metodi sopra, ma ancora non funziona. E poi, ho provato il metodo seguente:

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

Qui, ho usato la modalità di azione e il metodo startSupportActionMode della libreria di supporto. Allo stesso tempo ho anche cercato di modificare il tema di una determinata attività. Sicuramente non funziona. Quindi, se davvero non hai scelta migliore, puoi provare questo.

Di recente, ho scoperto di aver utilizzato la cornice colorata per abilitare più temi della mia app, questo cambierà il tema nel codice. Quando ho provato a modificare lo stile in questo framework, funziona.

Spero funzioni.


Questa è l'unica cosa che ha funzionato per me. Molte grazie.
Rachit

1

Quindi, dopo giorni passati attraverso questo thread, finalmente l'ho fatto funzionare. Vorrei riassumere quello che ho fatto.

Nota: questa è la soluzione che utilizza a Toolbarper sostituire il valore predefinito ActionBarin AppCompatActivity.

  1. Ho aggiunto questa riga al mio AppTheme: dice ad Android che vuoi che la tua modalità di azione si sovrapponga alla barra degli strumenti
<item name="windowActionModeOverlay">true</item>
  1. Usa le importazioni giuste:

Devi usare queste importazioni per lavorare con AppCompatActivity:

import androidx.appcompat.view.ActionMode;
// or
import android.support.v7.view.ActionMode;
  1. Avvia ActionMode sulla tua attività in questo modo:
actionMode = startSupportActionMode(callback);

E non così:

actionMode = startActionMode(callback);

La tua attività crea automaticamente ActionMode sulla barra degli strumenti, perché è impostata come supportActionToolbar. Lo stile gestisce la visualizzazione come overlay.

Grazie a @Kuffs e @Lefty.


0

Se vedi l'albero della vista, puoi scrivere il codice seguente:

 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));
        }
    }
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.