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>

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

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.


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>

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" />


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>

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.


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.


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.


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));
        }
    }
}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.