Cardslib 的 CardView OnCardClickListener 的 onClick 方法未被调用

Cardslib's CardView OnCardClickListener's onClick method not being called

我在我的应用程序中使用这个库:Card Library : Guide 并创建了一张卡片,如示例所示。 现在我需要处理一个点击事件,但在实例化以下内容时收到错误消息:new Card.OnCardClickListener,即 OnCardClickListener is abstract: cannot be instantiated。 在我的 Activity 我有这个代码:

    Card card = new Card(getBaseContext());//getContext()
    CardHeader header = new CardHeader(getBaseContext());
    card.addCardHeader(header);
    final CardViewNative cardView = (CardViewNative) findViewById(R.id.carddemo);
    cardView.setCard(card);

    cardView.setClickable(true);
    cardView.setOnClickListener(new Card.OnCardClickListener()); //error here

怎么了?如何将我的卡片设置为可点击,然后处理 click/touch 事件?

编辑

如果我这样使用它:

cardView.setOnClickListener(new Card.OnCardClickListener(){//error here
        @Override
        public void onClick(Card card, View view) {
            // This will execute when the the card is clicked
        }
    });

它说 cannot resolve method setOnClickListener(it.gmariotti.cardslib.library.internal.Card.OnCardClickListener)

EDIT1

你们说的对,我把setOnClickListener设置在卡本身上,就没有报错了, 但点击卡片时它仍然不执行任何操作。这是新代码:

     //Create a Card
    Card card = new Card(this);//getContext()

    //Create a CardHeader
    CardHeader header = new CardHeader(this);
    //....
    //Add Header to card
    card.addCardHeader(header);

    //Set card in the cardView
    CardViewNative cardView = (CardViewNative) this.findViewById(R.id.carddemo);
    cardView.setCard(card);

    card.setClickable(true);
    card.setOnClickListener(new Card.OnCardClickListener(){
        @Override
        public void onClick(Card card, View view) {
            // This will execute when the the card is clicked
            Toast.makeText(CardMariotti.this,"Clickable card", Toast.LENGTH_LONG).show();
        }
    });

我执行了调试,但从未调用 onClick 方法。怎么会?

Card.OnCardClickListener 是一个接口。您必须创建 class 来定义如何使用界面中的函数。试试这个:

card.setOnClickListener(new Card.OnCardClickListener() {
    @Override
    public void onClick(Card card, View view) {
        // This will execute when the the card is clicked
    }
});

答案来源:https://github.com/gabrielemariotti/cardslib/blob/master/doc/CARD.md#clickable-card

关于Java个接口的信息:Java Interfaces?

编辑

此外,从卡片包含的 RelativeLayout 中删除 android:clickable="true"。它正在为自己窃取点击。

您必须在 card(模型)而不是 CardView(视图)上定义 clickListener

//Set onClick listener
card.setOnClickListener(new Card.OnCardClickListener() {
            @Override
            public void onClick(Card card, View view) {
                Toast.makeText(getActivity(),"Clickable card", Toast.LENGTH_LONG).show();
            }
        });

同时你应该使用:

   //it is not necessary if you define a ClickListener on the card
   card.setClickable(true);  

顺便说一句,你也应该在 Activity:

中使用类似的东西
Card card = new Card(this);

我找到了错误,但我不知道如何处理。 它位于包含卡片 cardslib_item_card.xml 的布局中。如果我删除我添加的所有内容并保留它:

<it.gmariotti.cardslib.library.view.CardViewNative     xmlns:card_view="http://schemas.android.com/apk/res-auto"
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:card="http://schemas.android.com/apk/res-auto"
    card:card_layout_resourceID="@layout/native_card_layout"
    style="@style/native_recyclerview_card.base"
    card_view:cardCornerRadius="4dp"
    android:id="@+id/carddemo"
    android:layout_marginTop="12dp"
    android:layout_width="match_parent" android:layout_height="wrap_content"
    android:layout_margin="5dp"
    android:layout_marginLeft="12dp" android:layout_marginRight="12dp">

然后卡片被点击,但如果尝试对其进行个性化设置,例如添加相对布局,如下所示:

<it.gmariotti.cardslib.library.view.CardViewNative     
    xmlns:card_view="http://schemas.android.com/apk/res-auto"
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:card="http://schemas.android.com/apk/res-auto"
    card:card_layout_resourceID="@layout/native_card_layout"
    style="@style/native_recyclerview_card.base"
    card_view:cardCornerRadius="4dp"
    android:id="@+id/carddemo"
    android:layout_marginTop="12dp"
    android:layout_width="match_parent" android:layout_height="wrap_content"
    android:layout_margin="5dp"
    android:layout_marginLeft="12dp" android:layout_marginRight="12dp">

    <RelativeLayout android:id="@+id/cardlayout"
        android:layout_width="match_parent" android:layout_height="match_parent"
        android:background="?android:selectableItemBackground"              
        android:clickable="true">
    <!-- layout containing 3 TextViews -->
    </RelativeLayout>
</it.gmariotti.cardslib.library.view.CardViewNative>

然后卡片就不会再被点击了。 更准确地说,它有时会被点击,就好像 RelativeLayout 覆盖了整张卡片,当我找到它不在的地方时,它就会检测到我的手指。如果我只添加一张空卡就可以了,但是我应该如何自定义它呢?

这就像有两个视图在彼此之上