Saya mencoba menggunakan android.view.ActionMode
yang baru android.support.v7.widget.Toolbar
, selain yang tradisional android.app.ActionBar
. Saya bisa menampilkannya dengan:
toolbar.startActionMode(callback);
Masalahnya adalah bahwa yang ActionMode
ditampilkan 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>
Jawaban:
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);
sumber
windowActionModeOverlay
pengaturan bekerja untuk saya.AppCompatActivity
dan menambahkanwindowActionModeOverlay
sudah cukup bagi saya. Saya mencoba menggunakan imporandroid.support.v7.view.ActionMode
tetapi tidak berhasilMultiChoiceModeListener
, jadi saya akhirnya menggunakanandroid.view.ActionMode
. Tahukah Anda jika ada versi dukunganMultiChoiceModeListener
? Terima kasihJangan 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.
sumber
ActionMode.Callback
, saya ingin menerapkanMultiChoiceModeListener
. Masalah dengan menggunakan dukunganActionMode
adalah bahwa tampaknya tidak ada versi dukungan dariMultiChoiceModeListener
.Coba ini di tema Anda:
<item name="windowActionModeOverlay">true</item>
sumber
android:
awalan, dan memasukkannya ke dalam tema aplikasi saya. TheActionMode
menghamparkanActionBar
, tapi aku ingin lebih sayaToolbar
, yang berada di bawahActionBar
.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" />
sumber
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>
sumber
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.
sumber
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.
sumber
Jadi, setelah berhari-hari melewati utas ini, akhirnya saya berhasil. Saya ingin meringkas apa yang saya lakukan.
AppTheme
: Ini memberi tahu android bahwa Anda ingin mode tindakan Anda melapisi toolbar<item name="windowActionModeOverlay">true</item>
Anda harus menggunakan impor ini untuk bekerja dengan
AppCompatActivity
:import androidx.appcompat.view.ActionMode; // or import android.support.v7.view.ActionMode;
Dan tidak seperti itu:
Aktivitas Anda membuat ActionMode pada toolbar secara otomatis, karena ini disetel sebagai supportActionToolbar. Style menangani dsiplaying sebagai overlay.
Terima kasih kepada @Ks dan @Ley.
sumber
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)); } } }
sumber