Araç Çubuğu üzerinden ActionMode'u görüntüle


88

Geleneksel olana ek olarak android.view.ActionModeyenisiyle kullanmaya çalışıyorumandroid.support.v7.widget.Toolbarandroid.app.ActionBar . Bunu şununla görüntüleyebiliyorum:

toolbar.startActionMode(callback);

Sorun şu ki ActionMode üzerinde görüntülenir ActionBarüzerinde değil, Toolbar. Bunu değiştirmenin bir yolu var mı?

Temamda aşağıdakileri belirlemeye çalıştım, ancak hiçbir şeyi değiştirmiyor gibi görünüyor:

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

1
ActionMode'un ActionBar'ın bir parçası olduğunu düşünüyorum ve konumunu değiştiremezsiniz
SpyZip

Bu çok kötü. Cevap için teşekkürler
Gaëtan

1
Araç çubuğunu eylem çubuğu olarak ayarladınız mı?
Nikola Despotoski

1
hala aynı problem var, bu konuda herhangi bir güncelleme var mı? Aşağıda gösterilen içerik için başlık ve seçenekler menüsü olarak aynı durumu, klasik eylem çubuğuyla bir araç çubuğunu ve aşağıda bir araç çubuğunu aldım. Bu sorunla karşı karşıya ve eylem modunu aşağı taşıyamıyor.
cV2

Yanıtlar:


83

Kullandığınız için Toolbar, ayrıca AppCompatActivityyerleşik ActionBarolanı Toolbarkullandığınızı ve yerleşik olanı özel kullanımınızla değiştirdiğinizi varsayıyorum .setSupportActionBar(toolbar);

Öncelikle doğru ad alanını içe aktardığınızdan emin olun:

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

ve yok

import android.view.ActionMode;

sonra kullan

_actionMode = startSupportActionMode(this);

ve yok

_actionMode = startActionMode(this);

35
Bu artı windowActionModeOverlayayar benim için çalıştı.
Jimeux

4
Şu anda kullanıyorum AppCompatActivityve eklemek windowActionModeOverlay benim için yeterliydi. İçe aktarmayı kullanmayı denedim android.support.v7.view.ActionModeama işe yaramadı MultiChoiceModeListener, bu yüzden android.view.ActionModeonun yerine kullanmaya başladım . Bir destek sürümü olup olmadığını biliyor musunuz MultiChoiceModeListener? Teşekkürler
Axel

MultiChoiceModeListener'ın destek sürümü var mı?
galaxigirl

@galaxigirl, var gibi görünmüyor. Adaptörünüzdeki tıklama olaylarını işlemeniz ve tutucunuzu görüntülemeniz gerekir
peterchaula

68

Etkinliğinizden değil, araç çubuğunuzdan başlatın. Aktivitenizde:

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

ve kullanmalısın

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

Andre tarafından belirtildiği gibi temanızda.


1
Bu benim için çalıştı, çünkü benim de özel bir ihtiyacım vardı. Uygulamak yerine uygulamak ActionMode.Callbackistedim MultiChoiceModeListener. Desteği kullanmayla ilgili sorun, .NET ActionModeFramework'ün destek sürümünün görünmemesidir MultiChoiceModeListener.
jwir3

44

Bunu temanızda deneyin:

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

Sorumda da belirtildiği gibi, bunu zaten başarılı olmadan denedim. Ama teşekkür ederim!
Gaëtan

Üzgünüm, bunu zaten denediğini bilmiyordum. İşe yaramadığına emin misin? Benim için çalışıyor.
André Restivo

Aynı sorunu yaşadım ve bu onu düzeltir. Teşekkürler!
Marta Rodriguez

2
android:Önek ile ve olmadan denedim ve uygulama temama koydum. ActionModeBindirmeleri ActionBar, ama benim üzerinde istediğiniz Toolbaraltında olan ActionBar.
Gaëtan

@ Gaëtan Bunun için bir cevap aldınız mı? Aynı sorunu yaşıyorum ve uygulamam API 21 ve üstünü desteklediğinden AppCompatActivity yerine Activity'i genişletiyorum.
SjDev

15

Sanırım insanların netleştirmediği tek şey, çizgi

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

AppTheme.NoActionBar yerine AppTheme gibi Base temasına yerleştirilir

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


İhtiyacım olan tek değişiklik buydu. Teşekkürler!
PNDA

5

AndroidManifest.xml dosyanızı bulun, ardından uygulamanıza veya Etkinlik temanıza aşağıdaki kodu ekleyin

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

şöyle:

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

1

Yaptığım çözüm bu.

Benim içinde onCreateActionMode yöntemine ActionMode.Callback , bunu ekleyin:

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

Benim için çalışıyor.


1

Yukarıdaki tüm yöntemleri denedim, ancak yine de çalışmıyor. Ve sonra aşağıdaki yöntemi denedim:

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

Burada eylem modu ve destek kitaplığının startSupportActionMode yöntemini kullandım. Aynı zamanda, verilen aktivitenin temasını da değiştirmeye çalıştım. Elbette işe yaramıyor. Yani, gerçekten daha iyi bir seçeneğiniz yoksa, bunu deneyebilirsiniz.

Kısa bir süre önce, uygulamamın birden çok temasını etkinleştirmek için Renkli çerçeveyi kullandığımı fark ettim, bu koddaki temayı değiştirecek. Bu çerçevede stili değiştirmeye çalıştığımda işe yarıyor.

Umarım çalışır.


Benim için işe yarayan tek şey bu. Çok teşekkürler.
Rachit

1

Böylece, bu iş parçacığı üzerinden geçen günlerin ardından, sonunda onu çalıştırdım. Ne yaptığımı özetlemek isterim.

Not: Bu, içinde Toolbarvarsayılanı değiştirmek için a kullanan çözümdür .ActionBarAppCompatActivity

  1. Bu satırı şu satırıma ekledim AppTheme: Android'e eylem modunuzun araç çubuğunu kaplamasını istediğinizi söyler
<item name="windowActionModeOverlay">true</item>
  1. Doğru ithalatı kullanın:

Aşağıdakilerle çalışmak için bu ithalatı kullanmanız gerekir AppCompatActivity:

import androidx.appcompat.view.ActionMode;
// or
import android.support.v7.view.ActionMode;
  1. ActionMode'u Aktivitenizde şu şekilde başlatın:
actionMode = startSupportActionMode(callback);

Ve öyle değil:

actionMode = startActionMode(callback);

Aktiviteniz, supportActionToolbar olarak ayarlandığından, araç çubuğunda ActionMode'u otomatik olarak oluşturur. Stil, görüntülemeyi kaplama olarak ele alır.

@Kuffs ve @Lefty'ye teşekkürler.


0

Görünüm ağacını görürseniz, aşağıdaki kodu yazabilirsiniz:

 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));
        }
    }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.