Android Lollipop CardView'da dalgalanma etkisi


191

Ben android ayarlayarak dokunduğu zaman dalgalanma etkisi görüntülemek için bir CardView almaya çalışıyorum: anlatıldığı gibi etkinlik XML dosyasında Backgound özelliğini burada Android Geliştiricileri sayfasında, ancak çalışmıyor. Hiç animasyon yok, ancak onClick'teki yöntem çağrılır. Ayrıca burada önerildiği gibi bir ripple.xml dosyası oluşturmayı denedim , ancak aynı sonuç.

Etkinliğin XML dosyasında göründüğü şekliyle CardView:

<android.support.v7.widget.CardView
    xmlns:card_view="http://schemas.android.com/apk/res-auto"
    android:layout_width="155dp"
    android:layout_height="230dp"
    android:elevation="4dp"
    android:translationZ="5dp"
    android:clickable="true"
    android:focusable="true"
    android:focusableInTouchMode="true"
    android:onClick="showNotices"
    android:background="?android:attr/selectableItemBackground"
    android:id="@+id/notices_card"
    card_view:cardCornerRadius="2dp">

</android.support.v7.widget.CardView> 

Android geliştirmede nispeten yeniyim, bu yüzden birkaç bariz hata yapmış olabilirim.

Yanıtlar:


593

Aşağıdakilere aşağıdakileri eklemelisiniz CardView:

android:foreground="?android:attr/selectableItemBackground"
android:clickable="true"

8
Dalgalanma efekti ile lolipop üzerinde çalışır, ancak eski platformlarda çalıştırıldığında sadece düz renk verir. Benim için yeterince iyi :)
mach

16
Küçük bir gözlem: Tıklanabilir özelliğin gerekli olmadığını ve hatta bazı şeyleri kırabileceğini belirttim! Tıklanabilir CardViews ile dolu bir GridView vardı ve dinleyici düzgün çalışmıyor. Tıklanabilir etiketi XML'den kaldırdım ve şimdi her şey kusursuz çalışıyor
Joaquin Iurchuk

2
@ tıklanabilir olmadan joaquin, dalgalanmanın sadece merkezden kaynaklanmasına neden olur
frostymarvelous

2
?android:attr/selectableItemBackgroundAPI seviye 11 gerektirir
Pratik Butani

9
Olmadan çalışmak android:clickable="true".
Sean

30

CardView üzerinde dalgalanma efekti vermek için bu iki satır kodunu xml görünümünüze ekleyin.

android:clickable="true"
android:foreground="?android:attr/selectableItemBackground"

Müthiş! foregroundcazibe gibi özel arka plan görünümleri ile çalışır! Güzel!
sud007

24

Cardview üzerinde dalgalanma etkisini elde etmeyi başardım:

<android.support.v7.widget.CardView 
    xmlns:card_view="http://schemas.android.com/apk/res-auto" 
    android:clickable="true" 
    android:foreground="@drawable/custom_bg"/>

ve yukarıdaki kodda görebileceğiniz custom_bg için, hem lolipop (drawable-v21 paketinde) hem de lolipop öncesi (çekilebilir pakette) cihazlar için bir xml dosyası tanımlamanız gerekir. drawable-v21 paketindeki custom_bg için kod:

<ripple 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:color="?android:attr/colorControlHighlight">
<item
    android:id="@android:id/mask"
    android:drawable="@android:color/white"/>
</ripple>

drawable paketindeki custom_bg için kod:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

<item android:state_pressed="true">
    <shape>
        <solid android:color="@color/colorHighlight"></solid>
    </shape>
</item>
<item>
    <shape>
        <solid android:color="@color/navigation_drawer_background"></solid>
    </shape>
</item>
</selector>

lolipop öncesi cihazlarda sağlam bir tıklama efektine sahip olacaksınız ve lolipop cihazlarında kart görünümü üzerinde bir dalgalanma etkisi olacak.


1
Merhaba, CardView'ın ön planına seçici (veya dalgalanma) uygulayarak fark ediyorum, CardView'ın kendisindeki çocukları engelleyecek - stackoverflow.com/questions/33763403/… Benimle aynı probla karşılaştığını biliyor muyum? Yoksa hiçbir şeyi kaçırır mıyım? Teşekkürler.
Cheok Yan Cheng

@CheokYanCheng: Seninki gibi herhangi bir sorunla karşı karşıya değilim ama kişisel deneyimlerimden cardView ön lolipop için bazı hatalar olduğunu söyleyebilirim. Lolipop öncesi cardview: elevation özelliğini kullanmaktan kaçının. Yukarıdaki benim ve diğer upvotes için iyi çalışıyor.
Rahul Ahuja

Bilebilir miyim, colorHighlight & navigation_drawer_background'nızın değeri nedir? Şeffaflığınız olmadan kendi tanımladığınız rengi kullandıysanız, kartınızın çocuklarını hala görebiliyor musunuz?
Cheok Yan Cheng

@CheokYanCheng: değerler şu şekildedir, <color name = "navigation_drawer_background"> ​​# FFFFFF </color> <color name = "colorHighlight"> # FF8A65 </color>
Rahul Ahuja

Davam için çalışmıyorum. Seçicinizi ön plan olarak kullanıyorum. Beklendiği gibi, kart görünümü ön planı olarak kullanılan düz beyaz renk (navigation_drawer_background), tüm çocukların görünürlüğünü engelleyecektir - i.imgur.com/CleYh5B.png Seçiciyi ön plan olarak uygulamadan bu şekilde görünecektir - i.imgur. com / ZXk5Aoq.png
Cheok Yan Cheng

14

Dalgalanma efekti, kullandığınız appcompat destek kütüphanesinde atlanmıştır. Dalgalanmayı görmek istiyorsanız Android L sürümünü kullanın ve bir Android L cihazında test edin. AppCompat v7 sitesi için:

"Lolipop öncesi neden dalgalanma yok? RippleDrawable'ın sorunsuz çalışmasına izin veren birçok şey Android 5.0'ın yeni RenderThread'i. Android'in önceki sürümlerindeki performansı optimize etmek için şimdilik RippleDrawable'ı dışarıda bıraktık."

Bu bağlantıyı kontrol edin burada daha fazla bilgi için


Öyle olur. Teşekkürler!
AkraticCritic

39
Peki Android Lollipop için cardView üzerinde dalgalanma efekti nasıl koyardınız?
android geliştirici

Bu yüzden appcompat kullanarak veya tüm yeni efektlere sahip, android core sınıflarını kullanarak ama kendimi API 21 ile sınırlandıran geriye dönük uyumluluk arasında karar vermeliyim?
Urs Reupke

21+ için 2 ve diğeri <21 için 2 APK yapabilirsiniz. Ya da 21+ supportActionbar vb. Kullanmayacağı için kodu bölebilirsiniz.
Mathijs Segers

1
Bu yüzden "saf" Android L uygulamaları yazmak şu an için geçerli değil. Temmuz 2015 itibariyle Android kullanıcı tabanının% 12'sini hedefleyeceksiniz.
Glenn Bech

10

Çalışmakta olduğunuz uygulama minSdkVersionseviye 9 ise şunları kullanabilirsiniz:

android:foreground="?selectableItemBackground"
android:clickable="true"

Bunun yerine, 11. seviyeden başlayarak şunları kullanırsınız:

android:foreground="?android:attr/selectableItemBackground"
android:clickable="true"

Belgelerden:

clickable - Bu görünümün tıklama etkinliklerine tepki verip vermediğini tanımlar. "True" veya "false" gibi bir boole değeri olmalıdır.

foreground - İçeriğin üzerine çizilecek çekilebilir öğeyi tanımlar. Bu kaplama olarak kullanılabilir. Yerçekimi dolmaya ayarlanmışsa, ön plan çekilebilir içeriğin dolgusuna katılır.


Android: foreground = "? Android: attr / selectableItemBackground" AndroidX uyumluluğu için çalıştı, teşekkürler!
dianakarenms

6

Benim için ekleme foregroundiçin CardViewvermedi işi (nedeni bilinmiyor: /)

Aynı şeyi çocuk düzenine eklemek hile yaptı.

KODU:

<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:card_view="http://schemas.android.com/apk/res-auto"
    android:id="@+id/card_view"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:focusable="true"
    android:clickable="true"
    card_view:cardCornerRadius="@dimen/card_corner_radius"
    card_view:cardUseCompatPadding="true">

    <LinearLayout
        android:id="@+id/card_item"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:foreground="?android:attr/selectableItemBackground"
        android:padding="@dimen/card_padding">

    </LinearLayout>
</android.support.v7.widget.CardView>

2
Çünkü çocuk olayı keser, eğer kart görünümüne dolgu eklemek gibi bir şey denerseniz (20dp gibi bir şey) ve dolgunun olacağı kısmı tıklarsanız, çocuk olmadan bile dalgalanma etkisini göreceksiniz. ön plan nitelik seti
Cruces

1
Bu, yeni Material Components'ı kullanarak da benim için çalıştı: com.google.android.material.card.MaterialCardView. Yüksekliği ayarlamak için kart görünümü için bir yükseklik stateListAnimator ve tıklanabilir nitelik olmadan ön planda seçilebilir öğe arka plan ile iç kısıtlama düzeni uygulanan dalgalanma vardı.
Patty P

Şimdi hatırlamıyorum, ancak çocuk görüntülemelerini tıklama etkinliğine tepki vermeyecek şekilde ayarlamanın bir yolu var
Birisi

3

Bu iki kod gibi düğme, Lineer Layout veya CardView gibi herhangi bir görünüm için bir cazibe gibi ekleyin Sadece bu iki satırı koyun ve büyüyü görün ...

android:foreground="?android:attr/selectableItemBackground"
android:clickable="true"

2

CardView'da bağdaştırıcı öğesinin tüm bileşenlerini içeren RelativeLayout veya LinearLayout gibi bir kök düzen varsa, bu kök düzeninde arka plan niteliğini ayarlamanız gerekir. sevmek:

<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:card_view="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="122dp"
android:layout_marginBottom="6dp"
android:layout_marginLeft="6dp"
android:layout_marginRight="6dp"
card_view:cardCornerRadius="4dp">

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/touch_bg"/>
</android.support.v7.widget.CardView>

2

Android Cardviewkontrolü için dalgalanma olayı :

<android.support.v7.widget.CardView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:foreground="?android:attr/selectableItemBackground"
    android:clickable="true"
    android:layout_marginBottom="4dp"
    android:layout_marginTop="4dp" />

1

AppCompat'tan memnun değildim, bu yüzden kendi CardView ve backported dalgalarımı yazdım. Burada Gingerbread ile Galaxy S üzerinde çalışıyor, bu yüzden kesinlikle mümkün.

Galaxy S'de Ripple Demosu

Daha fazla ayrıntı için kaynak kodunu kontrol edin .


bağlantı koptu
temirbek

1

Xml'nize aşağıdakileri ekleyin:

android:clickable="true"
android:focusable="true"
android:background="?android:attr/selectableItemBackground"

Ve adaptörünüze ekleyin (durumunuz buysa)

    override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            val attrs = intArrayOf(R.attr.selectableItemBackground)
            val typedArray = holder.itemView.context.obtainStyledAttributes(attrs)
            val selectableItemBackground = typedArray.getResourceId(0, 0)
            typedArray.recycle()

            holder.itemView.isClickable = true
            holder.itemView.isFocusable = true
            holder.itemView.foreground = holder.itemView.context.getDrawable(selectableItemBackground)
        }
    }

0

Bir RecyclerView'da gösterilen programlı olarak oluşturulmuş bir CardView (veya benim durumumda CardView'ı genişleten özel görünüm) üzerinde çalışmayan dalgalanma efekti sorununa çözüm arayanlar için, aşağıdakiler benim için çalıştı. Temel olarak XML düzen dosyasında diğer yanıtlarda belirtilen XML özniteliklerini bildirici olarak bildirmek, programlı olarak oluşturulan bir CardView veya özel bir düzenden oluşturulan bir kök için (kök görünüm CardView veya birleştirme öğesi kullanılsa bile) işe yaramaz gibi görünür, programlı olarak şu şekilde ayarlanmalıdırlar:

private class MadeUpCardViewHolder extends RecyclerView.ViewHolder {
    private MadeUpCardView cardView;

    public MadeUpCardViewHolder(View v){
        super(v);

        this.cardView = (MadeUpCardView)v;

        // Declaring in XML Layout doesn't seem to work in RecyclerViews
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            int[] attrs = new int[]{R.attr.selectableItemBackground};
            TypedArray typedArray = context.obtainStyledAttributes(attrs);
            int selectableItemBackground = typedArray.getResourceId(0, 0);
            typedArray.recycle();

            this.cardView.setForeground(context.getDrawable(selectableItemBackground));
            this.cardView.setClickable(true);
        }
    }
}

Nerede bu cevap için MadeupCardView extends CardViewKudos parçası.TypedArray


0
  android:foreground="?android:attr/selectableItemBackgroundBorderless"
   android:clickable="true"
   android:focusable="true"

Sadece api 21 çalışıyor ve bunu kullan bu liste satır kartı görünümünü kullanmıyor


0

Bunun yerine Material Cardview kullanın, Cardview'i genişletir ve varsayılan tıklanabilir efekt dahil olmak üzere birçok yeni özellik sunar:

<com.google.android.material.card.MaterialCardView>

...

</com.google.android.material.card.MaterialCardView>

Bağımlılık

implementation 'com.google.android.material:material:1.0.0'
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.