Tampilkan ActionMode di atas Toolbar

88

Saya mencoba menggunakan android.view.ActionModeyang baru android.support.v7.widget.Toolbar, selain yang tradisional android.app.ActionBar. Saya bisa menampilkannya dengan:

toolbar.startActionMode(callback);

Masalahnya adalah bahwa yang ActionModeditampilkan di atas ActionBar, dan bukan di atas Toolbar. Apakah ada cara untuk mengubahnya?

Saya mencoba untuk mengatur yang berikut ini dalam tema saya, tetapi sepertinya tidak mengubah apa pun:

<item name="windowActionModeOverlay">true</item>
Gaëtan
sumber
1
Saya pikir ActionMode adalah bagian dari ActionBar dan Anda tidak dapat mengubah posisinya
SpyZip
Itu sangat buruk. Terima kasih atas jawabannya
Gaëtan
1
Sudahkah Anda menyetel bilah alat sebagai bilah tindakan?
Nikola Despotoski
1
masih memiliki masalah yang sama, ada pembaruan tentang ini? Saya mendapat situasi yang sama, satu toolbar sebagai actionbar klasik, dan satu toolbar di bawah, sebagai header dan menu pilihan untuk konten yang ditampilkan di bawah. menghadapi masalah ini, dan tidak dapat memindahkan mode tindakan ke bawah.
cV2

Jawaban:

83

Karena Anda menggunakan Toolbar, saya juga menganggap Anda menggunakan AppCompatActivitydan telah mengganti bawaan ActionBardengan Toolbarpenggunaan kustom AndasetSupportActionBar(toolbar);

Pertama-tama pastikan Anda mengimpor namespace yang benar:

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

dan tidak

import android.view.ActionMode;

lalu gunakan

_actionMode = startSupportActionMode(this);

dan tidak

_actionMode = startActionMode(this);
Kuffs
sumber
35
Ini ditambah windowActionModeOverlaypengaturan bekerja untuk saya.
Jimeux
4
Saat ini saya menggunakan AppCompatActivitydan menambahkan windowActionModeOverlay sudah cukup bagi saya. Saya mencoba menggunakan impor android.support.v7.view.ActionModetetapi tidak berhasil MultiChoiceModeListener, jadi saya akhirnya menggunakan android.view.ActionMode. Tahukah Anda jika ada versi dukungan MultiChoiceModeListener? Terima kasih
Axel
Apakah ada versi dukungan MultiChoiceModeListener?
galaxigirl
@galaxigirl, sepertinya tidak ada. Anda harus menangani peristiwa klik di adaptor Anda dan melihat holderr
peterchaula
68

Jangan memulainya pada aktivitas Anda, tetapi pada toolbar Anda. Dalam aktivitas Anda:

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

dan Anda harus menggunakan

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

dalam tema Anda seperti yang dikemukakan oleh Andre.

jujur
sumber
1
Ini berhasil untuk saya, karena saya juga memiliki persyaratan khusus. Alih-alih menerapkan ActionMode.Callback, saya ingin menerapkan MultiChoiceModeListener. Masalah dengan menggunakan dukungan ActionModeadalah bahwa tampaknya tidak ada versi dukungan dari MultiChoiceModeListener.
jwir3
44

Coba ini di tema Anda:

<item name="windowActionModeOverlay">true</item>
André Restivo
sumber
Seperti yang dinyatakan dalam pertanyaan saya, saya sudah mencoba ini tanpa hasil. Tapi terima kasih!
Gaëtan
Maaf, saya tidak menyadari Anda sudah mencobanya. Apakah Anda yakin itu tidak berhasil? Ini bekerja untuk saya.
André Restivo
Saya memiliki masalah yang sama dan ini memperbaikinya. Terima kasih!
Marta Rodriguez
2
Saya mencoba dengan dan tanpa android:awalan, dan memasukkannya ke dalam tema aplikasi saya. The ActionModemenghamparkan ActionBar, tapi aku ingin lebih saya Toolbar, yang berada di bawah ActionBar.
Gaëtan
@ Gaëtan Apakah Anda mendapatkan jawaban untuk ini? Saya mengalami masalah yang sama dan saya memperluas Aktivitas dan bukan AppCompatActivity karena aplikasi saya mendukung API 21 ke atas.
SjDev
15

Saya pikir satu hal yang orang tidak jelaskan adalah garisnya

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

ditempatkan di tema Base yaitu AppTheme dan bukan 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" />

Orang kidal
sumber
Ini adalah satu-satunya perubahan yang saya butuhkan. Terima kasih!
PNDA
5

temukan AndroidManifest.xml Anda, selanjutnya tambahkan kode di bawah ini ke dalam aplikasi atau tema Aktivitas Anda

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

jadi seperti:

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

Ini adalah solusi yang saya buat.

Dalam metode onCreateActionMode saya dari ActionMode.Callback , saya menambahkan ini:

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

Ini bekerja untuk saya.

Avery
sumber
1

Saya telah mencoba semua metode di atas, tetapi masih tidak berhasil. Dan kemudian, saya mencoba metode di bawah ini:

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

Di sini, saya menggunakan mode tindakan dan metode startSupportActionMode dari pustaka dukungan. Pada saat yang sama saya juga mencoba mengubah tema kegiatan yang diberikan. Tentunya, itu tidak berhasil. Jadi, jika Anda benar-benar tidak memiliki pilihan yang lebih baik, Anda dapat mencoba yang ini.

Baru-baru ini, saya menemukan bahwa saya menggunakan bingkai Warna-warni untuk mengaktifkan beberapa tema aplikasi saya, ini akan mengubah tema dalam kode. Ketika saya mencoba mengubah gaya dalam kerangka ini, itu berhasil.

Semoga berhasil.

Jeff Wong
sumber
Ini adalah satu-satunya hal yang berhasil bagi saya. Terima kasih banyak.
Rachit
1

Jadi, setelah berhari-hari melewati utas ini, akhirnya saya berhasil. Saya ingin meringkas apa yang saya lakukan.

Catatan: Ini adalah solusi menggunakan a Toolbaruntuk mengganti default ActionBardi AppCompatActivity.

  1. Saya menambahkan baris ini ke my AppTheme: Ini memberi tahu android bahwa Anda ingin mode tindakan Anda melapisi toolbar
<item name="windowActionModeOverlay">true</item>
  1. Gunakan impor yang tepat:

Anda harus menggunakan impor ini untuk bekerja dengan AppCompatActivity:

import androidx.appcompat.view.ActionMode;
// or
import android.support.v7.view.ActionMode;
  1. Mulai ActionMode pada Aktivitas Anda seperti ini:
actionMode = startSupportActionMode(callback);

Dan tidak seperti itu:

actionMode = startActionMode(callback);

Aktivitas Anda membuat ActionMode pada toolbar secara otomatis, karena ini disetel sebagai supportActionToolbar. Style menangani dsiplaying sebagai overlay.

Terima kasih kepada @Ks dan @Ley.

Leon Latsch
sumber
0

Jika Anda melihat pohon tampilan, Anda dapat menulis kode di bawah ini:

 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));
        }
    }
}
pengguna2416658
sumber