AppCompat-v7 ile Araç Çubuğu ve Bağlamsal Eylem Çubuğu


182

Lollipop ve AppCompat-v7 kütüphanesinde tanıtılan yeni eklenen Araç Çubuğunu kullanarak çalışıyorum. Ben takip Bu kılavuzu Çubuğu fark ettim kurma hakkında o sayfadaki aşağı Araç itecektir (örneğin yapıştırmak / kopya için metni vurgulayarak gibi) bağlamsal İşlem Çubuğu yukarı getirecek sizi bir şeye çağırmak. Neden bahsettiğimi sayfanın altındaki görüntüde görebilirsiniz:

Yani, aslında, böyle ayarladım. İçerme etiketleri ile kullandığım bir xml dosyasında tanımlanan Araç Çubuğu var:

<android.support.v7.widget.Toolbar
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="?attr/colorPrimary"/>

Sonra, benim görüşüme göre somutlaştırıyorum:

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:id="@+id/root"
    tools:context=".MainActivity">

    <include
        layout="@layout/toolbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/> 

    <!-- Rest of view -->

    </LinearLayout>

Kodda, ben böyle kurmak:

    // On Create method of activity:
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

Herkes Bağlamsal Eylem Çubuğu Araç Çubuğu üst üste gelmesi için nasıl yapılacağını biliyor mu?

Araç Çubuğu ve Bağlamsal İşlem Çubuğu


Etkinliğiniz hangi temayı kullanıyor?
alanv

David, sadece bağlantıyı tıkladım ve benim için çalışıyor gibi görünüyor.
ariets

Yanıtlar:


320

Güncelleme:

Çözüm: windowActionModeOverlay özelliğini kullanın . Bunu temanızda ayarlayın:

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

ve eylem modu aşağı itmek yerine eylem çubuğunun üzerinde gösterilir. (En son AppCompat'ı kullanmıyorsanız, mülke "android:" önekini eklemeniz gerekir). Temel olarak AppCompat'a ekranın üstünde bir araç çubuğunuz olduğunu ve ActionMode'u bunun üzerine çizmesi gerektiğini bildirir.


Eski cevap / geçici çözüm:

Ben de aynı problemle karşılaştım. Hangi temayı ayarlarsam yapayım, her zaman ActionBar olarak ayarladığım Araç Çubuğunu aşağı iter. Destek kitaplığıyla birlikte ve olmadan da denedim, ama önemli değildi.

Ne yazık ki ben bunu düzeltmek mümkün değildi, bunun yerine bir geçici çözüm oluşturduk. Benim içinde ActionModeCallback's onCreateActionModeı Eylem çubuğunu gizlemek:

actionBarToolbar.setVisibility(View.GONE);

ve onDestroyActionModetekrar göstereceğim:

actionBarToolbar.setVisibility(View.VISIBLE);

Saklanma / gösterme o kadar hızlı gerçekleşiyor ki test aygıtlarımda fark edilmiyor. Elbette bir dezavantajı var: enter-animasyonu hala çalışıyor olsa da, Araç Çubuğu hemen üzerine geldiğinden bağlamsal eylem çubuğunun çıkış animasyonu kaybolur. Ama daha iyi bir çözümle karşılaşıncaya kadar sanırım bu sorunla karşı karşıya kaldık.


(Etkinliğim aslında Google I / O 2014 uygulama kaynak kodundan alınan, BaseActivityadı verilen bir yöntemi olan özel bir sınıfı genişletiyor , bu yüzden Araç Çubuğunu kolayca alabilirim:getActionBarToolbar()

BaseActivity activity = (BaseActivity) getActivity();
activity.getActionBarToolbar().setVisibility(View.GONE);

G / Ç uygulaması bağlamsal eylem çubuğunu kullanmıyor.)


Evet, bu benim de gelebileceğim tek çözümdü. Ancak, Bağlamsal Eylem Çubuğu'nun sistemden oluştuğu durumlar vardır (örneğin bir WebView veya EditText ile). Onlar için geri arama alamadım. Peki, bunun için nasıl göstermeye / gizlemeye devam edersin? (Yoksa yanılıyor muyum ve aslında, CAB için bunlarla geri aramalar alabilirsiniz)?
ariets

1
Evet, Aleksandar'ın cevabında tarif ettiği gibi TextView.setCustomSelectionActionModeCallback () öğesini kullanabilirsiniz .
Jacob Ras

1
Oh, yorumumu artık güncelleyemiyorum. Küçük ekleme: setCustomSelectionActionModeCallback destek kitaplığındaki ActionModeCallback ile kullanılamaz gibi görünüyor. Ayarlamak için bir VERSION.SDK_INT kontrolü kullanıyorum. Yine de sorunun Petek öncesi cihazlarda da meydana gelip gelmediğini test etmeniz gerekir.
Jacob Ras

@ariets lütfen güncellenmiş cevabımı görün. Bu mülkü tamamen unuttuğum için biraz dökümü hissediyorum, ama en azından şimdi geçici
Jacob Ras

1
Komik En son kullanıyorum ('com.android.support:appcompat-v7:22.0.0') kullanıyorum ama android'i bırakmak zorundayım: çalışması için bir parça ...
Warpzit

16

Etkinliğinizde değil, araç çubuğunuzda başlatın. Faaliyetinizde:

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

ve kullanmalısın

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

Benim için yapar android.support.v7.app.ActionBar
Frank

Bu hatayı alıyorum-> ViewActionMode (android.view.ActionMode.Callback) görünümünde uygulanamaz (android.support.v7.view.ActionMode.Callback)
Faheem

Ah tamam. Benim min sürümü 11 daha küçük değil. Bu yüzden bir android.view.ActionMode kullanabilirsiniz. Bir android.support.v7.widget.Toolbar'da geri arama, android.support.v7.view.ActionMode.Callback'i hiç kullanmadım.
Frank

Xmls menü öğesindeki AppCompatActivity.startSupportActionMode(callback)özelliklerle uyumluluk elde etmek için bahsetmeye değer app:iconTint.
geekley

14

Sadece küçük bir ekleme:

<item name="windowActionModeOverlay">true</item>
çalışmak için faaliyetinizi çağırmadan super.onCreate(savedInstanceState) ÖNCE aramak önemlidir setContentView(R.layout.your_activity). Bu durumda gerçekten bir fark yaratıyor!


11

Benim durumumda, <item name="windowActionModeOverlay">true</item>işe yaramadı, ama bu iş: <item name="android:windowActionModeOverlay">true</item>, androidanahtarıdır.


8
Sen kullanmak <item name="windowActionModeOverlay">true</item>aksi takdirde kullanın AppCompat araç çubuğu ile androidad.
Javier Mendonça

Düzenimde benim için kullanışım yok araç çubuğu ekliyorum, etkinlikte araç çubuğunu başlat ve set desteğini doğru yap lütfen bana yardım et
Harsha

<item name = "windowActionModeOverlay"> true </item> beklendiği gibi çalıştı!
Francois

8

Jacob'un çözümü benim için çalıştı, ancak bağlamsal ActionBar şeffaftı ve Araç Çubuğu onun aracılığıyla görülebilirdi. Bu, aşağıdaki gibi çözülebilir:

<style name="AppTheme.Base" parent="Theme.AppCompat.Light">
    ....
    ....
    <item name="actionModeStyle">@style/CustomActionMode</item>
</style>

<style name="CustomActionMode" parent="@style/Widget.AppCompat.ActionMode">
    <item name="background">@color/primary_material_light</item>
</style>

"AppTheme.Base" teması, Araç Çubuğuna uygulanan tema olmalıdır.

Bağlamsal ActionBar stiliyle ilgili daha fazla bilgi:

malzeme tasarımında appCompat kullanarak Bağlamsal Eylem Çubuğunu Özelleştirme


0

Araç çubuğunu öne getirmek için çok kullanışlı bir yöntem toolbar.bringToFront()


2
View.bringToFront()çok ağır bir işlemdir ve genellikle ne pahasına olursa olsun kaçınılmalıdır.
dominus

Haklısınız, ancak örneğin ekranın yukarıdan aşağıya doğru animasyonu için araç çubuğuyla çakışacaktır. ): Dolayısıyla öncelikle paylaşma herhangi alternatif bir yol yoktur toolbar.If altında canlandırılır için toolbar.bringToFront () kullanmak gerekir
kunal.c

0

Başka bir küçük ekleme: setContentView(R.layout.empty_screen)tüm kullanıcı arayüzünü fragmanlar ( ft.replace(android.R.id.content, fragment)) olarak yüklerseniz , etkinlikte en az boş bir ekran ayarladığınızdan emin olun .

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.